-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfissionSandbox_controller.js
More file actions
88 lines (73 loc) · 3.92 KB
/
fissionSandbox_controller.js
File metadata and controls
88 lines (73 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { timePrefixDict, atomData, findElementObject, findNucleodeObject, decayOperation, fusionOperation } from "./reaction_calculator.js";
import { changeElementText, changeButtonText, giveState, setState, switchState, getInput, fillDropDown } from "./utils/base_utils.js";
// ========[ Declare Buttons ]========
const fissionSandboxElementSelect = document.getElementById('fissionSandboxElementSelect');
const fissionSandboxNucleonEntry = document.getElementById('fissionSandboxNucleonEntry');
const fissionSandboxDecayEntry = document.getElementById('fissionSandboxDecayEntry');
const fissionSandboxReactionButton = document.getElementById('attemptFissionSandboxReaction');
const fissionSandboxContinueButton = document.getElementById('continueFissionSandboxReaction');
// ========[ Fill the element dropdowns ]========
atomData.forEach(element => {
const option = document.createElement('option');
option.value = element.protonCount;
option.textContent = `${element.elementName} (${element.protonCount})`;
fissionSandboxElementSelect.appendChild(option);
});
// ========[ Handle change to element dropdown ]========
fissionSandboxElementSelect.addEventListener('change', updateSandboxEntries);
function updateSandboxEntries() {
fissionSandboxNucleonEntry.disabled = true;
fissionSandboxDecayEntry.disabled = true;
fissionSandboxReactionButton.disabled = true;
let selectedElement = fissionSandboxElementSelect.value;
if (selectedElement == "base") return;
fissionSandboxNucleonEntry.disabled = false;
fissionSandboxDecayEntry.disabled = false;
fissionSandboxReactionButton.disabled = false;
};
// ========[ Execute decay reaction ]========
fissionSandboxReactionButton.addEventListener('click', executeDecayAction);
function executeDecayAction() {
const selectedElement = fissionSandboxElementSelect.value;
const nucleonCountEntry = fissionSandboxNucleonEntry.value;
const decayEntry = fissionSandboxDecayEntry.value;
if(!/[0-9]+/.test(nucleonCountEntry)) {
changeElementText("fissionSandboxResult", 'Invalid nucleode count');
}
const decayEntryArray = decayEntry.split(',');
decayEntryArray.forEach(entry => {
if(!/^([0-9])?([abdenpt][+-]?)$/.test(entry)) {
changeElementText("fissionSandboxResult", 'Invalid decay type');
}
});
const newIsotopeArray = decayOperation(decayEntry, selectedElement, nucleonCountEntry);
const protonCount = newIsotopeArray[0], nucleonCount = newIsotopeArray[1];
if (nucleonCount > 0 && protonCount > 0 && protonCount < nucleonCount) {
changeElementText("fissionSandboxResult", `${protonCount <= 118 ? atomData[protonCount-1].elementName : protonCount}-${newIsotopeArray[1]}`);
localStorage.setItem("latestFissionSandboxIsotope", `${protonCount}-${newIsotopeArray[1]}`);
} else {
changeElementText("fissionSandboxResult", 'An unknown element');
localStorage.removeItem("latestFissionSandboxIsotope");
}
};
// ========[ Continue decay of new isotope ]========
fissionSandboxContinueButton.addEventListener('click', setLatestProduct)
function setLatestProduct() {
const latestProduct = localStorage.getItem("latestFissionSandboxIsotope");
if (!latestProduct) return
const isotopeArray = latestProduct.split('-');
const protonCount = isotopeArray[0], nucleonCount = isotopeArray[1];
if (protonCount <= 118 || protonCount < 0 || nucleonCount < 0 || nucleonCount < protonCount) {
fissionSandboxElementSelect.value = protonCount;
fissionSandboxNucleonEntry.value = nucleonCount;
} else {
changeElementText("fissionSandboxResult", 'An unknown element');
}
updateSandboxEntries();
};
// ========[ Startup scripts ]========
// ========[ Disable other input elements ]========
fissionSandboxNucleonEntry.disabled = true;
fissionSandboxDecayEntry.disabled = true;
// ========[ Continue with last product ]========
setLatestProduct();