Passed
Push — master ( adf9a0...31c7a2 )
by EMP
01:18
created

modern/main.js   F

Complexity

Total Complexity 125
Complexity/F 3.05

Size

Lines of Code 563
Function Count 41

Duplication

Duplicated Lines 59
Ratio 10.48 %

Importance

Changes 0
Metric Value
wmc 125
eloc 367
mnd 84
bc 84
fnc 41
dl 59
loc 563
rs 2
bpm 2.0487
cpm 3.0487
noi 6
c 0
b 0
f 0

14 Functions

Rating   Name   Duplication   Size   Complexity  
A main.js ➔ getCountryFlag 0 5 1
B main.js ➔ getCountryName 0 11 6
F main.js ➔ displayMsg 0 70 23
B main.js ➔ addMsg 0 63 7
A main.js ➔ updateAddressCounts 0 5 3
D main.js ➔ deleteAddress 38 38 13
A main.js ➔ reloadInterface 0 21 3
C main.js ➔ addMessages 0 41 11
A main.js ➔ setupButtons 0 33 3
B main.js ➔ addContact 0 19 6
B main.js ➔ addAddress 0 29 7
A main.js ➔ clearMessages 0 6 1
A main.js ➔ shieldMix 21 21 4
F main.js ➔ addressCreate 0 26 24

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like modern/main.js 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;
0 ignored issues
show
Unused Code introduced by
The variable page seems to be never used. Consider removing it.
Loading history...
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 maxExt = ae.GetExtMsgCount();
174
	const maxInt = ae.GetIntMsgCount();
175
176
	let numExt = 0;
177
	let numInt = 0;
178
179
	while(1) {
180
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
181
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
182
		if (tsInt === 0 && tsExt === 0) break;
183
184
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
185
			addMsg(true, numInt);
186
			numInt++;
187
		} else if (tsExt !== 0) {
188
			addMsg(false, numExt);
189
			numExt++;
190
		}
191
	}
192
193
	if (ae.GetReadyMsgKilos() < ae.GetTotalMsgKilos()) {
194
		const inbox = document.getElementById("tbl_inbox");
195
		const row = inbox.insertRow(-1);
196
		const cell = row.insertCell(-1);
197
		cell.textContent = "Load more (" + (ae.GetTotalMsgKilos() - ae.GetReadyMsgKilos()) + " KiB left)"
198
199
		row.onclick = function() {
200
			this.onclick = "";
201
202
			ae.Message_Browse(false, function(successBrowse) {
203
				document.getElementById("tbl_inbox").style.opacity = 1;
204
205
				if (successBrowse) {
206
					clearMessages();
207
					addMessages();
208
				}
209
			});
210
		};
211
	}
212
}
213
214
function clearMessages() {
215
	document.getElementById("tbl_inbox").innerHTML = "";
216
//	document.getElementById("tbl_sentm").innerHTML = "";
217
//	document.getElementById("tbl_notes").innerHTML = "";
218
//	document.getElementById("tbl_files").innerHTML = "";
219
}
220
221
function updateAddressCounts() {
222
	document.getElementById("limit_normal").textContent = (ae.GetAddressCountNormal() + "/" + ae.GetAddressLimitNormal(ae.GetUserLevel())).padStart(ae.GetAddressLimitNormal(ae.GetUserLevel()) > 9 ? 5 : 1);
223
	document.getElementById("limit_shield").textContent = (ae.GetAddressCountShield() + "/" + ae.GetAddressLimitShield(ae.GetUserLevel())).padStart(ae.GetAddressLimitShield(ae.GetUserLevel()) > 9 ? 5 : 1);
224
	document.getElementById("limit_total").textContent = ((ae.GetAddressCountNormal() + ae.GetAddressCountShield()) + "/" + ae.GetAddrPerUser()).padStart(5);
225
}
226
227
function reloadInterface() {
228
	document.getElementById("div_begin").hidden = true;
229
	document.getElementById("div_main").style.display = "grid";
230
231
	// Contacts
232
	for (let i = 0; i < ae.GetContactCount(); i++) {
233
		addContact(
234
			ae.GetContactMail(i),
235
			ae.GetContactName(i),
236
			ae.GetContactNote(i)
237
		);
238
	}
239
240
	// Addresses
241
	for (let i = 0; i < ae.GetAddressCount(); i++) {
242
		addAddress(i);
243
	}
244
245
	document.getElementById("table_addrs").getElementsByTagName("caption")[0].textContent = "Level " + ae.GetUserLevel() + " User";
246
	updateAddressCounts();
247
}
248
249 View Code Duplication
function deleteAddress(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
250
	let btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
251
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
252
253
	let addressToDelete = -1;
254
255
	for (let i = 0; i < ae.GetAddressCount(); i++) {
256
		if (addr === ae.GetAddress(i)) {
257
			addressToDelete = i;
258
			break;
259
		}
260
	}
261
262
	if (addressToDelete === -1) return;
263
264
	ae.Address_Delete(addressToDelete, function(success) {
265
		if (success) {
266
			document.getElementById("tbl_addrs").deleteRow(addressToDelete);
267
			document.getElementById("write_from").remove(addressToDelete);
268
			updateAddressCounts();
269
270
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) document.getElementById("btn_address_create_normal").disabled = false;
271
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) document.getElementById("btn_address_create_shield").disabled = false;
272
273
			ae.Private_Update(function(success2) {
274
				if (!success2) console.log("Failed to update the Private field");
275
276
				btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
277
				for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
278
			});
279
		} else {
280
			console.log("Failed to delete address");
281
282
			btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
283
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
284
		}
285
	});
286
}
287
288 View Code Duplication
function shieldMix(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
289
	let newAddr = "";
290
291
	for (let i = 0; i < 16; i++) {
292
		switch (addr.charAt(i)) {
293
			case '1':
294
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
295
				break;
296
			case '0':
297
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
298
				break;
299
			case 'w':
300
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
301
				break;
302
			default:
303
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
304
		}
305
	}
306
307
	return newAddr;
308
}
309
310
function addAddress(num) {
311
	const addrTable = document.getElementById("tbl_addrs");
312
	const row = addrTable.insertRow(-1);
313
	const cellAddr = row.insertCell(-1);
314
	const cellChk1 = row.insertCell(-1);
315
	const cellChk2 = row.insertCell(-1);
316
	const cellChk3 = row.insertCell(-1);
317
	const cellBtnD = row.insertCell(-1);
318
319
	cellAddr.textContent = ae.GetAddress(num);
320
	cellAddr.onclick = function() {
321
		if (cellAddr.textContent.length === 16)
322
			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...
323
		else
324
			navigator.clipboard.writeText(cellAddr.textContent + "@" + ae.GetDomain());
325
	};
326
327
	cellChk1.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
328
	cellChk2.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
329
	cellChk3.innerHTML = ae.GetAddressUse_Gk(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
330
331
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
332
	cellBtnD.onclick = function() {deleteAddress(cellAddr.textContent);};
333
334
	const opt = document.createElement("option");
335
	opt.value = cellAddr.textContent;
336
	opt.textContent = cellAddr.textContent + "@" + ae.GetDomain();
337
	document.getElementById("write_from").appendChild(opt);
338
}
339
340
document.getElementById("btn_updt").onclick = function() {
341
	const btn = this;
342
	btn.disabled = true;
343
	btn.blur();
344
345
	if (tab === "inbox") {
346
		document.getElementById("tbl_inbox").style.opacity = 0.5;
347
348
		ae.Message_Browse(true, function(successBrowse) {
349
			document.getElementById("tbl_inbox").style.opacity = 1;
350
351
			if (successBrowse) {
352
				clearMessages();
353
				addMessages();
354
				btn.disabled = false;
355
			} else {
356
				console.log("Failed to refresh");
357
				btn.disabled = false;
358
			}
359
		});
360
	}
361
};
362
363
function addContact(mail, name, note) {
364
	const tbl = document.getElementById("tbl_ctact");
365
	const row = tbl.insertRow(-1);
366
	const cellMail = row.insertCell(-1);
367
	const cellName = row.insertCell(-1);
368
	const cellNote = row.insertCell(-1);
369
	const cellBtnD = row.insertCell(-1);
370
371
	cellMail.textContent = mail;
372
	cellName.textContent = name;
373
	cellNote.textContent = note;
374
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
375
376
	cellMail.contentEditable = true;
377
	cellName.contentEditable = true;
378
	cellNote.contentEditable = true;
379
380
	cellBtnD.onclick = function() {row.remove();};
381
}
382
383
document.getElementById("btn_newcontact").onclick = function() {
384
	addContact("", "", "");
385
}
386
387
// Tabs
388
function setupButtons() {
389
	switch(tab) {
390
		case "inbox":
391
		case "snbox":
392
			document.getElementById("btn_dele").disabled = false;
393
			document.getElementById("btn_left").disabled = false; // depends
394
			document.getElementById("btn_cent").disabled = true;
395
			document.getElementById("btn_rght").disabled = false;
396
			document.getElementById("btn_updt").disabled = false;
397
		break;
398
		case "write":
399
			document.getElementById("btn_dele").disabled = false; // depends
400
			document.getElementById("btn_left").disabled = false; // depends
401
			document.getElementById("btn_cent").disabled = true;
402
			document.getElementById("btn_rght").disabled = false;
403
			document.getElementById("btn_updt").disabled = true;
404
		break;
405
		case "notes":
406
			document.getElementById("btn_dele").disabled = true;
407
			document.getElementById("btn_left").disabled = false; // depends
408
			document.getElementById("btn_cent").disabled = true;
409
			document.getElementById("btn_rght").disabled = false; // depends
410
			document.getElementById("btn_updt").disabled = true; // depends
411
		break;
412
		case "prefs":
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
	}
420
}
421
422
document.getElementById("btn_left").onclick = function() {
423
	switch (tab) {
424
		case "write":
425
			document.getElementById("div_write_1").hidden = false;
426
			document.getElementById("div_write_2").hidden = true;
427
			document.getElementById("write_body").focus();
428
		break;
429
	}
430
431
	this.blur();
432
};
433
434
document.getElementById("btn_rght").onclick = function() {
435
	switch (tab) {
436
		case "write":
437
			if (!document.getElementById("div_write_1").hidden) {
438
				ae.Address_Lookup(document.getElementById("write_recv").value, function(pk) {
439
					if (pk) {
440
						document.getElementById("div_write_1").hidden = true;
441
						document.getElementById("div_write_2").hidden = false;
442
443
						document.getElementById("write2_from").textContent = document.getElementById("write_from").value + "@" + ae.GetDomain();
444
						document.getElementById("write2_recv").textContent = document.getElementById("write_recv").value;
445
						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...
446
447
						document.getElementById("write2_subj").textContent = document.getElementById("write_subj").value;
448
						document.getElementById("write2_body").textContent = document.getElementById("write_body").value;
449
					} else {
450
						console.log("Failed lookup");
451
					}
452
				});
453
			} else if (!document.getElementById("div_write_2").hidden) {
454
				ae.Message_Create(document.getElementById("write_subj").value, document.getElementById("write_body").value, document.getElementById("write_from").value, document.getElementById("write_recv").value, sodium.from_hex(document.getElementById("write2_pkey").textContent), function(success) {
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...
455
					if (success) {
456
						console.log("Sent ok");
457
					} else {
458
						console.log("Failed sending");
459
					}
460
				});
461
			}
462
		break;
463
	}
464
465
	this.blur();
466
};
467
468
for (const btn1 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
469
	btn1.onclick = function() {
470
		for (const btn2 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
471
			const isMatch = (btn1 === btn2);
472
			btn2.disabled = isMatch;
473
			document.getElementById("div_" + btn2.id.slice(4)).hidden = !isMatch;
474
475
			if (isMatch) {
476
				tab = btn2.id.slice(4);
477
				setupButtons();
478
			}
479
		}
480
	};
481
};
482
483
function addressCreate(addr) {
484
	const btnN = document.getElementById("btn_address_create_normal");
485
	const btnS = document.getElementById("btn_address_create_shield");
486
	btnN.disabled = true;
487
	btnS.disabled = true;
488
489
	ae.Address_Create(addr, function(success1) {
490
		if (success1) {
491
			ae.Private_Update(function(success2) {
492
				addAddress(ae.GetAddressCount() - 1);
493
				if (addr !== "SHIELD") document.getElementById("txt_address_create_normal").value = "";
494
				updateAddressCounts();
495
496
				if (!success2) console.log("Failed to update the Private field");
497
498
				if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
499
				if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
500
			});
501
		} else {
502
			console.log("Failed to add address");
503
504
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
505
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
506
		}
507
	});
508
}
509
510
document.getElementById("btn_address_create_normal").onclick = function() {
511
	if (ae.GetAddressCountNormal() >= ae.GetAddressLimitNormal(ae.GetUserLevel())) return;
512
513
	const txtNewAddr = document.getElementById("txt_address_create_normal");
514
	if (!txtNewAddr.reportValidity()) return;
515
516
	addressCreate(txtNewAddr.value);
517
}
518
519
document.getElementById("btn_address_create_shield").onclick = function() {
520
	if (ae.GetAddressCountShield() >= ae.GetAddressLimitShield(ae.GetUserLevel())) return;
521
522
	addressCreate("SHIELD");
523
};
524
525
document.getElementById("txt_skey").onkeyup = function(event) {
526
	if (event.key === "Enter") {
527
		event.preventDefault();
528
		document.getElementById("btn_enter").click();
529
	}
530
};
531
532
document.getElementById("btn_enter").onclick = function() {
533
	const txtSkey = document.getElementById("txt_skey");
534
	if (!txtSkey.reportValidity()) return;
535
536
	const btn = this;
537
	btn.disabled = true;
538
	document.getElementById("txt_skey").style.background = "#111";
539
540
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
541
		if (successSetKeys) {
542
			ae.Account_Browse(0, function(successBrowse) {
543
				if (successBrowse) {
544
					txtSkey.value = "";
545
					reloadInterface();
546
					document.getElementById("btn_updt").click();
547
				} else {
548
					console.log("Failed to enter");
549
					btn.disabled = false;
550
					document.getElementById("txt_skey").style.background = "#404b41";
551
					txtSkey.focus();
552
				}
553
			});
554
		} else {
555
			console.log("Invalid format for key");
556
			btn.disabled = false;
557
			document.getElementById("txt_skey").style.background = "#404b41";
558
			txtSkey.focus();
559
		}
560
	});
561
};
562
563
});
564