| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- (function() {
- var server_max_size = 0, ws;
- function san(s)
- {
- if (!s)
- return "";
- return s.replace(/&/g, "&").
- replace(/\</g, "<").
- replace(/\>/g, ">").
- replace(/\"/g, """).
- replace(/%/g, "%");
- }
- function lws_urlencode(s)
- {
- return encodeURI(s).replace(/@/g, "%40");
- }
- function trim(num)
- {
- var s = num.toString();
- if (!s.indexOf("."))
- return s;
- while (s.length && s[s.length - 1] === "0")
- s = s.substring(0, s.length - 1);
- if (s[s.length - 1] === ".")
- s = s.substring(0, s.length - 1);
- return s;
- }
- function humanize(n)
- {
- if (n < 1024)
- return n + "B";
- if (n < 1024 * 1024)
- return trim((n / 1024).toFixed(2)) + "KiB";
- if (n < 1024 * 1024 * 1024)
- return trim((n / (1024 * 1024)).toFixed(2)) + "MiB";
- return trim((n / (1024 * 1024 * 1024)).toFixed(2)) + "GiB";
- }
- function da_enter(e)
- {
- var da = document.getElementById("da");
- e.preventDefault();
- da.classList.add("trot");
- }
- function da_leave(e)
- {
- var da = document.getElementById("da");
- e.preventDefault();
- da.classList.remove("trot");
- }
- function da_over(e)
- {
- var da = document.getElementById("da");
- e.preventDefault();
- da.classList.add("trot");
- }
- function clear_errors() {
- var n, t = document.getElementById("ongoing");
- for (n = 0; n < t.rows.length; n++)
- if (t.rows[n].cells[0].classList.contains("err"))
- t.deleteRow(n);
- }
- function do_upload(file) {
- var formData = new FormData();
- var t = document.getElementById("ongoing");
- formData.append("file", file);
- var row = t.insertRow(0), c1 = row.insertCell(0),
- c2 = row.insertCell(1), c3 = row.insertCell(2);
- c1.classList.add("ogn");
- c1.classList.add("r");
- if (file.size > server_max_size) {
- c1.innerHTML = "Too Large";
- c1.classList.add("err");
- } else
- c1.innerHTML = "<img class=\"working\">";
- c2.classList.add("ogn");
- c2.classList.add("r");
- c2.innerHTML = humanize(file.size);
- c3.classList.add("ogn");
- c3.innerHTML = file.name;
- if (file.size > server_max_size)
- return;
- fetch("upload/" + lws_urlencode(file.name), {
- method: "POST",
- body: formData
- })
- .then((e) => { /* this just means we got a response code */
- var us = e.url.split("/"), ul = us[us.length - 1], n;
- for (n = 0; n < t.rows.length; n++)
- if (ul === lws_urlencode(
- t.rows[n].cells[2].textContent)) {
- if (e.ok === true) {
- t.deleteRow(n);
- } else {
- t.rows[n].cells[0].textContent =
- "Failed " + san(e.status.toString());
- t.rows[n].cells[0].
- classList.add("err");
- }
- break;
- }
- })
- .catch((e) => {
- var us = e.url.split("/"), ul = us[us.length - 1], n;
- for (n = 0; n < t.rows.length; n++)
- if (ul === lws_urlencode(
- t.rows[n].cells[2].textContent)) {
- t.rows[n].cells[0] = "FAIL";
- break;
- }
- });
- }
- function da_drop(e) {
- var da = document.getElementById("da");
- e.preventDefault();
- da.classList.remove("trot");
- clear_errors();
- ([...e.dataTransfer.files]).forEach(do_upload);
- }
- function upl_button(e) {
- var fi = document.getElementById("file");
- clear_errors();
- e.preventDefault();
- ([...fi.files]).forEach(do_upload);
- }
- function body_drop(e) {
- e.preventDefault();
- }
- function inp() {
- var fi = document.getElementById("file"),
- upl = document.getElementById("upl");
- console.log("inp");
- upl.disabled = !fi.files.length;
- }
- function delfile(e)
- {
- e.stopPropagation();
- e.preventDefault();
- ws.send("{\"del\":\"" + decodeURI(e.target.getAttribute("file")) +
- "\"}");
- }
- function get_appropriate_ws_url(extra_url)
- {
- var pcol;
- var u = document.URL;
- /*
- * We open the websocket encrypted if this page came on an
- * https:// url itself, otherwise unencrypted
- */
- if (u.substring(0, 5) === "https") {
- pcol = "wss://";
- u = u.substr(8);
- } else {
- pcol = "ws://";
- if (u.substring(0, 4) === "http")
- u = u.substr(7);
- }
- u = u.split("/");
- /* + "/xxx" bit is for IE10 workaround */
- return pcol + u[0] + "/" + extra_url;
- }
- function new_ws(urlpath, protocol)
- {
- return new WebSocket(urlpath, protocol);
- }
- document.addEventListener("DOMContentLoaded", function() {
- var da = document.getElementById("da"),
- fi = document.getElementById("file"),
- upl = document.getElementById("upl");
- da.addEventListener("dragenter", da_enter, false);
- da.addEventListener("dragleave", da_leave, false);
- da.addEventListener("dragover", da_over, false);
- da.addEventListener("drop", da_drop, false);
- upl.addEventListener("click", upl_button, false);
- fi.addEventListener("change", inp, false);
- window.addEventListener("dragover", body_drop, false);
- window.addEventListener("drop", body_drop, false);
- ws = new_ws(get_appropriate_ws_url(""), "lws-deaddrop");
- try {
- ws.onopen = function() {
- var dd = document.getElementById("ddrop"),
- da = document.getElementById("da");
- dd.classList.remove("noconn");
- da.classList.remove("disa");
- };
- ws.onmessage = function got_packet(msg) {
- var j = JSON.parse(msg.data), s = "", n,
- t = document.getElementById("dd-list");
- server_max_size = j.max_size;
- document.getElementById("size").innerHTML =
- "Server maximum file size " +
- humanize(j.max_size);
- s += "<table class=\"nb\">";
- for (n = 0; n < j.files.length; n++) {
- var date = new Date(j.files[n].mtime * 1000);
- s += "<tr><td class=\"dow r\">" +
- humanize(j.files[n].size) +
- "</td><td class=\"dow\">" +
- date.toDateString() + " " +
- date.toLocaleTimeString() +
- "</td><td>";
- if (j.files[n].yours === 1)
- s += "<img id=\"d" + n +
- "\" class=\"delbtn\" file=\"" +
- lws_urlencode(san(j.files[n].name)) + "\">";
- else
- s += " ";
- s += "</td><td class=\"ogn\"><a href=\"get/" +
- lws_urlencode(san(j.files[n].name)) +
- "\" download>" +
- san(j.files[n].name) + "</a></td></tr>";
- }
- s += "</table>";
- t.innerHTML = s;
- for (n = 0; n < j.files.length; n++) {
- var d = document.getElementById("d" + n);
- if (d)
- d.addEventListener("click",
- delfile, false);
- }
- };
- ws.onclose = function() {
- var dd = document.getElementById("ddrop"),
- da = document.getElementById("da");
- dd.classList.add("noconn");
- da.classList.add("disa");
- };
- } catch(exception) {
- alert("<p>Error " + exception);
- }
- });
- }());
|