You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
6.3 KiB
JavaScript

var body_size = 15;
var text_size = 10000;
// https://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata
function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to a typed array
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {type:mimeString});
}
// Send quote text to submission form
// @param event A ClickEvent object
// @return none
function quote_post(event) {
var comment = document.getElementById("submit_comment");
comment.value += ">>" + event.target.text + "\n";
comment.focus();
}
// Send quote text to submission from when coming from board index
// @return none
function quote_thread() {
var hash = window.location.hash;
if (hash[1] === "q") {
quote_post({
target: {
text: hash.substring(2)
}
});
}
}
// Restrict the size of the comment block
// @return none
function restrict_comment_size() {
var comment = document.getElementById("submit_comment");
if (comment.value.length >= text_size) {
comment.value = comment.value.slice(0, text_size);
}
}
// Cancel form submission if input is invalid
// @return valid
function validate_input() {
var file_input = document.getElementById("submit_file");
if (window.FileReader && file_input.files && file_input.files[0]) {
file = file_input.files[0];
if (file.size / 1024 / 1024 > body_size) {
alert("File size cannot exceed " + body_size + " MB.");
return false;
}
}
}
// Toggle post menu visibility
// @return none
function toggle_menu() {
var child = this.parentNode.children[1];
if (child.style.display === "block") {
child.style.display = "none";
} else {
child.style.display = "block";
}
}
// Add click events to all reply links
// @return none
function add_anchor_listeners() {
var elements = document.getElementsByClassName("link_reply");
for (var i=0; i < elements.length; i++) {
elements[i].onclick = quote_post;
}
}
// Add change events to various form elements
// @return none
function add_change_listeners() {
var elements = document.getElementsByClassName("change_submit");
for (i=0; i < elements.length; i++) {
var element = elements[i];
element.onchange = function(event) {
event.target.form.submit();
};
}
var elements = document.getElementsByClassName("change_delete");
for (i=0; i < elements.length; i++) {
var element = elements[i];
element.onchange = function(event) {
if (window.confirm("Are you sure you want to do this?")) {
event.target.form.submit();
}
};
}
}
// Add click events to all menu buttons
// @return none
function add_menu_listeners() {
var buttons = document.getElementsByClassName("post_menu");
for (i=0; i < buttons.length; i++) {
var button = buttons[i];
button.children[0].onclick = toggle_menu;
}
}
// Add events to various user inputs
// @return none
function add_input_constraints() {
var comment = document.getElementById("submit_comment");
if (comment) {
comment.onkeydown = restrict_comment_size;
comment.onkeyup = restrict_comment_size;
}
var form = document.getElementById("submit_form");
if (form) {
form.onsubmit = validate_input;
}
}
// Open a Tegaki canvas and add an image to it
// @param event A ClickEvent object
// @param path Path to image (optional)
function remix(event, path) {
var file = document.getElementById("draw");
var clear = document.getElementById("tegaki_clear");
// get image
var image = new Image();
image.src = path ? path : this.dataset.path;
image.onload = function() {
Tegaki.open({
onDone: function() {
var dataURL = Tegaki.flatten().toDataURL('image/png');
//var blob = dataURItoBlob(dataURL);
file.value = dataURL;//blob;
clear.disabled = false;
},
onCancel: function() {},
width: image.width,
height: image.height
});
// Force some data into Tegaki
Tegaki.layers[0].ctx.drawImage(image, 0, 0);
Tegaki.addLayer();
Tegaki.setActiveLayer(Tegaki.layers.length);
}
}
// Add ClickEvent listeners to Tegaki buttons
// @return none
function prepare_tegaki() {
var file = document.getElementById("draw");
var width = document.getElementById("tegaki_width");
var height = document.getElementById("tegaki_height");
var draw = document.getElementById("tegaki_draw");
var clear = document.getElementById("tegaki_clear");
// Standard draw button
if (draw) {
draw.onclick = function() {
Tegaki.open({
onDone: function() {
var dataURL = Tegaki.flatten().toDataURL('image/png');
//var blob = dataURItoBlob(dataURL);
file.value = dataURL;//blob;
clear.disabled = false;
},
onCancel: function() {},
width: width.value > 2560 ? 2560 : width.value,
height: height.value > 2560 ? 2560 : height.value
});
};
}
// Standard clear button
if (clear) {
clear.onclick = function() {
Tegaki.destroy();
file.value = null;
clear.disabled = true;
};
}
// Remix buttons
var buttons = document.getElementsByClassName("remix");
for (i=0; i < buttons.length; i++) {
var button = buttons[i];
button.onclick = remix;
}
// Come from board, auto-remix
var hash = window.location.hash;
if (hash[1] === "r") {
var button = document.getElementById(hash.slice(1));
remix(null, button.dataset.path);
}
}
// Check if document has loaded yet
// @return none
function ready() {
if (document.readyState != "loading") {
quote_thread();
add_anchor_listeners();
add_change_listeners()
add_menu_listeners();
add_input_constraints();
prepare_tegaki();
} else {
document.addEventListener("DOMContentLoaded", quote_thread);
document.addEventListener("DOMContentLoaded", add_anchor_listeners);
document.addEventListener("DOMContentLoaded", add_change_listeners);
document.addEventListener("DOMContentLoaded", add_menu_listeners);
document.addEventListener("DOMContentLoaded", add_input_constraints);
document.addEventListener("DOMContentLoaded", prepare_tegaki);
}
}
ready();