Passed
Push — master ( 1d253a...3227c2 )
by EMP
01:29
created

main.js ➔ addMessages   F

Complexity

Conditions 14

Size

Total Lines 56
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 38
dl 0
loc 56
rs 3.6
c 0
b 0
f 0
cc 14

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 ➔ addMessages 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
		document.getElementById("txt_skey").style.background = "#404b41";
8
		document.getElementById("txt_skey").maxLength = "64";
9
	} else {
10
		console.log("Failed to load All-Ears");
11
	}
12
});
13
14
let tab="inbox";
15
let page=0;
16
17
// Helper functions
18
function getCountryName(countryCode) {
19
	const opts = document.getElementById("gatekeeper_country");
20
21
	for (let i = 0; i < opts.length; i++) {
22
		if (opts[i].value === countryCode) {
23
			return opts[i].textContent;
24
		}
25
	}
26
27
	return "Unknown countrycode: " + countryCode;
28
}
29
30
function getCountryFlag(countryCode) {
31
	const regionalIndicator1 = 127462 + countryCode.codePointAt(0) - 65;
32
	const regionalIndicator2 = 127462 + countryCode.codePointAt(1) - 65;
33
	return "&#" + regionalIndicator1 + ";&#" + regionalIndicator2 + ";";
34
}
35
36
function displayMsg(isInt, num) {
37
	document.getElementById("midright").scroll(0, 0);
38
39
	const ts = isInt? ae.GetIntMsgTime(num) : ae.GetExtMsgTime(num);
40
41
	document.getElementById("btn_reply").disabled = false;
42
	document.getElementById("btn_reply").onclick = function() {
43
		document.getElementById("write_recv").value = isInt ? ae.GetIntMsgFrom(num) : ae.GetExtMsgFrom(num);
44
		document.getElementById("write_subj").value = "Re: " + (isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num));
45
		document.getElementById("btn_write").click();
46
		document.getElementById("div_write_1").hidden = false;
47
		document.getElementById("div_write_2").hidden = true;
48
		document.getElementById("write_body").focus();
49
		for (const opt of document.getElementById("write_from").options) {
50
			if (opt.value === (isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num))) {
51
				opt.selected = true;
52
			}
53
		}
54
	};
55
56
	document.getElementById("msg").hidden = false;
57
	document.getElementById("msg").getElementsByTagName("h1")[0].textContent = isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num);
58
	document.getElementById("msg").getElementsByTagName("pre")[0].textContent = isInt ? ae.GetIntMsgBody(num) : ae.GetExtMsgBody(num);
59
60
	document.getElementById("readmsg_to").textContent = isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num);
61
	document.getElementById("readmsg_date").children[0].textContent = new Date(ts * 1000).toISOString().slice(0, 19).replace("T", " ");
62
63
	if (!isInt) {
64
		document.getElementById("readmsg_ip").hidden = false;
65
		document.getElementById("readmsg_flags").hidden = false;
66
		document.getElementById("readmsg_country").hidden = false;
67
		document.getElementById("readmsg_tls").hidden = false;
68
		document.getElementById("readmsg_greet").hidden = false;
69
		document.getElementById("readmsg_timing").hidden = false;
70
		document.getElementById("readmsg_envfrom").hidden = false;
71
72
		const cc = ae.GetExtMsgCountry(num);
73
74
		document.getElementById("readmsg_ip").children[0].textContent = ae.GetExtMsgIp(num);
75
		document.getElementById("readmsg_country").innerHTML = getCountryFlag(cc) + " " + getCountryName(cc);
76
		document.getElementById("readmsg_tls").children[0].textContent = ae.GetExtMsgTLS(num);
77
		document.getElementById("readmsg_greet").children[0].textContent = ae.GetExtMsgGreet(num);
78
		document.getElementById("readmsg_envfrom").textContent = ae.GetExtMsgFrom(num);
79
80
		let flagText = "";
81
		if (!ae.GetExtMsgFlagPExt(num)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
82
		if (!ae.GetExtMsgFlagQuit(num)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
83
		if (ae.GetExtMsgFlagRare(num)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
84
		if (ae.GetExtMsgFlagFail(num)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
85
		if (ae.GetExtMsgFlagPErr(num)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
86
		document.getElementById("readmsg_flags").children[0].innerHTML = flagText.trim();
87
	} else {
88
		document.getElementById("readmsg_ip").hidden = true;
89
		document.getElementById("readmsg_flags").hidden = true;
90
		document.getElementById("readmsg_country").hidden = true;
91
		document.getElementById("readmsg_tls").hidden = true;
92
		document.getElementById("readmsg_greet").hidden = true;
93
		document.getElementById("readmsg_timing").hidden = true;
94
		document.getElementById("readmsg_envfrom").hidden = true;
95
96
		let symbol = "<span title=\"Invalid level\">&#x26a0;</span>";
97
		if (ae.GetIntMsgFrom(num) === "system") {if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"System\">&#x1f162;</span>";} // S (System)
98
		else if (ae.GetIntMsgLevel(num) === 0) symbol = "<span title=\"Level 0 User\">&#x1f10c;</span>"; // 0
99
		else if (ae.GetIntMsgLevel(num) === 1) symbol = "<span title=\"Level 1 User\">&#x278a;</span>"; // 1
100
		else if (ae.GetIntMsgLevel(num) === 2) symbol = "<span title=\"Level 2 User\">&#x278b;</span>"; // 2
101
		else if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"Administrator\">&#x1f150;</span>"; // A (Admin)
102
103
		document.getElementById("readmsg_from").innerHTML = symbol + " " + ae.GetIntMsgFrom(num);
104
	}
105
}
106
107
// Interface
108
function addMsg(isInt, i) {
109
	const inbox = document.getElementById("tbl_inbox");
110
	const sent = document.getElementById("tbl_sent");
111
112
	const isSent = false; //TODO
113
	const table = isSent ? sent : inbox;
114
115
	const row = table.insertRow(-1);
116
	const cellTime = row.insertCell(-1);
117
	const cellSubj = row.insertCell(-1);
118
	const cellSnd1 = row.insertCell(-1);
119
	const cellSnd2 = row.insertCell(-1);
120
121
	const ts = isInt? ae.GetIntMsgTime(i) : ae.GetExtMsgTime(i);
122
	cellTime.setAttribute("data-ts", ts);
123
	cellTime.textContent = new Date(ts * 1000).toISOString().slice(0, 10);
124
125
	cellSubj.textContent = isInt? ae.GetIntMsgTitle(i) : ae.GetExtMsgTitle(i);
126
127
	if (isInt) {
128
		cellSnd1.textContent = ae.GetIntMsgFrom(i);
129
		cellSnd1.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
130
	} else {
131
		const from1 = ae.GetExtMsgFrom(i);
132
		const from2 = from1.substring(from1.indexOf("@") + 1);
133
		const cc = ae.GetExtMsgCountry(i);
134
135
		cellSnd1.textContent = from1.substring(0, from1.indexOf("@"));
136
		cellSnd2.innerHTML = "<abbr title=\"" + getCountryName(cc) + "\">" + getCountryFlag(cc) + "</abbr>";
137
138
		const fromText = document.createElement("span");
139
		fromText.textContent = " " + from2;
140
		cellSnd2.appendChild(fromText);
141
	}
142
143
//	divDel.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetIntMsgIdHex(i) + "\">";
144
145
	row.onclick = function() {
146
		displayMsg(isInt, i);
147
	};
148
/*
149
	cellDel.children[0].onchange = function() {
150
		if (!divDel.children[0].checked) {
151
			const checkboxes = elmt.getElementsByTagName("input");
152
			let checked = false;
153
154
			for (let j = 0; j < checkboxes.length; j++) {
155
				if (checkboxes[j].checked) {
156
					checked = true;
157
					break;
158
				}
159
			}
160
161
			if (!checked) {
162
				document.getElementById(isSent ? "btn_sentdel" : "btn_msgdel").hidden = true;
163
				return;
164
			}
165
		}
166
167
		document.getElementById(isSent? "btn_sentdel" : "btn_msgdel").hidden = false;
168
	};
169
*/
170
}
171
172
function addMessages() {
173
	const tbl = document.getElementById("tbl_inbox");
174
	tbl.innerHTML = "";
175
	const row = tbl.insertRow(-1);
176
	const cell = row.insertCell(-1);
177
	cell.textContent = "0";
178
179
	const rowsPerPage = Math.floor(getComputedStyle(document.querySelector("#div_inbox")).height.replace("px", "") / getComputedStyle(document.querySelector("#tbl_inbox > tbody > tr:first-child")).height.replace("px", "")) - 1; // -1 allows space for 'load more'
180
	if (typeof(rowsPerPage) !== "number") return;
181
	let skipMsgs = rowsPerPage * page;
182
183
	tbl.innerHTML = "";
184
185
	const maxExt = ae.GetExtMsgCount();
186
	const maxInt = ae.GetIntMsgCount();
187
188
	let numExt = 0;
189
	let numInt = 0;
190
	let numAdd = 0;
191
192
	while (numAdd < rowsPerPage) {
193
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
194
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
195
		if (tsInt === 0 && tsExt === 0) break;
196
197
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
198
			if (skipMsgs > 0) skipMsgs--; else {addMsg(true, numInt); numAdd++;}
199
			numInt++;
200
		} else if (tsExt !== 0) {
201
			if (skipMsgs > 0) skipMsgs--; else {addMsg(false, numExt); numAdd++;}
202
			numExt++;
203
		}
204
	}
205
206
	if (ae.GetReadyMsgKilos() < ae.GetTotalMsgKilos()) {
207
		const inbox = document.getElementById("tbl_inbox");
208
		const row = inbox.insertRow(-1);
209
		const cell = row.insertCell(-1);
210
		cell.textContent = "Load more (" + (ae.GetTotalMsgKilos() - ae.GetReadyMsgKilos()) + " KiB left)";
211
212
		row.onclick = function() {
213
			this.onclick = "";
214
215
			ae.Message_Browse(false, function(successBrowse) {
216
				document.getElementById("tbl_inbox").style.opacity = 1;
217
218
				if (successBrowse) {
219
					addMessages();
220
				}
221
			});
222
		};
223
	}
224
225
	document.getElementById("btn_left").disabled = (page === 0);
226
	document.getElementById("btn_rght").disabled = ((rowsPerPage * page) + numAdd >= maxExt + maxInt);
227
}
228
229
function updateAddressCounts() {
230
	document.getElementById("limit_normal").textContent = (ae.GetAddressCountNormal() + "/" + ae.GetAddressLimitNormal(ae.GetUserLevel())).padStart(ae.GetAddressLimitNormal(ae.GetUserLevel()) > 9 ? 5 : 1);
231
	document.getElementById("limit_shield").textContent = (ae.GetAddressCountShield() + "/" + ae.GetAddressLimitShield(ae.GetUserLevel())).padStart(ae.GetAddressLimitShield(ae.GetUserLevel()) > 9 ? 5 : 1);
232
	document.getElementById("limit_total").textContent = ((ae.GetAddressCountNormal() + ae.GetAddressCountShield()) + "/" + ae.GetAddrPerUser()).padStart(5);
233
}
234
235
function reloadInterface() {
236
	document.getElementById("div_begin").hidden = true;
237
	document.getElementById("div_main").style.display = "grid";
238
239
	// Contacts
240
	for (let i = 0; i < ae.GetContactCount(); i++) {
241
		addContact(
242
			ae.GetContactMail(i),
243
			ae.GetContactName(i),
244
			ae.GetContactNote(i)
245
		);
246
	}
247
248
	// Addresses
249
	for (let i = 0; i < ae.GetAddressCount(); i++) {
250
		addAddress(i);
251
	}
252
253
	document.getElementById("table_addrs").getElementsByTagName("caption")[0].textContent = "Level " + ae.GetUserLevel() + " User";
254
	updateAddressCounts();
255
}
256
257 View Code Duplication
function deleteAddress(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
258
	let btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
259
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
260
261
	let addressToDelete = -1;
262
263
	for (let i = 0; i < ae.GetAddressCount(); i++) {
264
		if (addr === ae.GetAddress(i)) {
265
			addressToDelete = i;
266
			break;
267
		}
268
	}
269
270
	if (addressToDelete === -1) return;
271
272
	ae.Address_Delete(addressToDelete, function(success) {
273
		if (success) {
274
			document.getElementById("tbl_addrs").deleteRow(addressToDelete);
275
			document.getElementById("write_from").remove(addressToDelete);
276
			updateAddressCounts();
277
278
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) document.getElementById("btn_address_create_normal").disabled = false;
279
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) document.getElementById("btn_address_create_shield").disabled = false;
280
281
			ae.Private_Update(function(success2) {
282
				if (!success2) console.log("Failed to update the Private field");
283
284
				btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
285
				for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
286
			});
287
		} else {
288
			console.log("Failed to delete address");
289
290
			btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
291
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
292
		}
293
	});
294
}
295
296 View Code Duplication
function shieldMix(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
297
	let newAddr = "";
298
299
	for (let i = 0; i < 16; i++) {
300
		switch (addr.charAt(i)) {
301
			case '1':
302
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
303
				break;
304
			case '0':
305
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
306
				break;
307
			case 'w':
308
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
309
				break;
310
			default:
311
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
312
		}
313
	}
314
315
	return newAddr;
316
}
317
318
function addAddress(num) {
319
	const addrTable = document.getElementById("tbl_addrs");
320
	const row = addrTable.insertRow(-1);
321
	const cellAddr = row.insertCell(-1);
322
	const cellChk1 = row.insertCell(-1);
323
	const cellChk2 = row.insertCell(-1);
324
	const cellChk3 = row.insertCell(-1);
325
	const cellBtnD = row.insertCell(-1);
326
327
	cellAddr.textContent = ae.GetAddress(num);
328
	cellAddr.onclick = function() {
329
		if (cellAddr.textContent.length === 16)
330
			navigator.clipboard.writeText(shieldMix(cellAddr.textContent) + "@" + ae.GetDomain());
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...
331
		else
332
			navigator.clipboard.writeText(cellAddr.textContent + "@" + ae.GetDomain());
333
	};
334
335
	cellChk1.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
336
	cellChk2.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
337
	cellChk3.innerHTML = ae.GetAddressUse_Gk(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
338
339
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
340
	cellBtnD.onclick = function() {deleteAddress(cellAddr.textContent);};
341
342
	const opt = document.createElement("option");
343
	opt.value = cellAddr.textContent;
344
	opt.textContent = cellAddr.textContent + "@" + ae.GetDomain();
345
	document.getElementById("write_from").appendChild(opt);
346
}
347
348
document.getElementById("btn_updt").onclick = function() {
349
	const btn = this;
350
	btn.disabled = true;
351
	btn.blur();
352
353
	if (tab === "inbox") {
354
		document.getElementById("tbl_inbox").style.opacity = 0.5;
355
356
		ae.Message_Browse(true, function(successBrowse) {
357
			document.getElementById("tbl_inbox").style.opacity = 1;
358
359
			if (successBrowse) {
360
				addMessages();
361
				btn.disabled = false;
362
			} else {
363
				console.log("Failed to refresh");
364
				btn.disabled = false;
365
			}
366
		});
367
	}
368
};
369
370
function addContact(mail, name, note) {
371
	const tbl = document.getElementById("tbl_ctact");
372
	const row = tbl.insertRow(-1);
373
	const cellMail = row.insertCell(-1);
374
	const cellName = row.insertCell(-1);
375
	const cellNote = row.insertCell(-1);
376
	const cellBtnD = row.insertCell(-1);
377
378
	cellMail.textContent = mail;
379
	cellName.textContent = name;
380
	cellNote.textContent = note;
381
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
382
383
	cellMail.contentEditable = true;
384
	cellName.contentEditable = true;
385
	cellNote.contentEditable = true;
386
387
	cellBtnD.onclick = function() {row.remove();};
388
}
389
390
document.getElementById("btn_newcontact").onclick = function() {
391
	addContact("", "", "");
392
}
393
394
// Tabs
395
function setupButtons() {
396
	switch(tab) {
397
		case "inbox":
398
		case "snbox":
399
			document.getElementById("btn_dele").disabled = false;
400
			document.getElementById("btn_left").disabled = false; // depends
401
			document.getElementById("btn_cent").disabled = true;
402
			document.getElementById("btn_rght").disabled = false; // depends
403
			document.getElementById("btn_updt").disabled = false;
404
		break;
405
		case "write":
406
			document.getElementById("btn_dele").disabled = false; // depends
407
			document.getElementById("btn_left").disabled = false; // depends
408
			document.getElementById("btn_cent").disabled = true;
409
			document.getElementById("btn_rght").disabled = false;
410
			document.getElementById("btn_updt").disabled = true;
411
		break;
412
		case "notes":
413
			document.getElementById("btn_dele").disabled = true;
414
			document.getElementById("btn_left").disabled = false; // depends
415
			document.getElementById("btn_cent").disabled = true;
416
			document.getElementById("btn_rght").disabled = false; // depends
417
			document.getElementById("btn_updt").disabled = true; // depends
418
		break;
419
		case "prefs":
420
			document.getElementById("btn_dele").disabled = true;
421
			document.getElementById("btn_left").disabled = false; // depends
422
			document.getElementById("btn_cent").disabled = true;
423
			document.getElementById("btn_rght").disabled = false; // depends
424
			document.getElementById("btn_updt").disabled = true; // depends
425
		break;
426
	}
427
}
428
429
document.getElementById("btn_left").onclick = function() {
430
	switch (tab) {
431
		case "inbox":
432
			page--;
433
			addMessages();
434
		break;
435
		case "write":
436
			document.getElementById("div_write_1").hidden = false;
437
			document.getElementById("div_write_2").hidden = true;
438
			document.getElementById("write_body").focus();
439
		break;
440
	}
441
442
	this.blur();
443
};
444
445
document.getElementById("btn_rght").onclick = function() {
446
	switch (tab) {
447
		case "inbox":
448
			page++;
449
			addMessages();
450
		break;
451
		case "write":
452
			if (!document.getElementById("div_write_1").hidden) {
453
				ae.Address_Lookup(document.getElementById("write_recv").value, function(pk) {
454
					if (pk) {
455
						document.getElementById("div_write_1").hidden = true;
456
						document.getElementById("div_write_2").hidden = false;
457
458
						document.getElementById("write2_from").textContent = document.getElementById("write_from").value + "@" + ae.GetDomain();
459
						document.getElementById("write2_recv").textContent = document.getElementById("write_recv").value;
460
						document.getElementById("write2_pkey").textContent = sodium.to_hex(pk);
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...
461
462
						document.getElementById("write2_subj").textContent = document.getElementById("write_subj").value;
463
						document.getElementById("write2_body").textContent = document.getElementById("write_body").value;
464
					} else {
465
						console.log("Failed lookup");
466
					}
467
				});
468
			} else if (!document.getElementById("div_write_2").hidden) {
469
				const topk = (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...
470
				ae.Message_Create(document.getElementById("write_subj").value, document.getElementById("write_body").value, document.getElementById("write_from").value, document.getElementById("write_recv").value, topk, function(success) {
471
					if (success) {
472
						console.log("Sent ok");
473
					} else {
474
						console.log("Failed sending");
475
					}
476
				});
477
			}
478
		break;
479
	}
480
481
	this.blur();
482
};
483
484
for (const btn1 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
485
	btn1.onclick = function() {
486
		for (const btn2 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
487
			const isMatch = (btn1 === btn2);
488
			btn2.disabled = isMatch;
489
			document.getElementById("div_" + btn2.id.slice(4)).hidden = !isMatch;
490
491
			if (isMatch) {
492
				tab = btn2.id.slice(4);
493
				setupButtons();
494
			}
495
		}
496
	};
497
};
498
499
function addressCreate(addr) {
500
	const btnN = document.getElementById("btn_address_create_normal");
501
	const btnS = document.getElementById("btn_address_create_shield");
502
	btnN.disabled = true;
503
	btnS.disabled = true;
504
505
	ae.Address_Create(addr, function(success1) {
506
		if (success1) {
507
			ae.Private_Update(function(success2) {
508
				addAddress(ae.GetAddressCount() - 1);
509
				if (addr !== "SHIELD") document.getElementById("txt_address_create_normal").value = "";
510
				updateAddressCounts();
511
512
				if (!success2) console.log("Failed to update the Private field");
513
514
				if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
515
				if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
516
			});
517
		} else {
518
			console.log("Failed to add address");
519
520
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
521
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
522
		}
523
	});
524
}
525
526
document.getElementById("btn_address_create_normal").onclick = function() {
527
	if (ae.GetAddressCountNormal() >= ae.GetAddressLimitNormal(ae.GetUserLevel())) return;
528
529
	const txtNewAddr = document.getElementById("txt_address_create_normal");
530
	if (!txtNewAddr.reportValidity()) return;
531
532
	addressCreate(txtNewAddr.value);
533
}
534
535
document.getElementById("btn_address_create_shield").onclick = function() {
536
	if (ae.GetAddressCountShield() >= ae.GetAddressLimitShield(ae.GetUserLevel())) return;
537
538
	addressCreate("SHIELD");
539
};
540
541
document.getElementById("txt_skey").onkeyup = function(event) {
542
	if (event.key === "Enter") {
543
		event.preventDefault();
544
		document.getElementById("btn_enter").click();
545
	}
546
};
547
548
document.getElementById("btn_enter").onclick = function() {
549
	const txtSkey = document.getElementById("txt_skey");
550
	if (!txtSkey.reportValidity()) return;
551
552
	const btn = this;
553
	btn.disabled = true;
554
	document.getElementById("txt_skey").style.background = "#111";
555
556
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
557
		if (successSetKeys) {
558
			ae.Account_Browse(0, function(successBrowse) {
559
				if (successBrowse) {
560
					txtSkey.value = "";
561
					reloadInterface();
562
					document.getElementById("btn_updt").click();
563
				} else {
564
					console.log("Failed to enter");
565
					btn.disabled = false;
566
					document.getElementById("txt_skey").style.background = "#404b41";
567
					txtSkey.focus();
568
				}
569
			});
570
		} else {
571
			console.log("Invalid format for key");
572
			btn.disabled = false;
573
			document.getElementById("txt_skey").style.background = "#404b41";
574
			txtSkey.focus();
575
		}
576
	});
577
};
578
579
});
580