Passed
Push — master ( e52422...0b61e5 )
by EMP
01:10
created

main.js ➔ addContact   F

Complexity

Conditions 15

Size

Total Lines 19
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 15
eloc 15
dl 0
loc 19
rs 2.9998
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like main.js ➔ addContact often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
"use strict";
2
3
sodium.ready.then(function() {
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
4
5
const ae = new AllEars(function(ok) {
1 ignored issue
show
Bug introduced by
The variable AllEars seems to be never declared. If this is a global, consider adding a /** global: AllEars */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
6
	if (ok) {
7
		const greeting = localStorage.greeting;
1 ignored issue
show
Bug introduced by
The variable localStorage seems to be never declared. If this is a global, consider adding a /** global: localStorage */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
8
		if (greeting) {
9
			document.getElementById("greeting").textContent = greeting;
10
			document.getElementById("txt_pg").value = greeting;
11
		}
12
13
		document.getElementById("txt_skey").style.background = "#466";
14
		document.getElementById("txt_skey").maxLength = "64";
15
	} else {
16
		console.log("Failed to load All-Ears");
17
	}
18
});
19
20
function TabState(cur, max, btnDele, btnUpdt) {
21
	this.cur = cur;
22
	this.max = max;
23
	this.btnDele = btnDele;
24
	this.btnUpdt = btnUpdt;
25
}
26
27
const tabs = [
28
	new TabState(0, 0, false, true), // Inbox
29
	new TabState(0, 0, false, true), // Outbx
30
	new TabState(0, 2, true, false), // Write
31
	new TabState(0, 2, false, false), // Notes
32
	new TabState(0, 3, false, true) // Tools
33
];
34
35
let showHeaders = false;
36
37
let tab = 0;
38
const TAB_INBOX = 0;
39
const TAB_DRBOX = 1;
40
const TAB_WRITE = 2;
41
const TAB_NOTES = 3;
42
const TAB_TOOLS = 4;
43
44
// Helper functions
45
function getCountryName(countryCode) {
46
	const opts = document.getElementById("gatekeeper_country");
47
48
	for (let i = 0; i < opts.length; i++) {
49
		if (opts[i].value === countryCode) {
50
			return opts[i].textContent;
51
		}
52
	}
53
54
	return "Unknown countrycode: " + countryCode;
55
}
56
57
function getCountryFlag(countryCode) {
58
	return sodium.to_string(new Uint8Array([
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
59
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
60
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
61
	]));
62
}
63
64
function getMsgId(num) {
65
	let i;
66
	if (ae.GetExtMsgHeaders(num).toLowerCase().slice(0, 11) === "message-id:") {
67
		i = 0;
68
	} else {
69
		i = ae.GetExtMsgHeaders(num).toLowerCase().indexOf("\nmessage-id:");
70
		if (i < 1) return "ERR";
71
		i++;
72
	}
73
74
	const x = ae.GetExtMsgHeaders(num).slice(i + 11).trim();
75
	if (x[0] !== "<") return "ERR2";
76
	return x.slice(1, x.indexOf(">"));
77
}
78
79
function clearDisplay() {
80
	let el = document.getElementById("midright").getElementsByTagName("img");
81
	if (el.length !== 1) el = document.getElementById("midright").getElementsByTagName("audio");
82
	if (el.length !== 1) el = document.getElementById("midright").getElementsByTagName("video");
83
	if (el.length !== 1) el = document.getElementById("midright").getElementsByTagName("embed");
84
	if (el.length !== 1) el = document.getElementById("midright").getElementsByTagName("iframe");
85
	if (el.length !== 1) return;
86
87
	URL.revokeObjectURL(el[0].src);
1 ignored issue
show
Bug introduced by
The variable URL seems to be never declared. If this is a global, consider adding a /** global: URL */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
88
	el[0].remove();
89
}
90
91
function displayFile(num) {
92
	clearDisplay();
93
94
	document.getElementById("midright").scroll(0, 0);
95
	document.getElementById("midright").setAttribute("data-msgid", ae.GetUplMsgIdHex(num));
96
	document.getElementById("btn_reply").disabled = true;
97
	document.getElementById("btn_mdele").disabled = false;
98
	document.getElementById("midright").children[0].hidden = true;
99
	document.getElementById("midright").children[1].textContent = ae.GetUplMsgTitle(num);
100
101
	switch (ae.GetUplMsgType(num)) {
102
		case "text": {
103
			document.getElementById("midright").children[2].hidden = false;
104
			document.getElementById("midright").children[2].textContent = sodium.to_string(ae.GetUplMsgBody(num));
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
105
		break;}
106
107
		case "image": {
108
			document.getElementById("midright").children[2].hidden = true;
109
			const img = document.createElement("img");
110
			img.src = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer]));
2 ignored issues
show
Bug introduced by
The variable Blob seems to be never declared. If this is a global, consider adding a /** global: Blob */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
Bug introduced by
The variable URL seems to be never declared. If this is a global, consider adding a /** global: URL */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
111
			document.getElementById("midright").appendChild(img);
112
113
			img.onclick = function() {
114
				if (!document.fullscreen)
115
					img.requestFullscreen();
116
				else
117
					document.exitFullscreen();
118
			};
119
		break;}
120
121
		case "audio": {
122
			document.getElementById("midright").children[2].hidden = true;
123
			const el = document.createElement("audio");
124
			el.controls = "controls";
125
			el.src = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer]));
126
			document.getElementById("midright").appendChild(el);
127
		break;}
128
129
		case "video": {
130
			document.getElementById("midright").children[2].hidden = true;
131
			const el = document.createElement("video");
132
			el.controls = "controls";
133
			el.src = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer]));
134
			document.getElementById("midright").appendChild(el);
135
		break;}
136
137
		case "pdf": {
138
			document.getElementById("midright").children[2].hidden = true;
139
			const el = document.createElement("embed");
140
			el.type = "application/pdf";
141
			el.src = URL.createObjectURL(new Blob([ae.GetUplMsgBody(num).buffer], {type: "application/pdf"}));
142
			document.getElementById("midright").appendChild(el);
143
		break;}
144
145
		case "html": {
146
			document.getElementById("midright").children[2].hidden = true;
147
			const el = document.createElement("iframe");
148
			el.allow = "";
149
			el.sandbox = "";
150
			el.csp = "base-uri 'none'; child-src 'none'; connect-src 'none'; default-src 'none'; font-src 'none'; form-action 'none'; frame-ancestors 'none'; frame-src 'none'; img-src 'none'; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'none'; style-src 'none'; worker-src 'none';";
151
			el.srcdoc = sodium.to_string(ae.GetUplMsgBody(num).buffer);
152
			document.getElementById("midright").appendChild(el);
153
		break;}
154
	}
155
}
156
157
function displayMsg(isInt, num) {
158
	clearDisplay();
159
160
	document.getElementById("btn_mdele").disabled = false;
161
	document.getElementById("midright").scroll(0, 0);
162
	document.getElementById("midright").setAttribute("data-msgid", isInt? ae.GetIntMsgIdHex(num) : ae.GetExtMsgIdHex(num));
163
164
	const ts = isInt? ae.GetIntMsgTime(num) : ae.GetExtMsgTime(num);
165
166
	document.getElementById("btn_reply").disabled = false;
167
	document.getElementById("btn_reply").onclick = function() {
168
		document.getElementById("write_recv").value = isInt? ae.GetIntMsgFrom(num) : ae.GetExtMsgFrom(num);
169
		document.getElementById("write_subj").value = "Re: " + (isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num));
170
		document.getElementById("write_rply").textContent = (isInt? "" : getMsgId(num));
171
		document.getElementById("btn_write").click();
172
		document.getElementById("div_write_1").hidden = false;
173
		document.getElementById("div_write_2").hidden = true;
174
		document.getElementById("write_body").focus();
175
		for (const opt of document.getElementById("write_from").options) {
176
			if (opt.value === (isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num))) {
177
				opt.selected = true;
178
			}
179
		}
180
	};
181
182
	document.getElementById("midright").children[0].hidden = false;
183
	document.getElementById("midright").children[2].hidden = false;
184
185
	if (isInt) {
186
		document.getElementById("midright").children[1].textContent = ae.GetIntMsgTitle(num);
187
		document.getElementById("midright").children[2].textContent = ae.GetIntMsgBody(num);
188
	} else {
189
		document.getElementById("midright").children[2].innerHTML = "";
190
191
		const headers = document.createElement("p");
192
		headers.textContent = ae.GetExtMsgHeaders(num);
193
		headers.className = "mono";
194
		headers.hidden = !showHeaders;
195
		document.getElementById("midright").children[2].appendChild(headers);
196
197
		const body = document.createElement("p");
198
		body.textContent = ae.GetExtMsgBody(num);
199
		document.getElementById("midright").children[2].appendChild(body);
200
201
		document.getElementById("midright").children[1].textContent = ae.GetExtMsgTitle(num);
202
		document.getElementById("midright").children[1].onclick = function() {showHeaders = !showHeaders; headers.hidden = !showHeaders;};
203
		document.getElementById("midright").children[1].style.cursor = "pointer";
204
	}
205
206
	document.getElementById("readmsg_to").textContent = isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num);
207
208
	const tzOs = new Date().getTimezoneOffset();
209
	const tz = ((tzOs < 0) ? "+" : "-") + Math.floor(tzOs / -60).toString().padStart(2, "0") + (tzOs % 60 * -1).toString().padStart(2, "0");
210
	document.getElementById("readmsg_date").children[0].textContent = new Date((ts * 1000) + (tzOs * -60000)).toISOString().slice(0, 19).replace("T", " ") + " " + tz;
211
212
	if (!isInt) {
213
		document.getElementById("readmsg_ip").hidden = false;
214
		document.getElementById("readmsg_country").hidden = false;
215
		document.getElementById("readmsg_tls").hidden = false;
216
		document.getElementById("readmsg_greet").hidden = false;
217
		document.getElementById("readmsg_timing").hidden = false;
218
		document.getElementById("readmsg_envfrom").hidden = false;
219
220
		const cc = ae.GetExtMsgCountry(num);
221
222
		document.getElementById("readmsg_ip").children[0].textContent = ae.GetExtMsgIp(num);
223
		document.getElementById("readmsg_country").textContent = getCountryFlag(cc) + " " + getCountryName(cc);
224
		document.getElementById("readmsg_tls").children[0].textContent = ae.GetExtMsgTLS(num);
225
		document.getElementById("readmsg_greet").children[0].textContent = ae.GetExtMsgGreet(num);
226
		document.getElementById("readmsg_envfrom").textContent = ae.GetExtMsgFrom(num);
227
228
		let flagText = "";
229
		if (!ae.GetExtMsgFlagVPad(num)) flagText += "<abbr title=\"Invalid padding\">PAD</abbr> ";
230
		if (!ae.GetExtMsgFlagVSig(num)) flagText += "<abbr title=\"Invalid signature\">SIG</abbr> ";
231
		if (!ae.GetExtMsgFlagPExt(num)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
232
		if (!ae.GetExtMsgFlagQuit(num)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
233
		if (ae.GetExtMsgFlagRare(num)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
234
		if (ae.GetExtMsgFlagFail(num)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
235
		if (ae.GetExtMsgFlagPErr(num)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
236
		document.getElementById("readmsg_flags").children[0].innerHTML = flagText.trim();
237
	} else {
238
		document.getElementById("readmsg_ip").hidden = true;
239
		document.getElementById("readmsg_country").hidden = true;
240
		document.getElementById("readmsg_tls").hidden = true;
241
		document.getElementById("readmsg_greet").hidden = true;
242
		document.getElementById("readmsg_timing").hidden = true;
243
		document.getElementById("readmsg_envfrom").hidden = true;
244
245
		let symbol = "<span title=\"Invalid level\">&#x26a0;</span>";
246
		if (ae.GetIntMsgFrom(num) === "system") {if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"System\">&#x1f162;</span>";} // S (System)
247
		else if (ae.GetIntMsgLevel(num) === 0) symbol = "<span title=\"Level 0 User\">&#x1f10c;</span>"; // 0
248
		else if (ae.GetIntMsgLevel(num) === 1) symbol = "<span title=\"Level 1 User\">&#x278a;</span>"; // 1
249
		else if (ae.GetIntMsgLevel(num) === 2) symbol = "<span title=\"Level 2 User\">&#x278b;</span>"; // 2
250
		else if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"Administrator\">&#x1f150;</span>"; // A (Admin)
251
		document.getElementById("readmsg_from").innerHTML = symbol + " " + ae.GetIntMsgFrom(num);
252
253
		let flagText = "";
254
		if (!ae.GetIntMsgFlagVPad(num)) flagText += "<abbr title=\"Invalid padding\">PAD</abbr> ";
255
		if (!ae.GetIntMsgFlagVSig(num)) flagText += "<abbr title=\"Invalid signature\">SIG</abbr> ";
256
		document.getElementById("readmsg_flags").children[0].innerHTML = flagText.trim();
257
	}
258
}
259
260
// Interface
261
function addMsg(isInt, i) {
262
	const row = document.getElementById("tbl_inbox").insertRow(-1);
263
	row.setAttribute("data-msgid", isInt? ae.GetIntMsgIdHex(i) : ae.GetExtMsgIdHex(i));
264
265
	const cellTime = row.insertCell(-1);
266
	const cellSubj = row.insertCell(-1);
267
	const cellSnd1 = row.insertCell(-1);
268
	const cellSnd2 = row.insertCell(-1);
269
270
	const ts = isInt? ae.GetIntMsgTime(i) : ae.GetExtMsgTime(i);
271
	cellTime.setAttribute("data-ts", ts);
272
	cellTime.textContent = new Date((ts * 1000) + (new Date().getTimezoneOffset() * -60000)).toISOString().slice(0, 10);
273
274
	cellSubj.textContent = isInt? ae.GetIntMsgTitle(i) : ae.GetExtMsgTitle(i);
275
276
	if (isInt) {
277
		cellSnd1.textContent = ae.GetIntMsgFrom(i);
278
		cellSnd1.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
279
	} else {
280
		const from1 = ae.GetExtMsgFrom(i);
281
		const from2 = from1.substring(from1.indexOf("@") + 1);
282
		const cc = ae.GetExtMsgCountry(i);
283
284
		cellSnd1.textContent = from1.substring(0, from1.indexOf("@"));
285
286
		const flag = document.createElement("abbr");
287
		flag.textContent = getCountryFlag(cc);
288
		flag.title = getCountryName(cc);
289
		cellSnd2.appendChild(flag);
290
291
		const fromText = document.createElement("span");
292
		fromText.textContent = " " + from2;
293
		cellSnd2.appendChild(fromText);
294
	}
295
296
	row.onclick = function() {
297
		displayMsg(isInt, i);
298
	};
299
}
300
301
function getRowsPerPage() {
302
	const tbl = document.getElementById("tbl_inbox");
303
	tbl.innerHTML = "";
304
	const row = tbl.insertRow(-1);
305
	const cell = row.insertCell(-1);
306
	cell.textContent = "0";
307
308
	const rowsPerPage = Math.floor(getComputedStyle(document.getElementById("div_inbox")).height.replace("px", "") / getComputedStyle(document.querySelector("#tbl_inbox > tbody > tr:first-child")).height.replace("px", "")) - 1; // -1 allows space for 'load more'
309
	tbl.innerHTML = "";
310
	return rowsPerPage;
311
}
312
313
function addMessages() {
314
	const rowsPerPage = getRowsPerPage();
315
	let skipMsgs = rowsPerPage * tabs[TAB_INBOX].cur;
316
317
	const maxExt = ae.GetExtMsgCount();
318
	const maxInt = ae.GetIntMsgCount();
319
320
	tabs[TAB_INBOX].max = Math.floor((maxExt + maxInt) / rowsPerPage);
321
322
	let numExt = 0;
323
	let numInt = 0;
324
	let numAdd = 0;
325
326
	while (numAdd < rowsPerPage) {
327
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : -1;
328
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : -1;
329
		if (tsInt === -1 && tsExt === -1) break;
330
331
		if (tsInt !== -1 && (tsExt === -1 || tsInt > tsExt)) {
332
			if (skipMsgs > 0) skipMsgs--; else {addMsg(true, numInt); numAdd++;}
333
			numInt++;
334
		} else if (tsExt !== -1) {
335
			if (skipMsgs > 0) skipMsgs--; else {addMsg(false, numExt); numAdd++;}
336
			numExt++;
337
		}
338
	}
339
340
	if (ae.GetReadyMsgBytes() < ae.GetTotalMsgBytes()) {
341
		const inbox = document.getElementById("tbl_inbox");
342
		const row = inbox.insertRow(-1);
343
		const cell = row.insertCell(-1);
344
		cell.textContent = "Load more (" + (ae.GetTotalMsgBytes() - ae.GetReadyMsgBytes()) / 1024 + " KiB left)";
345
346
		row.onclick = function() {
347
			this.onclick = "";
348
349
			ae.Message_Browse(false, false, function(successBrowse) {
350
				document.getElementById("tbl_inbox").style.opacity = 1;
351
352
				if (successBrowse) {
353
					addMessages();
354
					addUploads();
355
					addSent();
356
					if (tabs[tab].cur < tabs[tab].max) document.getElementById("btn_rght").disabled = false;
357
				}
358
			});
359
		};
360
	}
361
}
362
363
function addUploads() {
364
	const tbl = document.getElementById("tbd_uploads");
365
	tbl.innerHTML = "";
366
367
	for (let i = 0; i < ae.GetUplMsgCount(); i++) {
368
		const row = tbl.insertRow(-1);
369
		row.setAttribute("data-msgid", ae.GetUplMsgIdHex(i));
370
371
		let cell;
372
		cell = row.insertCell(-1); cell.textContent = new Date(ae.GetUplMsgTime(i) * 1000).toISOString().slice(0, 10);
373
374
		cell = row.insertCell(-1); cell.textContent = ae.GetUplMsgTitle(i);
375
		cell.onclick = function() {displayFile(this.parentElement.rowIndex - 1);};
376
377
		cell = row.insertCell(-1); cell.textContent = (ae.GetUplMsgBytes(i) / 1024).toFixed(1);
378
379
		cell = row.insertCell(-1);
380
		if (ae.GetUplMsgIdHex(i)) {
381
			cell.innerHTML = "<button data-msgid=\"" + ae.GetUplMsgIdHex(i) + "\" type=\"button\">X</button>";
382
383
			cell.children[0].onclick = function() {
384
				const tr = this.parentElement.parentElement;
385
				ae.Message_Delete(this.getAttribute("data-msgid"), function(success) {
386
					if (success) tr.remove();
387
				});
388
			};
389
		}
390
	}
391
}
392
393
function displayOutMsg(num) {
394
	clearDisplay();
395
	document.getElementById("midright").scroll(0, 0);
396
	document.getElementById("midright").setAttribute("data-msgid", ae.GetOutMsgIdHex(num));
397
	document.getElementById("btn_reply").disabled = true;
398
	document.getElementById("btn_mdele").disabled = false;
399
	document.getElementById("midright").children[0].hidden = false;
400
	document.getElementById("midright").children[2].hidden = false;
401
402
//	if (isInt) {
403
		document.getElementById("midright").children[1].textContent = ae.GetOutMsgSubj(num);
404
		document.getElementById("midright").children[2].textContent = ae.GetOutMsgBody(num);
405
//	} else {
406
//	}
407
408
	document.getElementById("readmsg_to").textContent = ae.GetOutMsgTo(num);
409
	document.getElementById("readmsg_envfrom").hidden = false;
410
	document.getElementById("readmsg_envfrom").textContent = ae.GetOutMsgFrom(num);
411
412
	const ts = ae.GetOutMsgTime(num);
413
	const tzOs = new Date().getTimezoneOffset();
414
	const tz = ((tzOs < 0) ? "+" : "-") + Math.floor(tzOs / -60).toString().padStart(2, "0") + (tzOs % 60 * -1).toString().padStart(2, "0");
415
	document.getElementById("readmsg_date").children[0].textContent = new Date((ts * 1000) + (tzOs * -60000)).toISOString().slice(0, 19).replace("T", " ") + " " + tz;
416
417
//	if (!isInt) {
418
		document.getElementById("readmsg_ip").hidden = false;
419
		document.getElementById("readmsg_country").hidden = false;
420
		document.getElementById("readmsg_tls").hidden = false;
421
		document.getElementById("readmsg_greet").hidden = false;
422
423
//		const cc = ae.GetExtMsgCountry(num);
424
425
		document.getElementById("readmsg_ip").children[0].textContent = ae.GetOutMsgIp(num);
426
//		document.getElementById("readmsg_country").textContent = getCountryFlag(cc) + " " + getCountryName(cc);
427
//		document.getElementById("readmsg_tls").children[0].textContent = ae.GetOutMsgTLS(num);
428
		document.getElementById("readmsg_greet").children[0].textContent = ae.GetOutMsgGreet(num);
429
//		document.getElementById("readmsg_envfrom").textContent = ae.GetExtMsgFrom(num);
430
//	} else {
431
//	}
432
}
433
434
function addSent() {
435
	const tbl = document.getElementById("tbl_drbox");
436
	tbl.innerHTML = "";
437
438
	for (let i = 0; i < ae.GetOutMsgCount(); i++) {
439
		const row = tbl.insertRow(-1);
440
		row.setAttribute("data-msgid", ae.GetOutMsgIdHex(i));
441
442
		let cell;
443
		cell = row.insertCell(-1); cell.textContent = new Date(ae.GetOutMsgTime(i) * 1000).toISOString().slice(0, 10);
444
		cell = row.insertCell(-1); cell.textContent = ae.GetOutMsgSubj(i);
445
		row.onclick = function() {displayOutMsg(i);};
446
	}
447
}
448
449
function updateAddressCounts() {
450
	document.getElementById("limit_normal").textContent = (ae.GetAddressCountNormal() + "/" + ae.GetLimitNormalA(ae.GetUserLevel())).padStart(ae.GetLimitNormalA(ae.GetUserLevel()) > 9 ? 5 : 1);
451
	document.getElementById("limit_shield").textContent = (ae.GetAddressCountShield() + "/" + ae.GetLimitShieldA(ae.GetUserLevel())).padStart(ae.GetLimitShieldA(ae.GetUserLevel()) > 9 ? 5 : 1);
452
	document.getElementById("limit_total").textContent = ((ae.GetAddressCountNormal() + ae.GetAddressCountShield()) + "/" + ae.GetAddrPerUser()).padStart(5);
453
}
454
455
function adjustLevel(pubkey, level, c) {
456
	const fs = document.getElementById("fs_accs");
457
	fs.disabled = true;
458
459
	ae.Account_Update(pubkey, level, function(success) {
460
		fs.disabled = false;
461
462
		if (success) {
463
			c[4].textContent = level;
464
			c[5].children[0].disabled = (level === 3);
465
			c[6].children[0].disabled = (level === 0);
466
		}
467
	});
468
}
469
470
function addAccountToTable(i) {
471
	const tblAccs = document.getElementById("tbd_accs");
472
	const row = tblAccs.insertRow(-1);
473
	let cell;
474
	cell = row.insertCell(-1); cell.textContent = ae.Admin_GetUserPkHex(i);
475
	cell = row.insertCell(-1); cell.textContent = ae.Admin_GetUserSpace(i);
476
	cell = row.insertCell(-1); cell.textContent = ae.Admin_GetUserNAddr(i);
477
	cell = row.insertCell(-1); cell.textContent = ae.Admin_GetUserSAddr(i);
478
	cell = row.insertCell(-1); cell.textContent = ae.Admin_GetUserLevel(i);
479
480
	cell = row.insertCell(-1); cell.innerHTML = "<button type=\"button\" autocomplete=\"off\">+</button>";
481
	cell.children[0].onclick = function() {const c = this.parentElement.parentElement.cells; adjustLevel(c[0].textContent, parseInt(c[4].textContent) + 1, c);};
482
	cell.children[0].disabled = (ae.Admin_GetUserLevel(i) === 3);
483
484
	cell = row.insertCell(-1); cell.innerHTML = "<button type=\"button\" autocomplete=\"off\">&minus;</button>";
485
	cell.children[0].onclick = function() {const c = this.parentElement.parentElement.cells; adjustLevel(c[0].textContent, parseInt(c[4].textContent) - 1, c);};
486
	cell.children[0].disabled = (ae.Admin_GetUserLevel(i) === 0);
487
488
	cell = row.insertCell(-1); cell.innerHTML = "<button type=\"button\" autocomplete=\"off\">X</button>";
489
	cell.children[0].onclick = function() {
490
		const tr = this.parentElement.parentElement;
491
		ae.Account_Delete(tr.cells[0].textContent, function(success) {
492
			if (success) tr.remove();
493
		});
494
	};
495
}
496
497
function reloadAccount() {
498
	// Limits
499
	const tblLimits = document.getElementById("tbl_limits");
500
	if (ae.IsUserAdmin()) {
501
		for (let i = 0; i < 4; i++) {
502
			tblLimits.rows[i].cells[1].children[0].disabled = false;
503
			tblLimits.rows[i].cells[2].children[0].disabled = false;
504
			tblLimits.rows[i].cells[3].children[0].disabled = false;
505
506
			tblLimits.rows[i].cells[1].children[0].value = ae.GetLimitStorage(i) + 1;
507
			tblLimits.rows[i].cells[2].children[0].value = ae.GetLimitNormalA(i);
508
			tblLimits.rows[i].cells[3].children[0].value = ae.GetLimitShieldA(i);
509
		}
510
	} else {
511
		const lvl = ae.GetUserLevel();
512
		tblLimits.rows[lvl].cells[1].children[0].value = ae.GetLimitStorage(lvl) + 1;
513
		tblLimits.rows[lvl].cells[2].children[0].value = ae.GetLimitNormalA(lvl);
514
		tblLimits.rows[lvl].cells[3].children[0].value = ae.GetLimitShieldA(lvl);
515
	}
516
517
	// Accounts
518
	const tblAccs = document.getElementById("tbd_accs");
519
520
	// All: Our account
521
	const row = tblAccs.insertRow(-1);
522
	let cell;
523
	cell = row.insertCell(-1); cell.textContent = ae.GetUserPkHex();
524
	cell = row.insertCell(-1); cell.textContent = Math.round(ae.GetTotalMsgBytes() / 1024 / 1024);
525
	cell = row.insertCell(-1); cell.textContent = ae.GetAddressCountNormal();
526
	cell = row.insertCell(-1); cell.textContent = ae.GetAddressCountShield();
527
	cell = row.insertCell(-1); cell.textContent = ae.GetUserLevel();
528
	cell = row.insertCell(-1); cell.innerHTML = "<button type=\"button\" autocomplete=\"off\" disabled=\"disabled\">+</button>";
529
530
	cell = row.insertCell(-1); cell.innerHTML = "<button id=\"btn_downme\" type=\"button\" autocomplete=\"off\" disabled=\"disabled\">&minus;</button>";
531
	cell.children[0].onclick = function() {
532
		const newLevel = parseInt(row.cells[4].textContent) - 1;
533
		ae.Account_Update(ae.GetUserPkHex(), newLevel, function(success) {
534
			if (success) row.cells[4].textContent = newLevel;
535
		});
536
	};
537
538
	cell = row.insertCell(-1); cell.innerHTML = "<button id=\"btn_killme\" type=\"button\" autocomplete=\"off\" disabled=\"disabled\">X</button>";
539
	cell.children[0].onclick = function() {
540
		ae.Account_Delete(ae.GetUserPkHex(), function(success) {
541
			if (success) row.remove();
542
		});
543
	};
544
545
	document.getElementById("txt_reg").disabled = !ae.IsUserAdmin();
546
	document.getElementById("btn_reg").disabled = !ae.IsUserAdmin();
547
548
	// Contacts
549
	for (let i = 0; i < ae.GetContactCount(); i++) {
550
		addContact(
551
			ae.GetContactMail(i),
552
			ae.GetContactName(i),
553
			ae.GetContactNote(i)
554
		);
555
	}
556
557
	// Addresses
558
	for (let i = 0; i < ae.GetAddressCount(); i++) {
559
		addAddress(i);
560
	}
561
562
	updateAddressCounts();
563
	addMessages();
564
	addUploads();
565
	addSent();
566
}
567
568
function deleteAddress(addr) {
569
	let btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
570
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
571
572
	let addressToDelete = -1;
573
574
	for (let i = 0; i < ae.GetAddressCount(); i++) {
575
		if (addr === ae.GetAddress(i)) {
576
			addressToDelete = i;
577
			break;
578
		}
579
	}
580
581
	if (addressToDelete === -1) return;
582
583
	ae.Address_Delete(addressToDelete, function(success) {
584
		if (success) {
585
			document.getElementById("tbl_addrs").deleteRow(addressToDelete);
586
			document.getElementById("write_from").remove(addressToDelete);
587
			updateAddressCounts();
588
589
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) document.getElementById("btn_address_create_normal").disabled = false;
590
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) document.getElementById("btn_address_create_shield").disabled = false;
591
592
			ae.Private_Update(function(success2) {
593
				if (!success2) console.log("Failed to update the Private field");
594
595
				btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
596
				for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
597
			});
598
		} else {
599
			console.log("Failed to delete address");
600
601
			btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
602
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
603
		}
604
	});
605
}
606
607 View Code Duplication
function shieldMix(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
608
	let newAddr = "";
609
610
	for (let i = 0; i < 16; i++) {
611
		switch (addr.charAt(i)) {
612
			case '1':
613
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
614
				break;
615
			case '0':
616
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
617
				break;
618
			case 'w':
619
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
620
				break;
621
			default:
622
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
623
		}
624
	}
625
626
	return newAddr;
627
}
628
629
function addAddress(num) {
630
	const addrTable = document.getElementById("tbl_addrs");
631
	const row = addrTable.insertRow(-1);
632
	const cellAddr = row.insertCell(-1);
633
	const cellChk1 = row.insertCell(-1);
634
	const cellChk2 = row.insertCell(-1);
635
	const cellChk3 = row.insertCell(-1);
636
	const cellBtnD = row.insertCell(-1);
637
638
	cellAddr.textContent = ae.GetAddress(num);
639
	cellAddr.onclick = function() {
640
		if (cellAddr.textContent.length === 16)
641
			navigator.clipboard.writeText(shieldMix(cellAddr.textContent) + "@" + ae.GetDomainEml());
1 ignored issue
show
Bug introduced by
The variable navigator seems to be never declared. If this is a global, consider adding a /** global: navigator */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
642
		else
643
			navigator.clipboard.writeText(cellAddr.textContent + "@" + ae.GetDomainEml());
644
	};
645
646
	cellChk1.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
647
	cellChk2.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
648
	cellChk3.innerHTML = ae.GetAddressUse_Gk(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
649
650
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
651
	cellBtnD.onclick = function() {deleteAddress(cellAddr.textContent);};
652
653
	const opt = document.createElement("option");
654
	opt.value = cellAddr.textContent;
655
	opt.textContent = cellAddr.textContent + "@" + ae.GetDomainEml();
656
	document.getElementById("write_from").appendChild(opt);
657
}
658
659
document.getElementById("btn_dele").onclick = function() {
660
	this.blur();
661
662
	if (tab === TAB_WRITE) {
663
		tabs[tab].cur = 0;
664
		updateTab();
665
666
		document.getElementById("write_recv").value = "";
667
		document.getElementById("write_subj").value = "";
668
		document.getElementById("write_body").value = "";
669
670
		document.getElementById("write_recv").focus();
671
	}
672
};
673
674
document.getElementById("btn_updt").onclick = function() {
675
	const btn = this;
676
	btn.disabled = true;
677
	btn.blur();
678
679
	if (tab === TAB_INBOX) {
680
		document.getElementById("tbl_inbox").style.opacity = 0.5;
681
682
		ae.Message_Browse(true, false, function(successBrowse) {
683
			document.getElementById("tbl_inbox").style.opacity = 1;
684
685
			if (successBrowse) {
686
				addMessages();
687
				addUploads();
688
				btn.disabled = false;
689
			} else {
690
				console.log("Failed to refresh");
691
				btn.disabled = false;
692
			}
693
		});
694
	}
695
};
696
697
document.getElementById("btn_mdele").onclick = function() {
698
	const btn = this;
699
	btn.blur();
700
	btn.disabled = true;
701
702
	const delId = document.getElementById("midright").getAttribute("data-msgid");
703
	if (!delId) return;
704
705
	ae.Message_Delete(delId, function(success) {
706
		if (success) {
707
			["tbl_inbox", "tbl_drbox", "tbd_uploads"].forEach(function(tbl_name) {
708
				const tbl = document.getElementById(tbl_name);
709
				for (let i = 0; i < tbl.rows.length; i++) {if (tbl.rows[i].getAttribute("data-msgid") === delId) tbl.deleteRow(i);}
710
			});
711
712
			addMessages();
713
			addUploads();
714
			addSent();
715
		} else btn.disabled = false;
716
	});
717
};
718
719
function addContact(mail, name, note) {
720
	const tbl = document.getElementById("tbl_ctact");
721
	const row = tbl.insertRow(-1);
722
	const cellMail = row.insertCell(-1);
723
	const cellName = row.insertCell(-1);
724
	const cellNote = row.insertCell(-1);
725
	const cellBtnD = row.insertCell(-1);
726
727
	cellMail.textContent = mail;
728
	cellName.textContent = name;
729
	cellNote.textContent = note;
730
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
731
732
	cellMail.contentEditable = true;
733
	cellName.contentEditable = true;
734
	cellNote.contentEditable = true;
735
736
	cellBtnD.onclick = function() {row.remove();};
737
}
738
739
document.getElementById("btn_newcontact").onclick = function() {
740
	addContact("", "", "");
741
};
742
743
document.getElementById("btn_savecontacts").onclick = function() {
744
	while (ae.GetContactCount() > 0) {
745
		ae.DeleteContact(0);
746
	}
747
748
	for (const row of document.getElementById("tbl_ctact").rows) {
749
		ae.AddContact(row.cells[0].textContent, row.cells[1].textContent, row.cells[2].textContent);
750
	}
751
752
	const btn = this;
753
	btn.disabled = true;
754
755
	ae.Private_Update(function(success) {
756
		btn.disabled = false;
757
758
		if (!success) {
759
			console.log("Failed contacts update");
760
		}
761
	});
762
};
763
764
function writeVerify() {
765
	document.getElementById("div_write_1").hidden = true;
766
	document.getElementById("div_write_2").hidden = false;
767
768
	document.getElementById("write2_recv").textContent = document.getElementById("write_recv").value;
769
	document.getElementById("write2_subj").textContent = document.getElementById("write_subj").value;
770
	document.getElementById("write2_rply").textContent = document.getElementById("write_rply").textContent;
771
	document.getElementById("write2_body").textContent = document.getElementById("write_body").value;
772
773
	if (document.getElementById("write_recv").value.indexOf("@") >= 0)
774
		document.getElementById("write2_from").textContent = document.getElementById("write_from").value + "@" + ae.GetDomainEml();
775
	else
776
		document.getElementById("write2_from").textContent = document.getElementById("write_from").value;
777
778
//	document.getElementById("write2_pkey").textContent = sodium.to_hex(pk);
779
}
780
781
function updateTab() {
782
	switch (tab) {
783
		case TAB_INBOX:
784
			addMessages();
785
		break;
786
787
		case TAB_DRBOX:
788
			addSent();
789
		break;
790
791
		case TAB_WRITE:
792
			switch (tabs[tab].cur) {
793
				case 0: // Write
794
					document.getElementById("div_write_1").hidden = false;
795
					document.getElementById("div_write_2").hidden = true;
796
					document.getElementById("write_body").focus();
797
				break;
798
799
				case 1: // Verify
800
					if (document.getElementById("write_recv").value.indexOf("@") >= 0) {
801
						ae.Address_Lookup(document.getElementById("write_recv").value, function(pk) {
802
							if (!pk) {
803
								console.log("Failed lookup");
804
								return;
805
							}
806
807
							writeVerify();
808
						});
809
					} else writeVerify();
810
				break;
811
812
				case 2: // Send
813
					ae.Message_Create(
814
						document.getElementById("write_subj").value,
815
						document.getElementById("write_body").value,
816
						document.getElementById("write_from").value,
817
						document.getElementById("write_recv").value,
818
						document.getElementById("write_rply").textContent,
819
						(document.getElementById("write2_recv").textContent.indexOf("@") > 0) ? null : sodium.from_hex(document.getElementById("write2_pkey").textContent),
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
820
						function(success) {
821
							if (success) {
822
								console.log("Sent ok");
823
							} else {
824
								console.log("Failed sending");
825
							}
826
						}
827
					);
828
				break;
829
			}
830
		break;
831
832
		case TAB_NOTES:
833
			for (let i = 0; i <= tabs[tab].max; i++) {
834
				document.getElementById("div_notes").children[i].hidden = (i !== tabs[tab].cur);
835
			}
836
		break;
837
838
		case TAB_TOOLS:
839
			for (let i = 0; i <= tabs[tab].max; i++) {
840
				document.getElementById("div_tools").children[i].hidden = (i !== tabs[tab].cur);
841
			}
842
		break;
843
	}
844
845
	document.getElementById("btn_left").disabled = (tabs[tab].cur === 0);
846
	document.getElementById("btn_rght").disabled = (tabs[tab].cur === tabs[tab].max);
847
}
848
849
document.getElementById("btn_left").onclick = function() {
850
	tabs[tab].cur--;
851
	if (tabs[tab].cur === 0) this.disabled = true;
852
	if (tabs[tab].cur < tabs[tab].max) document.getElementById("btn_rght").disabled = false;
853
	updateTab();
854
	this.blur();
855
};
856
857
document.getElementById("btn_rght").onclick = function() {
858
	tabs[tab].cur++;
859
	if (tabs[tab].cur === tabs[tab].max) this.disabled = true;
860
	document.getElementById("btn_left").disabled = false;
861
	updateTab();
862
	this.blur();
863
};
864
865
const buttons = document.querySelector("#main1 > .top").getElementsByTagName("button");
866
for (let i = 0; i < buttons.length; i++) {
867
	buttons[i].onclick = function() {
868
		tab = i;
869
870
		for (let j = 0; j < buttons.length; j++) {
871
			document.querySelector("#main1 > .mid").children[j].hidden = (tab !== j);
872
			buttons[j].disabled = (tab === j);
873
		}
874
875
		document.getElementById("btn_left").disabled = (tabs[tab].cur === 0);
0 ignored issues
show
Bug introduced by
The variable tab is changed as part of the for loop for example by i on line 868. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
876
		document.getElementById("btn_rght").disabled = (tabs[tab].cur === tabs[tab].max);
877
		document.getElementById("btn_dele").disabled = !tabs[tab].btnDele;
878
		document.getElementById("btn_updt").disabled = !tabs[tab].btnUpdt;
879
	};
880
}
881
882
function addressCreate(addr) {
883
	const btnN = document.getElementById("btn_address_create_normal");
884
	const btnS = document.getElementById("btn_address_create_shield");
885
	btnN.disabled = true;
886
	btnS.disabled = true;
887
888
	ae.Address_Create(addr, function(success1) {
889
		if (success1) {
890
			ae.Private_Update(function(success2) {
891
				addAddress(ae.GetAddressCount() - 1);
892
				if (addr !== "SHIELD") document.getElementById("txt_address_create_normal").value = "";
893
				updateAddressCounts();
894
895
				if (!success2) console.log("Failed to update the Private field");
896
897
				if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
898
				if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
899
			});
900
		} else {
901
			console.log("Failed to add address");
902
903
			if (ae.GetAddressCountNormal() < ae.GetLimitNormalA(ae.GetUserLevel())) btnN.disabled = false;
904
			if (ae.GetAddressCountShield() < ae.GetLimitShieldA(ae.GetUserLevel())) btnS.disabled = false;
905
		}
906
	});
907
}
908
909
document.getElementById("btn_address_create_normal").onclick = function() {
910
	if (ae.GetAddressCountNormal() >= ae.GetLimitNormalA(ae.GetUserLevel())) return;
911
912
	const txtNewAddr = document.getElementById("txt_address_create_normal");
913
	if (!txtNewAddr.reportValidity()) return;
914
915
	addressCreate(txtNewAddr.value);
916
};
917
918
document.getElementById("btn_address_create_shield").onclick = function() {
919
	if (ae.GetAddressCountShield() >= ae.GetLimitShieldA(ae.GetUserLevel())) return;
920
921
	addressCreate("SHIELD");
922
};
923
924
document.getElementById("btn_address_update").onclick = function() {
925
	const btn = this;
926
	btn.disabled = true;
927
928
	const rows = document.getElementById("tbl_addrs").rows;
929
930
	for (let i = 0; i < rows.length; i++) {
931
		ae.SetAddressAccExt(i, rows[i].getElementsByTagName("input")[0].checked);
932
		ae.SetAddressAccInt(i, rows[i].getElementsByTagName("input")[1].checked);
933
		ae.SetAddressUse_Gk(i, rows[i].getElementsByTagName("input")[2].checked);
934
	}
935
936
	ae.Address_Update(function(success) {
937
		if (!success) console.log("Address/Update failed");
938
		btn.disabled = false;
939
	});
940
};
941
942
document.getElementById("btn_reg").onclick = function() {
943
	const btn = document.getElementById("btn_reg");
944
	const txt = document.getElementById("txt_reg");
945
	if (!txt.reportValidity()) return;
946
	btn.disabled = true;
947
948
	ae.Account_Create(txt.value, function(success) {
949
		if (success) {
950
			addAccountToTable(ae.Admin_GetUserCount() - 1);
951
			txt.value = "";
952
		}
953
954
		btn.disabled = false;
955
	});
956
};
957
958
document.getElementById("chk_downme").onclick = function() {document.getElementById("btn_downme").disabled = !this.checked;};
959
document.getElementById("chk_killme").onclick = function() {document.getElementById("btn_killme").disabled = !this.checked;};
960
961
document.getElementById("btn_notepad_saveupl").onclick = function() {
962
	const np = document.getElementById("txt_notepad");
963
	np.disabled = true;
964
965
	let fname = prompt("Save as...", "Untitled");
0 ignored issues
show
Debugging Code Best Practice introduced by
The prompt UI element is often considered obtrusive and is generally only used as a temporary measure. Consider replacing it with another UI element.
Loading history...
966
	if (!fname.endsWith(".txt")) fname += ".txt";
967
968
	ae.Message_Upload(fname, np.value, function(success) {
969
		if (success) {
970
			np.value = "";
971
			addUploads();
972
			document.getElementById("tbd_accs").children[0].children[1].textContent = Math.round(ae.GetTotalMsgBytes() / 1024 / 1024);
973
		}
974
975
		console.log("Failed to add text");
976
		np.disabled = false;
977
	});
978
};
979
980
document.getElementById("btn_upload").onclick = function() {
981
	const btn = this;
982
	const fileSelector = document.createElement("input");
983
	fileSelector.type = "file";
984
	fileSelector.click();
985
986
	fileSelector.onchange = function() {
987
		btn.disabled = true;
988
989
		const reader = new FileReader();
1 ignored issue
show
Bug introduced by
The variable FileReader seems to be never declared. If this is a global, consider adding a /** global: FileReader */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
990
		reader.onload = function() {
991
			ae.Message_Upload(fileSelector.files[0].name, new Uint8Array(reader.result), function(success) {
992
				if (success) {
993
					addUploads();
994
					document.getElementById("tbd_accs").children[0].children[1].textContent = Math.round(ae.GetTotalMsgBytes() / 1024 / 1024);
995
				} else {
996
					console.log("Failed upload");
997
				}
998
999
				btn.disabled = false;
1000
			});
1001
		};
1002
1003
		reader.readAsArrayBuffer(fileSelector.files[0]);
1004
	};
1005
};
1006
1007
document.getElementById("btn_pg").onclick = function() {
1008
	localStorage.greeting = document.getElementById("txt_pg").value;
1 ignored issue
show
Bug introduced by
The variable localStorage seems to be never declared. If this is a global, consider adding a /** global: localStorage */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
1009
};
1010
1011
document.getElementById("txt_skey").onkeyup = function(event) {
1012
	if (event.key === "Enter") {
1013
		event.preventDefault();
1014
		document.getElementById("btn_enter").click();
1015
	}
1016
};
1017
1018
document.getElementById("btn_enter").onclick = function() {
1019
	const txtSkey = document.getElementById("txt_skey");
1020
	if (!txtSkey.reportValidity()) return;
1021
1022
	const btn = this;
1023
	btn.disabled = true;
1024
	document.getElementById("txt_skey").style.background = "#233";
1025
1026
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
1027
		if (successSetKeys) {
1028
			ae.Message_Browse(false, true, function(successBrowse) {
1029
				if (successBrowse) {
1030
					txtSkey.value = "";
1031
					document.getElementById("div_begin").hidden = true;
1032
					document.getElementById("div_main").style.display = "grid";
1033
					reloadAccount();
1034
1035
					if (ae.IsUserAdmin()) {
1036
						ae.Account_Browse(function(successAcc) {
1037
							if (successAcc) {for (let i = 0; i < ae.Admin_GetUserCount(); i++) {addAccountToTable(i);}}
1038
							else console.log("Failed to Account_Browse");
1039
						});
1040
					}
1041
				} else {
1042
					console.log("Failed to enter");
1043
					btn.disabled = false;
1044
					document.getElementById("txt_skey").style.background = "#466";
1045
					txtSkey.focus();
1046
				}
1047
			});
1048
		} else {
1049
			console.log("Invalid format for key");
1050
			btn.disabled = false;
1051
			document.getElementById("txt_skey").style.background = "#466";
1052
			txtSkey.focus();
1053
		}
1054
	});
1055
};
1056
1057
});
1058