Passed
Push — master ( fc003c...9ffe8c )
by EMP
01:29
created

main.js ➔ reloadInterface   F

Complexity

Conditions 14

Size

Total Lines 66
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 14
eloc 42
dl 0
loc 66
rs 3.6
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like main.js ➔ reloadInterface 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() {
4
5
const ae = new AllEars(function(ok) {
6
	if (ok) {
7
		document.getElementById("btn_enter").disabled = false;
8
	} else {
9
		document.getElementById("begin_message").hidden = false;
10
		document.getElementById("begin_message").textContent = "Failed init";
11
	}
12
});
13
14
let page=0;
15
16
function navMenu(num) {
17
	document.getElementById("div_readmsg").hidden = true;
18
19
	const b = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
20
	const d = document.getElementsByClassName("maindiv");
21
22
	for (let i = 0; i < 5; i++) {
23
		if (i === num) {
24
			b[i].disabled = true;
25
			d[i].hidden = false;
26
		} else {
27
			b[i].disabled = false;
28
			d[i].hidden = true;
29
		}
30
	}
31
}
32
33
function getCountryFlag(countryCode) {
34
	return sodium.to_string(new Uint8Array([
35
		240, 159, 135, 166 + countryCode.codePointAt(0) - 65,
36
		240, 159, 135, 166 + countryCode.codePointAt(1) - 65
37
	]));
38
}
39
40
function deleteButtonShow(show) {
41
	if (show) {
42
		document.getElementById("btn_msgdel").hidden = false;
43
		return;
44
	}
45
46
	const checkboxes = document.getElementById("tbd_inbox").getElementsByTagName("input");
47
	let checked = false;
48
49
	for (let j = 0; j < checkboxes.length; j++) {
50
		if (checkboxes[j].checked) {
51
			checked = true;
52
			break;
53
		}
54
	}
55
56
	document.getElementById("btn_msgdel").hidden = !checked;
57
}
58
59
function addIntMessage(i) {
60
	const tbl = document.getElementById("tbd_inbox");
61
	const row = tbl.insertRow(-1);
62
63
	const ts = ae.getIntMsgTime(i);
64
	let cell = row.insertCell(-1);
65
	cell.setAttribute("data-ts", ts);
66
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
67
	cell.className = "mono";
68
69
	cell = row.insertCell(-1);
70
	cell.textContent = ae.getIntMsgTitle(i);
71
	cell.onclick = function() {
72
		navMenu(-1);
73
		document.getElementById("div_readmsg").hidden = false;
74
		document.getElementById("readmsg_head").hidden = false;
75
		document.getElementById("readmsg_levelinfo").hidden = false;
76
		document.getElementById("readmsg_extmsg").hidden = true;
77
78
		document.getElementById("readmsg_title").textContent = ae.getIntMsgTitle(i);
79
		document.getElementById("readmsg_from").textContent  = ae.getIntMsgFrom(i);
80
		document.getElementById("readmsg_to").textContent    = ae.getIntMsgTo(i);
81
		document.getElementById("readmsg_body").textContent  = ae.getIntMsgBody(i);
82
		document.getElementById("readmsg_level").textContent = ae.getIntMsgLevel(i);
83
84
		document.getElementById("readmsg_from").className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
85
		document.getElementById("readmsg_to").className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
86
	};
87
88
	// empty From1 cell
89
	row.insertCell(-1);
90
91
	cell = row.insertCell(-1);
92
	cell.textContent = ae.getIntMsgFrom(i);
93
	cell.className = (ae.getIntMsgFrom(i).length === 16) ? "mono" : "";
94
95
	cell = row.insertCell(-1);
96
	cell.textContent = ae.getIntMsgTo(i);
97
	cell.className = (ae.getIntMsgTo(i).length === 16) ? "mono" : "";
98
99
	cell = row.insertCell(-1);
100
	const el = document.createElement("input");
101
	el.className = "delMsg";
102
	el.type = "checkbox";
103
	el.setAttribute("data-id", ae.getIntMsgIdHex(i));
104
	el.onchange = function() {deleteButtonShow(this.checked);};
105
	cell.appendChild(el);
106
}
107
108
function addExtMessage(i) {
109
	const tbl = document.getElementById("tbd_inbox");
110
	const row = tbl.insertRow(-1);
111
112
	const ts = ae.getExtMsgTime(i);
113
	let cell = row.insertCell(-1);
114
	cell.setAttribute("data-ts", ts);
115
	cell.textContent = new Date(ts * 1000).toISOString().slice(0, 16).replace("T", " ");
116
	cell.className = "mono";
117
118
	cell = row.insertCell(-1);
119
	cell.textContent = ae.getExtMsgTitle(i);
120
	cell.onclick = function() {
121
		navMenu(-1);
122
		document.getElementById("div_readmsg").hidden = false;
123
		document.getElementById("readmsg_head").hidden = false;
124
		document.getElementById("readmsg_levelinfo").hidden = true;
125
		document.getElementById("readmsg_extmsg").hidden = false;
126
		document.getElementById("readmsg_greet").textContent = ae.getExtMsgGreet(i);
127
		document.getElementById("readmsg_tls").textContent = ae.getExtMsgTLS(i);
128
		document.getElementById("readmsg_ip").textContent = ae.getExtMsgIp(i);
129
130
		document.getElementById("readmsg_country").textContent = getCountryFlag(ae.getExtMsgCcode(i));
131
		document.getElementById("readmsg_country").title = ae.getExtMsgCname(i);
132
133
		const flags = document.getElementById("readmsg_flags").children;
134
		flags[0].hidden = ae.getExtMsgFlagPExt(i);
135
		flags[1].hidden = !ae.getExtMsgFlagRare(i);
136
		flags[2].hidden = !ae.getExtMsgFlagFail(i);
137
		flags[3].hidden = !ae.getExtMsgFlagPErr(i);
138
139
		document.getElementById("readmsg_title").textContent = ae.getExtMsgTitle(i);
140
		document.getElementById("readmsg_from").textContent = ae.getExtMsgEnvFrom(i);
141
		document.getElementById("readmsg_to").textContent = ae.getExtMsgEnvTo(i);
142
		document.getElementById("readmsg_body").innerHTML = ae.getExtMsgBody(i, false);
143
		document.getElementById("readmsg_headers").textContent = ae.getExtMsgHeaders(i);
144
145
		document.getElementById("readmsg_from").className = "";
146
		document.getElementById("readmsg_to").className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
147
	};
148
149
	const from = ae.getExtMsgHdrFrom(i);
150
	const from2 = from.substring(from.indexOf("@") + 1);
151
152
	cell = row.insertCell(-1);
153
	cell.textContent = from.substring(0, from.indexOf("@"));
154
155
	cell = row.insertCell(-1);
156
157
	let el = document.createElement("abbr");
158
	el.textContent = getCountryFlag(ae.getExtMsgCcode(i));
159
	el.title = ae.getExtMsgCname(i);
160
	cell.appendChild(el);
161
162
	el = document.createElement("span");
163
	el.textContent = " " + from2;
164
	cell.appendChild(el);
165
166
	cell = row.insertCell(-1);
167
	cell.textContent = ae.getExtMsgEnvTo(i);
168
	cell.className = (ae.getExtMsgEnvTo(i).length === 16) ? "mono" : "";
169
170
	cell = row.insertCell(-1);
171
	el = document.createElement("input");
172
	el.className = "delMsg";
173
	el.type = "checkbox";
174
	el.setAttribute("data-id", ae.getExtMsgIdHex(i));
175
	el.onchange = function() {deleteButtonShow(this.checked);};
176
	cell.appendChild(el);
177
}
178
179
function addMessages() {
180
	const maxExt = ae.getExtMsgCount();
181
	const maxInt = ae.getIntMsgCount();
182
183
	let numExt = 0;
184
	let numInt = 0;
185
186
	//TODO handle sent messages separately
187
188
	for (let i = 0; i < (page * 20) + 20; i++) {
189
		const tsInt = (numInt < maxInt) ? ae.getIntMsgTime(numInt) : 0;
190
		const tsExt = (numExt < maxExt) ? ae.getExtMsgTime(numExt) : 0;
191
		if (tsInt === 0 && tsExt === 0) break;
192
193
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
194
			if (i < (page * 20)) {
195
				numInt++;
196
				continue;
197
			}
198
199
			addIntMessage(numInt);
200
			numInt++;
201
		} else if (tsExt !== 0) {
202
			if (i < (page * 20)) {
203
				numExt++;
204
				continue;
205
			}
206
207
			addExtMessage(numExt);
208
			numExt++;
209
		}
210
	}
211
}
212
213
function addFile(num) {
214
	const table = document.getElementById("tbody_files");
215
	const row = table.insertRow(-1);
216
217
	let cell = row.insertCell(-1);
218
	cell.textContent = new Date(ae.getUplMsgTime(num) * 1000).toISOString().slice(0, 10);
219
220
	cell = row.insertCell(-1);
221
	cell.textContent = (ae.getUplMsgBytes(num) / 1024).toFixed(2);
222
223
	cell = row.insertCell(-1);
224
	cell.textContent = ae.getUplMsgTitle(num);
225
226
	cell = row.insertCell(-1);
227
	cell.innerHTML = "<button type=\"button\">D</button>";
228
	cell.children[0].onclick = function() {ae.downloadUplMsg(num);};
229
230
	cell = row.insertCell(-1);
231
	cell.innerHTML = "<button type=\"button\">X</button>";
232
	cell.children[0].onclick = function() {
233
		ae.Message_Delete([ae.getUplMsgIdHex(num)], function(error) {
234
			if (error === 0) {
235
				row.remove();
236
			} else {
237
				console.log("Failed deleting file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
238
			}
239
		});
240
	};
241
}
242
243
function destroyAccount(upk_hex) {
244
	const tbl = document.getElementById("tbody_admin");
245
246
	let rowid = -1;
247
248
	for (let i = 0; i < tbl.rows.length; i++) {
249
		if (upk_hex === tbl.rows[i].cells[0].textContent) {
250
			rowid = i;
251
			break;
252
		}
253
	}
254
255
	if (rowid === -1) return;
256
257
	ae.Account_Delete(upk_hex, function(error) {
258
		if (error === 0) {
259
			tbl.deleteRow(rowid);
260
		} else {
261
			console.log("Failed to destroy account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
262
		}
263
	});
264
}
265
266
function setAccountLevel(upk_hex, level) {
267
	const tbl = document.getElementById("tbody_admin");
268
269
	let rowid = -1;
270
271
	for (let i = 0; i < tbl.rows.length; i++) {
272
		if (tbl.rows[i].cells[0].textContent === upk_hex) {
273
			rowid = i;
274
			break;
275
		}
276
	}
277
278
	if (rowid === -1) return;
279
280
	ae.Account_Update(upk_hex, level, function(error) {
281
		if (error !== 0) {
282
			console.log("Failed to set account level");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
283
			return;
284
		}
285
286
		tbl.rows[rowid].cells[4].textContent = level;
287
288
		if (level === 0) {
289
			tbl.rows[rowid].cells[5].children[0].disabled = false;
290
			tbl.rows[rowid].cells[6].children[0].disabled = true;
291
		} else if (level === ae.getLevelMax()) {
292
			tbl.rows[rowid].cells[5].children[0].disabled = true;
293
			tbl.rows[rowid].cells[6].children[0].disabled = false;
294
		} else {
295
			tbl.rows[rowid].cells[5].children[0].disabled = false;
296
			tbl.rows[rowid].cells[6].children[0].disabled = false;
297
		}
298
299
		const pkHex = ae.admin_getUserUpk(rowid);
300
		const currentLevel = ae.admin_getUserLvl(rowid);
301
		tbl.rows[rowid].cells[5].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
302
		tbl.rows[rowid].cells[6].children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
303
	});
304
}
305
306
function deleteAddress(num) {
307
	if (num < 0) return;
308
309
	let btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
310
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
311
312
	ae.Address_Delete(num, function(error) {
313
		if (error !== 0) {
314
			console.log("Failed to delete address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
315
			return;
316
		}
317
318
		document.getElementById("tbody_opt_addr").deleteRow(num);
319
		document.getElementById("send_from").remove(num);
320
321
		document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
322
		document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
323
324
		if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) document.getElementById("btn_newaddress").disabled = false;
325
		if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) document.getElementById("btn_newshieldaddress").disabled = false;
326
327
		ae.Private_Update(function(error2) {
328
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
329
330
			btns = document.getElementById("tbody_opt_addr").getElementsByTagName("button");
331
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
332
		});
333
	});
334
}
335
336
function addCellbox(row, checked) {
337
	let cell = row.insertCell(-1);
338
	let el = document.createElement("input");
339
	el.type = "checkbox";
340
	el.checked = checked;
341
	cell.appendChild(el);
342
}
343
344
function addAddress(num) {
345
	const addrTable = document.getElementById("tbody_opt_addr");
346
	const row = addrTable.insertRow(-1);
347
348
	let cell = row.insertCell(-1);
349
	cell.textContent = ae.getAddress(num);
350
	if (cell.textContent.length === 16) cell.className = "mono";
351
	cell.onclick = function() {navigator.clipboard.writeText(((this.textContent.length === 16) ? ae.shieldMix(this.textContent) : this.textContent) + "@" + ae.getDomainEml());};
352
353
	addCellbox(row, ae.getAddressAccExt(num));
354
	addCellbox(row, ae.getAddressAccInt(num));
355
	addCellbox(row, ae.getAddressAllVer(num));
356
	addCellbox(row, ae.getAddressAttach(num));
357
	addCellbox(row, ae.getAddressSecure(num));
358
	addCellbox(row, ae.getAddressOrigin(num));
359
360
	cell = row.insertCell(-1);
361
	let el = document.createElement("button");
362
	el.type = "button";
363
	el.textContent = "X";
364
	el.onclick = function() {deleteAddress(num);};
365
	cell.appendChild(el);
366
367
	el = document.createElement("option");
368
	el.value = ae.getAddress(num);
369
	el.textContent = ae.getAddress(num) + "@" + ae.getDomainEml();
370
	document.getElementById("send_from").appendChild(el);
371
}
372
373
function clearMessages() {
374
	document.getElementById("tbd_inbox").innerHTML = "";
375
	document.getElementById("tbd_snbox").innerHTML = "";
376
	document.getElementById("tbody_files").innerHTML = "";
377
}
378
379
function delMsgs(tblName, btnName) {
380
	const cbs = document.getElementsByClassName("delMsg");
381
	const ids = [];
382
383
	for (let i = 0; i < cbs.length; i++) {
384
		if (cbs[i].checked) ids.push(cbs[i].getAttribute("data-id"));
385
	}
386
387
	if (ids.length > 0) ae.Message_Delete(ids, function(error) {
388
		if (error === 0) {
389
			clearMessages();
390
			addMessages();
391
			document.getElementById(btnName).hidden = true;
392
		} else {
393
			console.log("Failed to delete messages");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
394
		}
395
	});
396
}
397
398
function deleteContact(email) {
399
	const tbl = document.getElementById("tbody_notes_contact");
400
	const rows = tbl.rows;
401
402
	for (let i = 0; i < rows.length; i++) {
403
		if (email === rows[i].cells[0].textContent) {
404
			ae.deleteContact(i);
405
			tbl.deleteRow(i);
406
			break;
407
		}
408
	}
409
410
	document.getElementById("btn_savenotes").hidden = false;
411
}
412
413
function addContactToTable(mail, name, note) {
414
	const contactTable = document.getElementById("tbody_notes_contact");
415
	const row = contactTable.insertRow(-1);
416
	const cellMail = row.insertCell(-1);
417
	const cellName = row.insertCell(-1);
418
	const cellNote = row.insertCell(-1);
419
	const cellBtnD = row.insertCell(-1);
420
421
	cellMail.className = "left";
422
	cellName.className = "left";
423
	cellNote.className = "left";
424
425
	cellMail.textContent = mail;
426
	cellName.textContent = name;
427
	cellNote.textContent = note;
428
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
429
430
	cellBtnD.onclick = function() {deleteContact(mail);};
431
}
432
433
function addRowAdmin(num) {
434
	const table = document.getElementById("tbody_admin");
435
436
	const row = table.insertRow(-1);
437
	const cellPk = row.insertCell(-1);
438
	const cellMb = row.insertCell(-1);
439
	const cellNa = row.insertCell(-1);
440
	const cellSa = row.insertCell(-1);
441
	const cellLv = row.insertCell(-1);
442
	const cellBtnPl = row.insertCell(-1);
443
	const cellBtnMn = row.insertCell(-1);
444
	const cellBtnDe = row.insertCell(-1);
445
446
	cellPk.textContent = ae.admin_getUserUpk(num);
447
	cellMb.textContent = Math.round(ae.admin_getUserKib(num) / 1024);
448
	cellNa.textContent = ae.admin_getUserNrm(num);
449
	cellSa.textContent = ae.admin_getUserShd(num);
450
	cellLv.textContent = ae.admin_getUserLvl(num);
451
	cellBtnPl.innerHTML = "<button type=\"button\">+</button>";
452
	cellBtnMn.innerHTML = "<button type=\"button\">-</button>";
453
	cellBtnDe.innerHTML = "<button type=\"button\">X</button>";
454
455
	cellPk.className = "mono";
456
	if (ae.admin_getUserLvl(num) === ae.getLevelMax()) cellBtnPl.children[0].disabled = true;
457
	if (ae.admin_getUserLvl(num) === 0) cellBtnMn.children[0].disabled = true;
458
459
	const pkHex = ae.admin_getUserUpk(num);
460
	const currentLevel = ae.admin_getUserLvl(num);
461
	cellBtnPl.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel + 1);};
462
	cellBtnMn.children[0].onclick = function() {setAccountLevel(pkHex, currentLevel - 1);};
463
	cellBtnDe.children[0].onclick = function() {destroyAccount(pkHex);};
464
}
465
466
function reloadInterface() {
467
	if (!ae.isUserAdmin()) document.getElementById("btn_toadmin").hidden = true;
468
	document.getElementById("div_begin").hidden = true;
469
	document.getElementById("div_allears").hidden = false;
470
471
	clearMessages();
472
	document.getElementById("tbody_admin").innerHTML = "";
473
	document.getElementById("tbody_files").innerHTML = "";
474
	document.getElementById("tbody_notes_contact").innerHTML = "";
475
	document.getElementById("tbody_opt_addr").innerHTML = "";
476
477
	// Contacts
478
	for (let i = 0; i < ae.getContactCount(); i++) {
479
		addContactToTable(
480
			ae.getContactMail(i),
481
			ae.getContactName(i),
482
			ae.getContactNote(i)
483
		);
484
	}
485
486
	// Addresses
487
	for (let i = 0; i < ae.getAddressCount(); i++) {
488
		addAddress(i);
489
	}
490
491
	document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
492
	document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
493
	document.getElementById("addr_max_normal").textContent = ae.getLimitNormalA(ae.getOwnLevel());
494
	document.getElementById("addr_max_shield").textContent = ae.getLimitShieldA(ae.getOwnLevel());
495
496
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getOwnLevel())) document.getElementById("btn_newaddress").disabled = true;
497
	if (ae.getAddressCountShield() >= ae.getLimitShieldA(ae.getOwnLevel())) document.getElementById("btn_newshieldaddress").disabled = true;
498
499
	if (ae.isUserAdmin()) {
500
		const tblLimits = document.getElementById("tbl_limits");
501
		for (let i = 0; i < 4; i++) {
502
			tblLimits.rows[i].cells[1].children[0].value = ae.getLimitStorage(i);
503
			tblLimits.rows[i].cells[2].children[0].value = ae.getLimitNormalA(i);
504
			tblLimits.rows[i].cells[3].children[0].value = ae.getLimitShieldA(i);
505
		}
506
507
		document.getElementById("btn_admin_savelimits").onclick = function() {
508
			const storageLimit = [];
509
			const addrNrmLimit = [];
510
			const addrShdLimit = [];
511
512
			for (let i = 0; i < 4; i++) {
513
				storageLimit[i] = tblLimits.rows[i].cells[1].children[0].value;
514
				addrNrmLimit[i] = tblLimits.rows[i].cells[2].children[0].value;
515
				addrShdLimit[i] = tblLimits.rows[i].cells[3].children[0].value;
516
			}
517
518
			ae.setLimits(storageLimit, addrNrmLimit, addrShdLimit, function(error) {
519
				if (error !== 0) {
520
					console.log("Failed to update limits");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
521
				}
522
			});
523
		};
524
525
		ae.Account_Browse(function(error) {
0 ignored issues
show
Unused Code introduced by
The parameter error is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
526
			for (let i = 0; i < ae.admin_getUserNum(); i++) {
527
				addRowAdmin(i);
528
			}
529
		});
530
	}
531
}
532
533
document.getElementById("btn_inbox_prev").onclick = function() {
534
	if (page > 0) {
535
		page--;
536
		clearMessages();
537
		addMessages();
538
		this.disabled = (page === 0);
539
	}
540
};
541
542
document.getElementById("btn_inbox_next").onclick = function() {
543
// TODO: Check if page too high
544
//	if (page > 0) {
545
		page++;
546
		clearMessages();
547
		addMessages();
548
		document.getElementById("btn_inbox_prev").disabled = false;
549
//	}
550
};
551
552
document.getElementById("btn_enter").onclick = function() {
553
	const txtSkey = document.getElementById("txt_skey");
554
	if (!txtSkey.reportValidity()) return;
555
556
	const btn = this;
557
	btn.disabled = true;
558
559
	ae.setKeys(txtSkey.value, function(success) {
560
		if (!success) {
561
			document.getElementById("begin_message").hidden = false;
562
			document.getElementById("begin_message").textContent = "Error: Invalid key format";
563
			btn.disabled = false;
564
			return;
565
		}
566
567
		ae.Message_Browse(false, true, function(statusBrowse) {
568
			if (statusBrowse !== 0) {
569
				document.getElementById("begin_message").hidden = false;
570
				document.getElementById("begin_message").textContent = "Error: " + ae.getErrorMessage(statusBrowse);
571
				btn.disabled = false;
572
				return;
573
			}
574
575
			txtSkey.value = "";
576
			reloadInterface();
577
			document.getElementById("btn_refresh").click();
578
		});
579
	});
580
};
581
582
document.getElementById("btn_refresh").onclick = function() {
583
	const btn = this;
584
	btn.disabled = true;
585
586
	ae.Message_Browse(true, false, function(error) {
587
		if (error === 0) {
588
			clearMessages();
589
			addMessages();
590
			for (let i = ae.getUplMsgCount() - 1; i >= 0; i--) {addFile(i);}
591
		} else {
592
			console.log("Failed to refresh");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
593
		}
594
595
		btn.disabled = false;
596
	});
597
};
598
599
document.getElementById("btn_contact_add").onclick = function() {
600
	const txtMail = document.getElementById("txt_newcontact_mail");
601
	const txtName = document.getElementById("txt_newcontact_name");
602
	const txtNote = document.getElementById("txt_newcontact_note");
603
604
	addContactToTable(txtMail.value, txtName.value, txtNote.value);
605
	ae.addContact(txtMail.value, txtName.value, txtNote.value);
606
607
	txtMail.value = "";
608
	txtName.value = "";
609
	txtNote.value = "";
610
611
	document.getElementById("btn_savenotes").hidden = false;
612
};
613
614
document.getElementById("btn_savenotes").onclick = function() {
615
	ae.Private_Update(function(error) {
616
		if (error === 0) {
617
			document.getElementById("btn_savenotes").hidden = true;
618
		} else {
619
			console.log("Failed to save note data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
620
		}
621
	});
622
};
623
624
document.getElementById("btn_msgdel").onclick = function() {
625
	delMsgs("tbody_inbox", "btn_msgdel");
626
};
627
628
document.getElementById("btn_sentdel").onclick = function() {
629
	delMsgs("tbody_sentbox", "btn_sentdel");
630
};
631
632
document.getElementById("btn_send").onclick = function() {
633
	const btn = this;
634
	btn.disabled = true;
635
636
	const sfrom = document.getElementById("send_from");
637
	const stitle = document.getElementById("send_title");
638
	const sto = document.getElementById("send_to");
639
	const sbody = document.getElementById("send_body");
640
641
	if (!stitle.reportValidity() || !sto.reportValidity() || !sbody.reportValidity()) return;
642
643
	ae.Message_Create(stitle.value, sbody.value, sfrom.value, sto.value, null, null, function(error) {
644
		if (error === 0) {
645
			stitle.value = "";
646
			sto.value = "";
647
			sbody.value = "";
648
		} else {
649
			console.log("Failed sending message: " + ae.getErrorMessage(error));
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
650
		}
651
652
		btn.disabled = false;
653
	});
654
};
655
656
document.getElementById("btn_newaddress").onclick = function() {
657
	if (ae.getAddressCountNormal() >= ae.getLimitNormalA(ae.getOwnLevel())) return;
658
659
	const txtNewAddr = document.getElementById("txt_newaddress");
660
	if (!txtNewAddr.reportValidity()) return;
661
662
	const btnN = document.getElementById("btn_newaddress");
663
	const btnS = document.getElementById("btn_newshieldaddress");
664
	btnN.disabled = true;
665
	btnS.disabled = true;
666
667
	ae.Address_Create(txtNewAddr.value, function(error1) {
668
		if (error1 === 0) {
669
			ae.Private_Update(function(error2) {
670
				document.getElementById("addr_use_normal").textContent = ae.getAddressCountNormal();
671
				addAddress(ae.getAddressCount() - 1);
672
				txtNewAddr.value = "";
673
674
				if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
675
				if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
676
				if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
677
			});
678
		} else {
679
			console.log("Failed to add address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
680
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
681
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
682
		}
683
	});
684
};
685
686
document.getElementById("btn_newshieldaddress").onclick = function() {
687
	if (ae.getLimitShieldA() >= ae.getLimitShieldA(ae.getOwnLevel())) return;
688
689
	const btnN = document.getElementById("btn_newaddress");
690
	const btnS = document.getElementById("btn_newshieldaddress");
691
	btnN.disabled = true;
692
	btnS.disabled = true;
693
694
	ae.Address_Create("SHIELD", function(error1) {
695
		if (error1 !== 0) {
696
			console.log("Failed to add Shield address");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
697
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
698
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
699
			return;
700
		}
701
702
		ae.Private_Update(function(error2) {
703
			document.getElementById("addr_use_shield").textContent = ae.getAddressCountShield();
704
			addAddress(ae.getAddressCount() - 1);
705
706
			if (error2 !== 0) console.log("Failed to update the Private field");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
707
			if (ae.getAddressCountNormal() < ae.getLimitNormalA(ae.getOwnLevel())) btnN.disabled = false;
708
			if (ae.getAddressCountShield() < ae.getLimitShieldA(ae.getOwnLevel())) btnS.disabled = false;
709
		});
710
	});
711
};
712
713
document.getElementById("btn_saveaddrdata").onclick = function() {
714
	const tbl = document.getElementById("tbody_opt_addr");
715
716
	for (let i = 0; i < tbl.rows.length; i++) {
717
		ae.setAddressAccExt(i, tbl.rows[i].cells[1].firstChild.checked);
718
		ae.setAddressAccInt(i, tbl.rows[i].cells[2].firstChild.checked);
719
	}
720
721
	ae.Address_Update(function(error) {
722
		if (error === 0) {
723
			document.getElementById("btn_saveaddrdata").hidden = true;
724
		} else {
725
			console.log("Failed to save address data");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
726
		}
727
	});
728
};
729
730
document.getElementById("btn_admin_addaccount").onclick = function() {
731
	const txtPkey = document.getElementById("txt_newacc_pkey");
732
733
	if (!txtPkey.reportValidity()) return;
734
735
	const btn = document.getElementById("btn_admin_addaccount");
736
	btn.disabled = true;
737
738
	ae.Account_Create(txtPkey.value, function(error) {
739
		if (error === 0) {
740
			addRowAdmin(ae.admin_getUserNum() - 1);
741
			txtPkey.value = "";
742
		} else {
743
			console.log("Failed to add account");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
744
		}
745
	});
746
747
	btn.disabled = false;
748
};
749
750
document.getElementById("upfile").onchange = function() {
751
	const fn = this.files[0].name;
752
	const reader = new FileReader();
753
754
	reader.onload = function() {
755
		ae.Message_Upload(fn, new Uint8Array(reader.result), function(error) {
756
			if (error === 0) {
757
				addFile(0);
758
				document.getElementById("upfile").value = "";
759
			} else {
760
				console.log("Failed to upload file");
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
761
			}
762
		});
763
	};
764
765
	reader.readAsArrayBuffer(this.files[0]);
766
};
767
768
function navNotesMenu(num) {
769
	for (let i = 0; i < 3; i++) {
770
		const isCurrent = (i === num);
771
		document.getElementById("div_notes").children[0].children[i].disabled = isCurrent;
772
		document.getElementById("div_notes").children[1 + i].hidden = !isCurrent;
773
	}
774
}
775
776
let btns = document.getElementsByTagName("nav")[0].getElementsByTagName("button");
777
btns[0].onclick = function() {navMenu(0);};
778
btns[1].onclick = function() {navMenu(1);};
779
btns[2].onclick = function() {navMenu(2);};
780
btns[3].onclick = function() {navMenu(3);};
781
btns[4].onclick = function() {navMenu(4);};
782
783
btns = document.getElementById("div_notes").getElementsByTagName("button");
784
btns[0].onclick = function() {navNotesMenu(0);};
785
btns[1].onclick = function() {navNotesMenu(1);};
786
btns[2].onclick = function() {navNotesMenu(2);};
787
788
document.getElementById("txt_skey").onkeyup = function(e) {
789
	if (e.key === "Enter") document.getElementById("btn_enter").click();
790
};
791
792
navMenu(0);
793
794
});
795