3 var server_max_size = 0, ws;
10 return s.replace(/&/g, "&").
11 replace(/\</g, "<").
12 replace(/\>/g, ">").
13 replace(/\"/g, """).
14 replace(/%/g, "%");
17 function lws_urlencode(s)
19 return encodeURI(s).replace(/@/g, "%40");
24 var s = num.toString();
29 while (s.length && s[s.length - 1] === "0")
30 s = s.substring(0, s.length - 1);
32 if (s[s.length - 1] === ".")
33 s = s.substring(0, s.length - 1);
44 return trim((n / 1024).toFixed(2)) + "KiB";
46 if (n < 1024 * 1024 * 1024)
47 return trim((n / (1024 * 1024)).toFixed(2)) + "MiB";
49 return trim((n / (1024 * 1024 * 1024)).toFixed(2)) + "GiB";
54 var da = document.getElementById("da");
57 da.classList.add("trot");
62 var da = document.getElementById("da");
65 da.classList.remove("trot");
70 var da = document.getElementById("da");
73 da.classList.add("trot");
76 function clear_errors() {
77 var t = document.getElementById("ongoing");
79 for (n = 0; n < t.rows.length; n++)
80 if (t.rows[n].cells[0].classList.contains("err"))
84 function do_upload(file) {
85 var formData = new FormData();
86 var t = document.getElementById("ongoing");
88 formData.append("file", file);
90 var row = t.insertRow(0), c1 = row.insertCell(0),
91 c2 = row.insertCell(1), c3 = row.insertCell(2);
93 c1.classList.add("ogn");
94 c1.classList.add("r");
96 if (file.size > server_max_size) {
97 c1.innerHTML = "Too Large";
98 c1.classList.add("err");
100 c1.innerHTML = "<img class=\"working\">";
102 c2.classList.add("ogn");
103 c2.classList.add("r");
104 c2.innerHTML = humanize(file.size);
106 c3.classList.add("ogn");
107 c3.innerHTML = file.name;
109 if (file.size > server_max_size)
112 fetch("upload/" + lws_urlencode(file.name), {
116 .then((e) => { /* this just means we got a response code */
117 var us = e.url.split("/"), ul = us[us.length - 1], n;
119 for (n = 0; n < t.rows.length; n++)
120 if (ul === lws_urlencode(
121 t.rows[n].cells[2].textContent)) {
125 t.rows[n].cells[0].textContent =
126 "Failed " + san(e.status.toString());
128 classList.add("err");
134 var us = e.url.split("/"), ul = us[us.length - 1], n;
136 for (n = 0; n < t.rows.length; n++)
137 if (ul === lws_urlencode(
138 t.rows[n].cells[2].textContent)) {
139 t.rows[n].cells[0] = "FAIL";
145 function da_drop(e) {
146 var da = document.getElementById("da");
149 da.classList.remove("trot");
153 ([...e.dataTransfer.files]).forEach(do_upload);
156 function upl_button(e) {
157 var fi = document.getElementById("file"),
158 da = document.getElementById("da");
163 ([...fi.files]).forEach(do_upload);
166 function body_drop(e) {
171 var fi = document.getElementById("file"),
172 upl = document.getElementById("upl");
174 upl.disabled = !fi.files.length;
182 ws.send("{\"del\":\"" + decodeURI(e.target.getAttribute("file")) +
186 function get_appropriate_ws_url(extra_url)
189 var u = document.URL;
192 * We open the websocket encrypted if this page came on an
193 * https:// url itself, otherwise unencrypted
196 if (u.substring(0, 5) === "https") {
201 if (u.substring(0, 4) === "http")
207 /* + "/xxx" bit is for IE10 workaround */
209 return pcol + u[0] + "/" + extra_url;
212 function new_ws(urlpath, protocol)
214 if (typeof MozWebSocket != "undefined")
215 return new MozWebSocket(urlpath, protocol);
217 return new WebSocket(urlpath, protocol);
220 document.addEventListener("DOMContentLoaded", function() {
221 var da = document.getElementById("da"),
222 fi = document.getElementById("file"),
223 upl = document.getElementById("upl");
225 da.addEventListener("dragenter", da_enter, false);
226 da.addEventListener("dragleave", da_leave, false);
227 da.addEventListener("dragover", da_over, false);
228 da.addEventListener("drop", da_drop, false);
230 upl.addEventListener("click", upl_button, false);
231 fi.addEventListener("change", inp, false);
233 window.addEventListener("dragover", body_drop, false);
234 window.addEventListener("drop", body_drop, false);
236 ws = new_ws(get_appropriate_ws_url(""), "lws-deaddrop");
238 ws.onopen = function() {
239 var dd = document.getElementById("ddrop"),
240 da = document.getElementById("da");
242 dd.classList.remove("noconn");
243 da.classList.remove("disa");
246 ws.onmessage = function got_packet(msg) {
247 var j = JSON.parse(msg.data), s = "", n,
248 t = document.getElementById("dd-list");
250 server_max_size = j.max_size;
251 document.getElementById("size").innerHTML =
252 "Server maximum file size " +
253 humanize(j.max_size);
255 s += "<table class=\"nb\">";
256 for (n = 0; n < j.files.length; n++) {
257 var date = new Date(j.files[n].mtime * 1000);
258 s += "<tr><td class=\"dow r\">" +
259 humanize(j.files[n].size) +
260 "</td><td class=\"dow\">" +
261 date.toDateString() + " " +
262 date.toLocaleTimeString() +
264 if (j.files[n].yours === 1)
265 s += "<img id=\"d" + n +
266 "\" class=\"delbtn\" file=\"" +
267 lws_urlencode(san(j.files[n].name)) + "\">";
271 s += "</td><td class=\"ogn\"><a href=\"get/" +
272 lws_urlencode(san(j.files[n].name)) +
274 san(j.files[n].name) + "</a></td></tr>";
280 for (n = 0; n < j.files.length; n++) {
281 var d = document.getElementById("d" + n);
283 d.addEventListener("click",
288 ws.onclose = function() {
289 var dd = document.getElementById("ddrop"),
290 da = document.getElementById("da");
292 dd.classList.add("noconn");
293 da.classList.add("disa");
296 alert("<p>Error " + exception);