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