263 lines
9.8 KiB
JavaScript
263 lines
9.8 KiB
JavaScript
function tableDesc() {
|
|
var p = ["element","atomRadi","moleWeig","ioniEner","elecAffi","elecNega","phase","density","melting","boiling",
|
|
"oxidStat","elecConf"];
|
|
var unit = [""," pm"," g/mol", " kJ/mol"," kJ/mol", " eV", "", " g/mL", "",""];
|
|
var prefix = ["Element Name: ", "Atomic Radius: ", "Molecular Mass: ", "Ionization Energy: ", "Electron Affinity: ",
|
|
"Electronegativity: ", "Phase/State: ", "Density: ", "Melting Point: ", "Boiling Point: ",
|
|
"Oxidation State(s): ", "Electron Configuration: "];
|
|
var states = {"g":"Gas","l":"Liquid","s":"Solid","Unknown":"Unknown"};
|
|
|
|
// Setting up divs for organization
|
|
var infoBox = document.createElement("div");
|
|
infoBox.className = "infoBox";
|
|
|
|
get("elements").appendChild(infoBox);
|
|
var div = document.createElement("div");
|
|
div.className = "info1";
|
|
get("infoBox").appendChild(div);
|
|
var div2 = document.createElement("div");
|
|
div2.className = "info2";
|
|
get("infoBox").appendChild(div2);
|
|
|
|
for(var i = 0;i < p.length; i++) { // For all possible data types
|
|
elem = document.createElement("p");
|
|
elem.className = "eDesc " + p[i];
|
|
if(i <= 5) {
|
|
get("info1").appendChild(elem);
|
|
} else {
|
|
get("info2").appendChild(elem);
|
|
}
|
|
}
|
|
get("info2").appendChild(document.createElement("br"));
|
|
|
|
box = document.createElement("div");
|
|
box.className = "preview";
|
|
get("infoBox").appendChild(box);
|
|
|
|
var trans1 = get("periodictable")[92];
|
|
var trans2 = get("periodictable")[110];
|
|
|
|
trans1.style.backgroundColor = "#41484D";
|
|
trans2.style.backgroundColor = "#41484D";
|
|
trans1.appendChild(document.createTextNode("57 - 71"));
|
|
trans2.appendChild(document.createTextNode("89 - 103"));
|
|
trans1.style.fontSize = "90%";
|
|
trans2.style.fontSize = "90%";
|
|
|
|
// Creates 'reactivity' for each cell
|
|
for(var i = 0;i < elementCount;i++) {
|
|
var cell = get("td")[info["location"][i]]; // Gets location of each atom in order
|
|
|
|
cell.onclick = function() {
|
|
lastElement = this;
|
|
var index = parseInt(this.childNodes[0].childNodes[0].nodeValue-1);
|
|
for(var i = 0;i < p.length; i++) { // Loop through all data types to be displayed
|
|
if(i == 8 || i == 9) { // If data type is melting or boiling
|
|
if(info[p[i]][settings["unit"]][index] !== null) {
|
|
// Get prefix ex. Melting: + actual value + unit
|
|
changeText(p[i],prefix[i] + info[p[i]][settings["unit"]][index] + " " + settings["unit"]);
|
|
} else { // If null
|
|
changeText(p[i],prefix[i] + "Unknown"); // Make unknown
|
|
}
|
|
} else {
|
|
if(info[p[i]][index] != null) { // If data type value isn't null
|
|
if(i == 6) { // If data type is phase/state
|
|
// Get prefix + value reference ex. 'g' -> 'Gas' + unit
|
|
changeText(p[i],prefix[i] + states[info[p[i]][index]] + unit[i]);
|
|
} else if(i == 10) { // If data type is oxidation states
|
|
var para = get("oxidStat");
|
|
|
|
// Remove all childs in oxidation state div
|
|
while (para.firstChild) {
|
|
para.removeChild(para.firstChild);
|
|
}
|
|
|
|
var allStates = info[p[i]][index];
|
|
var para1 = document.createElement("span");
|
|
para1.appendChild(document.createTextNode(prefix[i]));
|
|
para.appendChild(para1);
|
|
|
|
for(var j = 0;j < allStates.length; j++) { // For all states in array
|
|
oxidStat = allStates[j];
|
|
if(j == 6) { // Add new line to prevent overflow
|
|
para.appendChild(document.createElement("br"))
|
|
}
|
|
if(allStates[j].includes("b")) { // If value has b, make value different
|
|
oxidStat = allStates[j].substring(1);
|
|
var par = document.createElement("p");
|
|
par.appendChild(document.createTextNode(oxidStat));
|
|
par.className = "oxid common";
|
|
para.appendChild(par);
|
|
var par = document.createElement("span"); // Spans use inline block
|
|
par.className = "comma"
|
|
par.appendChild(document.createTextNode(", "))
|
|
para.appendChild(par);
|
|
} else {
|
|
var pa = document.createElement("p");
|
|
pa.appendChild(document.createTextNode(oxidStat));
|
|
pa.className = "oxid";
|
|
para.appendChild(pa);
|
|
pa = document.createElement("span"); // Spans use inline block
|
|
pa.className = "comma"
|
|
pa.appendChild(document.createTextNode(", "))
|
|
para.appendChild(pa);
|
|
}
|
|
}
|
|
para.removeChild(para.lastChild); // Remove last comma
|
|
} else if(i == 11) { // If data type is electron configuration
|
|
var para = get("elecConf");
|
|
|
|
// Remove all childs in electron configuration div
|
|
while (para.firstChild) {
|
|
para.removeChild(para.firstChild);
|
|
}
|
|
|
|
var elecConf = info[p[i]][index].split("."); // Ex. ["1s", "2", "2s", "2"]
|
|
para.appendChild(document.createTextNode(prefix[i]));
|
|
|
|
if(settings["elecConf"] == "abr") {
|
|
// Add 2 to get to next non superscript and subtract one to prevent undefined
|
|
for(var j = 0;j < elecConf.length-1; j+=2) {
|
|
para.appendChild(document.createTextNode(elecConf[j])); // Append electron level
|
|
// Append value for level in superscript
|
|
var sup = document.createElement("sup");
|
|
sup.appendChild(document.createTextNode(elecConf[j+1]));
|
|
para.appendChild(sup);
|
|
}
|
|
|
|
} else if(settings["elecConf"] == "norm") {
|
|
while(elecConf[0].includes("[")) { // Ex: [Xe]5s2
|
|
// Get ex. [Xe] configuration
|
|
otherConf = info[p[i]][info["shorthand"].indexOf(elecConf[0].substring(1,3))].split(".");
|
|
elecConf[0] = elecConf[0].substring(4); // [Xe]5s2 = 5s2
|
|
for(var j = otherConf.length-1; j >= 0; j--) {
|
|
// Put configuration of abbreviation in front of last configuration
|
|
elecConf.unshift(otherConf[j]);
|
|
}
|
|
}
|
|
|
|
// Add 2 to get to next non superscript and subtract one to prevent undefined
|
|
for(var j = 0;j < elecConf.length-1; j+=2) {
|
|
if(j == 20) { // Add new line to prevent overflow
|
|
para.appendChild(document.createElement("br"))
|
|
}
|
|
para.appendChild(document.createTextNode(elecConf[j])); // Append electron level
|
|
var sup = document.createElement("sup");
|
|
// Append value for level in superscript
|
|
sup.appendChild(document.createTextNode(elecConf[j+1]));
|
|
para.appendChild(sup);
|
|
}
|
|
}
|
|
} else { // If not special data type
|
|
changeText(p[i],prefix[i] + info[p[i]][index] + unit[i]);
|
|
}
|
|
|
|
} else { // If null
|
|
changeText(p[i],prefix[i] + "Unknown");
|
|
}
|
|
}
|
|
} // Remove all childs in preview, then get new atom div
|
|
try {
|
|
get("preview").removeChild(get("preview").firstChild);
|
|
} catch(err){}
|
|
get("preview").appendChild(getAtomDOM(index,window.innerHeight/3.8));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
function changeText(dom,text) {
|
|
var dom = get(dom);
|
|
// Remove all childs in div
|
|
while (dom.firstChild) {
|
|
dom.removeChild(dom.firstChild);
|
|
}
|
|
|
|
dom.appendChild(document.createTextNode(" "));
|
|
dom.childNodes[0].nodeValue = text;
|
|
}
|
|
|
|
function getAtomDOM(atomNum, size) {
|
|
var holder = document.createElement("div");
|
|
holder.style.position = "relative";
|
|
holder.style.height = size;
|
|
holder.style.width = size;
|
|
holder.className = "realAtom";
|
|
|
|
var atom = document.createElement("img");
|
|
atom.ondragstart = function(){return false;} // Disables image dragging
|
|
atom.src = "./resources/reactive/Ring" + info["valeElec"][atomNum] + ".gif";
|
|
atom.style.height = size;
|
|
atom.style.width = size;
|
|
atom.style.position = "absolute";
|
|
atom.style.top = "0";
|
|
atom.style.left = "0";
|
|
|
|
var circle = document.createElement("div");
|
|
circle.className = "innerAtom";
|
|
circle.style.borderRadius = "50%"; // Creates circle
|
|
circle.style.height = size*0.85;
|
|
circle.style.width = size*0.85;
|
|
circle.style.margin = "0 auto";
|
|
circle.style.position = "absolute";
|
|
circle.style.top = size*0.075;
|
|
circle.style.left = size*0.075;
|
|
var bgColor = getColor(settings["displayTheme"],atomNum);
|
|
circle.style.backgroundColor = bgColor;
|
|
circle.style.boxShadow = "inset 0 0 0 15px " + changeColor(bgColor,20) + ", inset 0 0 10px 30px " + changeColor(bgColor,-20);
|
|
|
|
var eyes = document.createElement("div");
|
|
eyes.style.display = "flex";
|
|
eyes.style.position = "absolute";
|
|
var eyesWidth = size*0.17;
|
|
var eyesHeight = size*0.15;
|
|
eyes.style.width = eyesWidth;
|
|
eyes.style.height = eyesHeight;
|
|
eyes.style.top = size*0.425 - eyesHeight/2;
|
|
eyes.style.left = size*0.67 - eyesWidth/2;
|
|
var eye = document.createElement("div");
|
|
eye.style.backgroundColor = changeColor(bgColor,-20);
|
|
eye.style.borderRadius = "100px / 240px";
|
|
eye.style.boxShadow = "inset 0 0 0 4px #fff";
|
|
eye.style.width = size*0.06;
|
|
eye.style.height = size*0.15;
|
|
eye.className = "eye";
|
|
eyes.appendChild(eye);
|
|
var eye2 = eye.cloneNode(true);
|
|
eye2.style.marginLeft = "5px";
|
|
eyes.appendChild(eye2);
|
|
|
|
var sh = document.createElement("p");
|
|
sh.appendChild(document.createTextNode(info["shorthand"][atomNum]));
|
|
sh.className = "sh";
|
|
|
|
circle.appendChild(sh);
|
|
circle.appendChild(eyes);
|
|
holder.appendChild(circle)
|
|
holder.appendChild(atom);
|
|
|
|
return holder;
|
|
}
|
|
|
|
get("body").onmousemove = function(event) {
|
|
// Makes eyes point at mouse
|
|
try {
|
|
var a = event.clientX;
|
|
var b = event.clientY;
|
|
for(var i = 0; i < document.getElementsByClassName("innerAtom").length; i++) {
|
|
var atom = document.getElementsByClassName("innerAtom")[i];
|
|
var x = (atom.getBoundingClientRect()["left"] + atom.getBoundingClientRect()["right"])/2; // X coord
|
|
var y = (atom.getBoundingClientRect()["top"] + atom.getBoundingClientRect()["bottom"])/2; // Y coord
|
|
var width = atom.getBoundingClientRect()["width"]; // Width and length are same because circle
|
|
|
|
var r = width/4;
|
|
var vect = [a-x, b-y];
|
|
var magn = Math.sqrt(Math.pow(vect[0],2) + Math.pow(vect[1],2))
|
|
var eyePos = [vect[0]*r/magn, vect[1]*r/magn];
|
|
|
|
var eyes = atom.childNodes[1];
|
|
eyes.style.left = width/2 + eyePos[0] - eyes.getBoundingClientRect()["width"]/2;
|
|
eyes.style.top = width/2 + eyePos[1] - eyes.getBoundingClientRect()["height"]/2;
|
|
}
|
|
} catch(err) {}
|
|
} |