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
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();
|