1*1c60b9acSAndroid Build Coastguard Worker(function() { 2*1c60b9acSAndroid Build Coastguard Worker 3*1c60b9acSAndroid Build Coastguard Worker var server_max_size = 0, ws; 4*1c60b9acSAndroid Build Coastguard Worker 5*1c60b9acSAndroid Build Coastguard Worker function san(s) 6*1c60b9acSAndroid Build Coastguard Worker { 7*1c60b9acSAndroid Build Coastguard Worker if (!s) 8*1c60b9acSAndroid Build Coastguard Worker return ""; 9*1c60b9acSAndroid Build Coastguard Worker 10*1c60b9acSAndroid Build Coastguard Worker return s.replace(/&/g, "&"). 11*1c60b9acSAndroid Build Coastguard Worker replace(/\</g, "<"). 12*1c60b9acSAndroid Build Coastguard Worker replace(/\>/g, ">"). 13*1c60b9acSAndroid Build Coastguard Worker replace(/\"/g, """). 14*1c60b9acSAndroid Build Coastguard Worker replace(/%/g, "%"); 15*1c60b9acSAndroid Build Coastguard Worker } 16*1c60b9acSAndroid Build Coastguard Worker 17*1c60b9acSAndroid Build Coastguard Worker function lws_urlencode(s) 18*1c60b9acSAndroid Build Coastguard Worker { 19*1c60b9acSAndroid Build Coastguard Worker return encodeURI(s).replace(/@/g, "%40"); 20*1c60b9acSAndroid Build Coastguard Worker } 21*1c60b9acSAndroid Build Coastguard Worker 22*1c60b9acSAndroid Build Coastguard Worker function trim(num) 23*1c60b9acSAndroid Build Coastguard Worker { 24*1c60b9acSAndroid Build Coastguard Worker var s = num.toString(); 25*1c60b9acSAndroid Build Coastguard Worker 26*1c60b9acSAndroid Build Coastguard Worker if (!s.indexOf(".")) 27*1c60b9acSAndroid Build Coastguard Worker return s; 28*1c60b9acSAndroid Build Coastguard Worker 29*1c60b9acSAndroid Build Coastguard Worker while (s.length && s[s.length - 1] === "0") 30*1c60b9acSAndroid Build Coastguard Worker s = s.substring(0, s.length - 1); 31*1c60b9acSAndroid Build Coastguard Worker 32*1c60b9acSAndroid Build Coastguard Worker if (s[s.length - 1] === ".") 33*1c60b9acSAndroid Build Coastguard Worker s = s.substring(0, s.length - 1); 34*1c60b9acSAndroid Build Coastguard Worker 35*1c60b9acSAndroid Build Coastguard Worker return s; 36*1c60b9acSAndroid Build Coastguard Worker } 37*1c60b9acSAndroid Build Coastguard Worker 38*1c60b9acSAndroid Build Coastguard Worker function humanize(n) 39*1c60b9acSAndroid Build Coastguard Worker { 40*1c60b9acSAndroid Build Coastguard Worker if (n < 1024) 41*1c60b9acSAndroid Build Coastguard Worker return n + "B"; 42*1c60b9acSAndroid Build Coastguard Worker 43*1c60b9acSAndroid Build Coastguard Worker if (n < 1024 * 1024) 44*1c60b9acSAndroid Build Coastguard Worker return trim((n / 1024).toFixed(2)) + "KiB"; 45*1c60b9acSAndroid Build Coastguard Worker 46*1c60b9acSAndroid Build Coastguard Worker if (n < 1024 * 1024 * 1024) 47*1c60b9acSAndroid Build Coastguard Worker return trim((n / (1024 * 1024)).toFixed(2)) + "MiB"; 48*1c60b9acSAndroid Build Coastguard Worker 49*1c60b9acSAndroid Build Coastguard Worker return trim((n / (1024 * 1024 * 1024)).toFixed(2)) + "GiB"; 50*1c60b9acSAndroid Build Coastguard Worker } 51*1c60b9acSAndroid Build Coastguard Worker 52*1c60b9acSAndroid Build Coastguard Worker function da_enter(e) 53*1c60b9acSAndroid Build Coastguard Worker { 54*1c60b9acSAndroid Build Coastguard Worker var da = document.getElementById("da"); 55*1c60b9acSAndroid Build Coastguard Worker 56*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 57*1c60b9acSAndroid Build Coastguard Worker da.classList.add("trot"); 58*1c60b9acSAndroid Build Coastguard Worker } 59*1c60b9acSAndroid Build Coastguard Worker 60*1c60b9acSAndroid Build Coastguard Worker function da_leave(e) 61*1c60b9acSAndroid Build Coastguard Worker { 62*1c60b9acSAndroid Build Coastguard Worker var da = document.getElementById("da"); 63*1c60b9acSAndroid Build Coastguard Worker 64*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 65*1c60b9acSAndroid Build Coastguard Worker da.classList.remove("trot"); 66*1c60b9acSAndroid Build Coastguard Worker } 67*1c60b9acSAndroid Build Coastguard Worker 68*1c60b9acSAndroid Build Coastguard Worker function da_over(e) 69*1c60b9acSAndroid Build Coastguard Worker { 70*1c60b9acSAndroid Build Coastguard Worker var da = document.getElementById("da"); 71*1c60b9acSAndroid Build Coastguard Worker 72*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 73*1c60b9acSAndroid Build Coastguard Worker da.classList.add("trot"); 74*1c60b9acSAndroid Build Coastguard Worker } 75*1c60b9acSAndroid Build Coastguard Worker 76*1c60b9acSAndroid Build Coastguard Worker function clear_errors() { 77*1c60b9acSAndroid Build Coastguard Worker var n, t = document.getElementById("ongoing"); 78*1c60b9acSAndroid Build Coastguard Worker 79*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < t.rows.length; n++) 80*1c60b9acSAndroid Build Coastguard Worker if (t.rows[n].cells[0].classList.contains("err")) 81*1c60b9acSAndroid Build Coastguard Worker t.deleteRow(n); 82*1c60b9acSAndroid Build Coastguard Worker } 83*1c60b9acSAndroid Build Coastguard Worker 84*1c60b9acSAndroid Build Coastguard Worker function do_upload(file) { 85*1c60b9acSAndroid Build Coastguard Worker var formData = new FormData(); 86*1c60b9acSAndroid Build Coastguard Worker var t = document.getElementById("ongoing"); 87*1c60b9acSAndroid Build Coastguard Worker 88*1c60b9acSAndroid Build Coastguard Worker formData.append("file", file); 89*1c60b9acSAndroid Build Coastguard Worker 90*1c60b9acSAndroid Build Coastguard Worker var row = t.insertRow(0), c1 = row.insertCell(0), 91*1c60b9acSAndroid Build Coastguard Worker c2 = row.insertCell(1), c3 = row.insertCell(2); 92*1c60b9acSAndroid Build Coastguard Worker 93*1c60b9acSAndroid Build Coastguard Worker c1.classList.add("ogn"); 94*1c60b9acSAndroid Build Coastguard Worker c1.classList.add("r"); 95*1c60b9acSAndroid Build Coastguard Worker 96*1c60b9acSAndroid Build Coastguard Worker if (file.size > server_max_size) { 97*1c60b9acSAndroid Build Coastguard Worker c1.innerHTML = "Too Large"; 98*1c60b9acSAndroid Build Coastguard Worker c1.classList.add("err"); 99*1c60b9acSAndroid Build Coastguard Worker } else 100*1c60b9acSAndroid Build Coastguard Worker c1.innerHTML = "<img class=\"working\">"; 101*1c60b9acSAndroid Build Coastguard Worker 102*1c60b9acSAndroid Build Coastguard Worker c2.classList.add("ogn"); 103*1c60b9acSAndroid Build Coastguard Worker c2.classList.add("r"); 104*1c60b9acSAndroid Build Coastguard Worker c2.innerHTML = humanize(file.size); 105*1c60b9acSAndroid Build Coastguard Worker 106*1c60b9acSAndroid Build Coastguard Worker c3.classList.add("ogn"); 107*1c60b9acSAndroid Build Coastguard Worker c3.innerHTML = file.name; 108*1c60b9acSAndroid Build Coastguard Worker 109*1c60b9acSAndroid Build Coastguard Worker if (file.size > server_max_size) 110*1c60b9acSAndroid Build Coastguard Worker return; 111*1c60b9acSAndroid Build Coastguard Worker 112*1c60b9acSAndroid Build Coastguard Worker fetch("upload/" + lws_urlencode(file.name), { 113*1c60b9acSAndroid Build Coastguard Worker method: "POST", 114*1c60b9acSAndroid Build Coastguard Worker body: formData 115*1c60b9acSAndroid Build Coastguard Worker }) 116*1c60b9acSAndroid Build Coastguard Worker .then((e) => { /* this just means we got a response code */ 117*1c60b9acSAndroid Build Coastguard Worker var us = e.url.split("/"), ul = us[us.length - 1], n; 118*1c60b9acSAndroid Build Coastguard Worker 119*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < t.rows.length; n++) 120*1c60b9acSAndroid Build Coastguard Worker if (ul === lws_urlencode( 121*1c60b9acSAndroid Build Coastguard Worker t.rows[n].cells[2].textContent)) { 122*1c60b9acSAndroid Build Coastguard Worker if (e.ok === true) { 123*1c60b9acSAndroid Build Coastguard Worker t.deleteRow(n); 124*1c60b9acSAndroid Build Coastguard Worker } else { 125*1c60b9acSAndroid Build Coastguard Worker t.rows[n].cells[0].textContent = 126*1c60b9acSAndroid Build Coastguard Worker "Failed " + san(e.status.toString()); 127*1c60b9acSAndroid Build Coastguard Worker t.rows[n].cells[0]. 128*1c60b9acSAndroid Build Coastguard Worker classList.add("err"); 129*1c60b9acSAndroid Build Coastguard Worker } 130*1c60b9acSAndroid Build Coastguard Worker break; 131*1c60b9acSAndroid Build Coastguard Worker } 132*1c60b9acSAndroid Build Coastguard Worker }) 133*1c60b9acSAndroid Build Coastguard Worker .catch((e) => { 134*1c60b9acSAndroid Build Coastguard Worker var us = e.url.split("/"), ul = us[us.length - 1], n; 135*1c60b9acSAndroid Build Coastguard Worker 136*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < t.rows.length; n++) 137*1c60b9acSAndroid Build Coastguard Worker if (ul === lws_urlencode( 138*1c60b9acSAndroid Build Coastguard Worker t.rows[n].cells[2].textContent)) { 139*1c60b9acSAndroid Build Coastguard Worker t.rows[n].cells[0] = "FAIL"; 140*1c60b9acSAndroid Build Coastguard Worker break; 141*1c60b9acSAndroid Build Coastguard Worker } 142*1c60b9acSAndroid Build Coastguard Worker }); 143*1c60b9acSAndroid Build Coastguard Worker } 144*1c60b9acSAndroid Build Coastguard Worker 145*1c60b9acSAndroid Build Coastguard Worker function da_drop(e) { 146*1c60b9acSAndroid Build Coastguard Worker var da = document.getElementById("da"); 147*1c60b9acSAndroid Build Coastguard Worker 148*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 149*1c60b9acSAndroid Build Coastguard Worker da.classList.remove("trot"); 150*1c60b9acSAndroid Build Coastguard Worker 151*1c60b9acSAndroid Build Coastguard Worker clear_errors(); 152*1c60b9acSAndroid Build Coastguard Worker 153*1c60b9acSAndroid Build Coastguard Worker ([...e.dataTransfer.files]).forEach(do_upload); 154*1c60b9acSAndroid Build Coastguard Worker } 155*1c60b9acSAndroid Build Coastguard Worker 156*1c60b9acSAndroid Build Coastguard Worker function upl_button(e) { 157*1c60b9acSAndroid Build Coastguard Worker var fi = document.getElementById("file"); 158*1c60b9acSAndroid Build Coastguard Worker 159*1c60b9acSAndroid Build Coastguard Worker clear_errors(); 160*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 161*1c60b9acSAndroid Build Coastguard Worker 162*1c60b9acSAndroid Build Coastguard Worker ([...fi.files]).forEach(do_upload); 163*1c60b9acSAndroid Build Coastguard Worker } 164*1c60b9acSAndroid Build Coastguard Worker 165*1c60b9acSAndroid Build Coastguard Worker function body_drop(e) { 166*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 167*1c60b9acSAndroid Build Coastguard Worker } 168*1c60b9acSAndroid Build Coastguard Worker 169*1c60b9acSAndroid Build Coastguard Worker function inp() { 170*1c60b9acSAndroid Build Coastguard Worker var fi = document.getElementById("file"), 171*1c60b9acSAndroid Build Coastguard Worker upl = document.getElementById("upl"); 172*1c60b9acSAndroid Build Coastguard Worker console.log("inp"); 173*1c60b9acSAndroid Build Coastguard Worker upl.disabled = !fi.files.length; 174*1c60b9acSAndroid Build Coastguard Worker } 175*1c60b9acSAndroid Build Coastguard Worker 176*1c60b9acSAndroid Build Coastguard Worker function delfile(e) 177*1c60b9acSAndroid Build Coastguard Worker { 178*1c60b9acSAndroid Build Coastguard Worker e.stopPropagation(); 179*1c60b9acSAndroid Build Coastguard Worker e.preventDefault(); 180*1c60b9acSAndroid Build Coastguard Worker 181*1c60b9acSAndroid Build Coastguard Worker ws.send("{\"del\":\"" + decodeURI(e.target.getAttribute("file")) + 182*1c60b9acSAndroid Build Coastguard Worker "\"}"); 183*1c60b9acSAndroid Build Coastguard Worker } 184*1c60b9acSAndroid Build Coastguard Worker 185*1c60b9acSAndroid Build Coastguard Worker function get_appropriate_ws_url(extra_url) 186*1c60b9acSAndroid Build Coastguard Worker { 187*1c60b9acSAndroid Build Coastguard Worker var pcol; 188*1c60b9acSAndroid Build Coastguard Worker var u = document.URL; 189*1c60b9acSAndroid Build Coastguard Worker 190*1c60b9acSAndroid Build Coastguard Worker /* 191*1c60b9acSAndroid Build Coastguard Worker * We open the websocket encrypted if this page came on an 192*1c60b9acSAndroid Build Coastguard Worker * https:// url itself, otherwise unencrypted 193*1c60b9acSAndroid Build Coastguard Worker */ 194*1c60b9acSAndroid Build Coastguard Worker 195*1c60b9acSAndroid Build Coastguard Worker if (u.substring(0, 5) === "https") { 196*1c60b9acSAndroid Build Coastguard Worker pcol = "wss://"; 197*1c60b9acSAndroid Build Coastguard Worker u = u.substr(8); 198*1c60b9acSAndroid Build Coastguard Worker } else { 199*1c60b9acSAndroid Build Coastguard Worker pcol = "ws://"; 200*1c60b9acSAndroid Build Coastguard Worker if (u.substring(0, 4) === "http") 201*1c60b9acSAndroid Build Coastguard Worker u = u.substr(7); 202*1c60b9acSAndroid Build Coastguard Worker } 203*1c60b9acSAndroid Build Coastguard Worker 204*1c60b9acSAndroid Build Coastguard Worker u = u.split("/"); 205*1c60b9acSAndroid Build Coastguard Worker 206*1c60b9acSAndroid Build Coastguard Worker /* + "/xxx" bit is for IE10 workaround */ 207*1c60b9acSAndroid Build Coastguard Worker 208*1c60b9acSAndroid Build Coastguard Worker return pcol + u[0] + "/" + extra_url; 209*1c60b9acSAndroid Build Coastguard Worker } 210*1c60b9acSAndroid Build Coastguard Worker 211*1c60b9acSAndroid Build Coastguard Worker function new_ws(urlpath, protocol) 212*1c60b9acSAndroid Build Coastguard Worker { 213*1c60b9acSAndroid Build Coastguard Worker return new WebSocket(urlpath, protocol); 214*1c60b9acSAndroid Build Coastguard Worker } 215*1c60b9acSAndroid Build Coastguard Worker 216*1c60b9acSAndroid Build Coastguard Worker document.addEventListener("DOMContentLoaded", function() { 217*1c60b9acSAndroid Build Coastguard Worker var da = document.getElementById("da"), 218*1c60b9acSAndroid Build Coastguard Worker fi = document.getElementById("file"), 219*1c60b9acSAndroid Build Coastguard Worker upl = document.getElementById("upl"); 220*1c60b9acSAndroid Build Coastguard Worker 221*1c60b9acSAndroid Build Coastguard Worker da.addEventListener("dragenter", da_enter, false); 222*1c60b9acSAndroid Build Coastguard Worker da.addEventListener("dragleave", da_leave, false); 223*1c60b9acSAndroid Build Coastguard Worker da.addEventListener("dragover", da_over, false); 224*1c60b9acSAndroid Build Coastguard Worker da.addEventListener("drop", da_drop, false); 225*1c60b9acSAndroid Build Coastguard Worker 226*1c60b9acSAndroid Build Coastguard Worker upl.addEventListener("click", upl_button, false); 227*1c60b9acSAndroid Build Coastguard Worker fi.addEventListener("change", inp, false); 228*1c60b9acSAndroid Build Coastguard Worker 229*1c60b9acSAndroid Build Coastguard Worker window.addEventListener("dragover", body_drop, false); 230*1c60b9acSAndroid Build Coastguard Worker window.addEventListener("drop", body_drop, false); 231*1c60b9acSAndroid Build Coastguard Worker 232*1c60b9acSAndroid Build Coastguard Worker ws = new_ws(get_appropriate_ws_url(""), "lws-deaddrop"); 233*1c60b9acSAndroid Build Coastguard Worker try { 234*1c60b9acSAndroid Build Coastguard Worker ws.onopen = function() { 235*1c60b9acSAndroid Build Coastguard Worker var dd = document.getElementById("ddrop"), 236*1c60b9acSAndroid Build Coastguard Worker da = document.getElementById("da"); 237*1c60b9acSAndroid Build Coastguard Worker 238*1c60b9acSAndroid Build Coastguard Worker dd.classList.remove("noconn"); 239*1c60b9acSAndroid Build Coastguard Worker da.classList.remove("disa"); 240*1c60b9acSAndroid Build Coastguard Worker }; 241*1c60b9acSAndroid Build Coastguard Worker 242*1c60b9acSAndroid Build Coastguard Worker ws.onmessage = function got_packet(msg) { 243*1c60b9acSAndroid Build Coastguard Worker var j = JSON.parse(msg.data), s = "", n, 244*1c60b9acSAndroid Build Coastguard Worker t = document.getElementById("dd-list"); 245*1c60b9acSAndroid Build Coastguard Worker 246*1c60b9acSAndroid Build Coastguard Worker server_max_size = j.max_size; 247*1c60b9acSAndroid Build Coastguard Worker document.getElementById("size").innerHTML = 248*1c60b9acSAndroid Build Coastguard Worker "Server maximum file size " + 249*1c60b9acSAndroid Build Coastguard Worker humanize(j.max_size); 250*1c60b9acSAndroid Build Coastguard Worker 251*1c60b9acSAndroid Build Coastguard Worker s += "<table class=\"nb\">"; 252*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < j.files.length; n++) { 253*1c60b9acSAndroid Build Coastguard Worker var date = new Date(j.files[n].mtime * 1000); 254*1c60b9acSAndroid Build Coastguard Worker s += "<tr><td class=\"dow r\">" + 255*1c60b9acSAndroid Build Coastguard Worker humanize(j.files[n].size) + 256*1c60b9acSAndroid Build Coastguard Worker "</td><td class=\"dow\">" + 257*1c60b9acSAndroid Build Coastguard Worker date.toDateString() + " " + 258*1c60b9acSAndroid Build Coastguard Worker date.toLocaleTimeString() + 259*1c60b9acSAndroid Build Coastguard Worker "</td><td>"; 260*1c60b9acSAndroid Build Coastguard Worker if (j.files[n].yours === 1) 261*1c60b9acSAndroid Build Coastguard Worker s += "<img id=\"d" + n + 262*1c60b9acSAndroid Build Coastguard Worker "\" class=\"delbtn\" file=\"" + 263*1c60b9acSAndroid Build Coastguard Worker lws_urlencode(san(j.files[n].name)) + "\">"; 264*1c60b9acSAndroid Build Coastguard Worker else 265*1c60b9acSAndroid Build Coastguard Worker s += " "; 266*1c60b9acSAndroid Build Coastguard Worker 267*1c60b9acSAndroid Build Coastguard Worker s += "</td><td class=\"ogn\"><a href=\"get/" + 268*1c60b9acSAndroid Build Coastguard Worker lws_urlencode(san(j.files[n].name)) + 269*1c60b9acSAndroid Build Coastguard Worker "\" download>" + 270*1c60b9acSAndroid Build Coastguard Worker san(j.files[n].name) + "</a></td></tr>"; 271*1c60b9acSAndroid Build Coastguard Worker } 272*1c60b9acSAndroid Build Coastguard Worker s += "</table>"; 273*1c60b9acSAndroid Build Coastguard Worker 274*1c60b9acSAndroid Build Coastguard Worker t.innerHTML = s; 275*1c60b9acSAndroid Build Coastguard Worker 276*1c60b9acSAndroid Build Coastguard Worker for (n = 0; n < j.files.length; n++) { 277*1c60b9acSAndroid Build Coastguard Worker var d = document.getElementById("d" + n); 278*1c60b9acSAndroid Build Coastguard Worker if (d) 279*1c60b9acSAndroid Build Coastguard Worker d.addEventListener("click", 280*1c60b9acSAndroid Build Coastguard Worker delfile, false); 281*1c60b9acSAndroid Build Coastguard Worker } 282*1c60b9acSAndroid Build Coastguard Worker }; 283*1c60b9acSAndroid Build Coastguard Worker 284*1c60b9acSAndroid Build Coastguard Worker ws.onclose = function() { 285*1c60b9acSAndroid Build Coastguard Worker var dd = document.getElementById("ddrop"), 286*1c60b9acSAndroid Build Coastguard Worker da = document.getElementById("da"); 287*1c60b9acSAndroid Build Coastguard Worker 288*1c60b9acSAndroid Build Coastguard Worker dd.classList.add("noconn"); 289*1c60b9acSAndroid Build Coastguard Worker da.classList.add("disa"); 290*1c60b9acSAndroid Build Coastguard Worker }; 291*1c60b9acSAndroid Build Coastguard Worker } catch(exception) { 292*1c60b9acSAndroid Build Coastguard Worker alert("<p>Error " + exception); 293*1c60b9acSAndroid Build Coastguard Worker } 294*1c60b9acSAndroid Build Coastguard Worker 295*1c60b9acSAndroid Build Coastguard Worker }); 296*1c60b9acSAndroid Build Coastguard Worker}()); 297