var $imgur_window; function show_imgur_uploader(blob){ if($imgur_window){ $imgur_window.close(); } $imgur_window = $FormWindow().title("Upload To Imgur").addClass("dialogue-window"); var $preview_image_area = $(E("div")).appendTo($imgur_window.$main);//.html(""); var $imgur_url_area = $(E("div")).appendTo($imgur_window.$main); var $imgur_status = $(E("div")).appendTo($imgur_window.$main); // TODO: maybe make this preview small but zoomable to full size? // (starting small (max-width: 100%) and toggling to either scrollable or fullscreen) // it should be clear that it's not going to upload a downsized version of your image var $preview_image = $(E("img")).appendTo($preview_image_area); $preview_image.attr({src: URL.createObjectURL(blob)}); // $preview_image.css({maxWidth: "100%", maxHeight: "400px"}); $preview_image_area.css({ maxWidth: "90vw", maxHeight: "70vh", overflow: "auto", marginBottom: "0.5em", }); $preview_image.on("load", function(){ $imgur_window.css({width: "auto"}); $imgur_window.center(); }); var $upload_button = $imgur_window.$Button("Upload", function(){ $preview_image_area.remove(); $upload_button.remove(); $cancel_button.remove(); // TODO: allow canceling upload request $imgur_window.width(300); $imgur_window.center(); var $progress = $(E("progress")).appendTo($imgur_window.$main); var $progress_percent = $(E("span")).appendTo($imgur_window.$main).css({ width: "2.3em", display: "inline-block", textAlign: "center", }); var parseImgurResponseJSON = function(responseJSON){ try { var response = JSON.parse(responseJSON); } catch(error) { $imgur_status.text("Received an invalid JSON response from Imgur: "); // .append($(E("pre")).text(responseJSON)); // show_error_message("Received an invalid JSON response from Imgur: ", responseJSON); // show_error_message("Received an invalid JSON response from Imgur: ", responseJSON, but also error); // $imgur_window.close(); // TODO: DRY, including with show_error_message $(E("pre")) .appendTo($imgur_status) .text(responseJSON) .css({ background: "white", color: "#333", fontFamily: "monospace", width: "500px", overflow: "auto", }); $(E("pre")) .appendTo($imgur_status) .text(error.toString()) .css({ background: "white", color: "#333", fontFamily: "monospace", width: "500px", overflow: "auto", }); $imgur_window.css({width: "auto"}); $imgur_window.center(); } return response; }; // make an HTTP request to the Imgur image upload API var req = new XMLHttpRequest(); if(req.upload){ req.upload.addEventListener('progress', function(event){ if(event.lengthComputable){ var progress_value = event.loaded / event.total; var percentage_text = Math.floor(progress_value * 100) + "%"; $progress.val(progress_value); $progress_percent.text(percentage_text); } }, false); } req.addEventListener("readystatechange", function() { if(req.readyState == 4 && req.status == 200){ $progress.add($progress_percent).remove(); var response = parseImgurResponseJSON(req.responseText); if(!response) return; if(!response.success){ $imgur_status.text("Failed to upload image :("); return; } var url = response.data.link; $imgur_status.text(""); var $imgur_url = $(E("a")).attr({id: "imgur-url", target: "_blank"}); $imgur_url.text(url); $imgur_url.attr('href', url); $imgur_url_area.append( "" ).append($imgur_url); // TODO: a button to copy the URL to the clipboard // (also maybe put the URL in a readonly input) var $delete_button = $imgur_window.$Button("Delete", function(){ var req = new XMLHttpRequest(); req.addEventListener("readystatechange", function() { if(req.readyState == 4 && req.status == 200){ $delete_button.remove(); var response = parseImgurResponseJSON(req.responseText); if(!response) return; if(response.success){ $imgur_url_area.remove(); $imgur_status.text("Deleted successfully"); }else{ $imgur_status.text("Failed to delete image :("); } }else if(req.readyState == 4){ $imgur_status.text("Error deleting image :("); } }); req.open("DELETE", "https://api.imgur.com/3/image/" + response.data.deletehash, true); req.setRequestHeader("Authorization", "Client-ID 203da2f300125a1"); req.setRequestHeader("Accept", "application/json"); req.send(null); $imgur_status.text("Deleting..."); }); var $okay_button = $imgur_window.$Button("OK", function(){ $imgur_window.close(); }); }else if(req.readyState == 4){ $progress.add($progress_percent).remove(); $imgur_status.text("Error uploading image :("); } }); req.open("POST", "https://api.imgur.com/3/image", true); var form_data = new FormData(); form_data.append("image", blob); req.setRequestHeader("Authorization", "Client-ID 203da2f300125a1"); req.setRequestHeader("Accept", "application/json"); req.send(form_data); $imgur_status.text("Uploading..."); }); var $cancel_button = $imgur_window.$Button("Cancel", function(){ $imgur_window.close(); }); $imgur_window.width(300); $imgur_window.center(); }