function errorHandler(msg, URL, lineNum){
	if (debugOn){
		alert(msg + " " + lineNum + " " + URL)
	}
	else{
	    document.getElementById("calcDisplay").value = "Calculator Entry Error";
	}
	return true
}

window.onerror = errorHandler

function nullFunction(){
}

function upcase(check){
	var upcase="ABCDEFGHIJKLMNOPQRSTUVWXYZ(";
	for (var i=0; i<upcase.length; i++)
		if (check == upcase.charAt(i)) {return true;}
	return false;
}

function digit(check){
	var digit="1234567890";
	for (var i=0; i<digit.length; i++)
		if (check == digit.charAt(i)) {return true;}
	return false;
}

function operate(check){
	var operate="*/+-[]";
	for (var i=0; i<operate.length; i++)
		if (check == operate.charAt(i)) {return true;}
	if (check == "") {return true;}
	if (check == null) {return true;}
	return false;
}

function docalc(formula){
	var H=1.008
	var He=4.003
	var Li=6.941
	var Be=9.012
	var B=10.81
	var C=12.01
	var N=14.01
	var O=16.00
	var F=19.00
	var Ne=20.18
	var Na=22.99
	var Mg=24.30
	var Al=26.98
	var Si=28.09
	var P=30.97
	var S=32.07
	var Cl=35.45
	var Ar=39.95
	var K=39.10
	var Ca=40.08
	var Sc=44.96
	var Ti=47.88
	var V=50.94
	var Cr=52.00
	var Mn=54.94
	var Fe=55.85
	var Co=58.93
	var Ni=58.69
	var Cu=63.55
	var Zn=65.39
	var Ga=69.72
	var Ge=72.61
	var As=74.92
	var Se=78.96
	var Br=79.90
	var Kr=83.80
	var Rb=85.47
	var Sr=87.62
	var Y=88.91
	var Zr=91.22
	var Nb=92.91
	var Mo=95.94
	var Tc=98.91
	var Ru=101.1
	var Rh=102.9
	var Pd=106.4
	var Ag=107.9
	var Cd=112.4
	var In=114.8
	var Sn=118.7
	var Sb=121.8
	var Te=127.6
	var I=126.9
	var Xe=131.3
	var Cs=132.9
	var Ba=137.3
	var La=138.9
	var Ce=140.1
	var Pr=140.9
	var Nd=144.2
	var Pm=144.9
	var Sm=150.4
	var Eu=152.0
	var Gd=157.2
	var Tb=158.9
	var Dy=162.5
	var Ho=164.9
	var Er=167.3
	var Tm=168.9
	var Yb=173.0
	var Lu=175.0
	var Hf=178.5
	var Ta=180.9
	var W=183.8
	var Re=186.2
	var Os=190.2
	var Ir=192.2
	var Pt=195.1
	var Au=197.0
	var Hg=200.6
	var Tl=204.4
	var Pb=207.2
	var Bi=209.0
	var Po=210.0
	var At=210.0
	var Rn=222.0
	var Fr=223.0
	var Ra=226.0
	var Ac=227.0
	var Th=232.0
	var Pa=231.0
	var U=238.0
	var Np=237.0
	var Pu=244.0
	var Am=243.0
	var Cm=247.0
	var Bk=247.0
	var Cf=251.0
	var Es=252.0
	var Fm=257.0
	var Md=258.0
	var No=259.0
	var Lr=260.0
    var Av=6.0221415e23
    var Pi=Math.PI
    var Pk=6.626068e-34
    var Ai=28.97
	var formulainfo = false
	var parcap=""
	var newformula="";
	for (var i=0; i<formula.length; i++){
		if (upcase(formula.charAt(i))) {formulainfo = true}
		if (operate(formula.charAt(i))) {formulainfo = false; parcap=""}
		if (formulainfo)
			{
			if (operate(formula.charAt(i+1))) {parcap=")"}
			if (i==0) {newformula += "(" + formula.charAt(i) + parcap; continue}
			if (operate(formula.charAt(i-1))) {newformula += "(" + formula.charAt(i) + parcap}
			else if (formula.charAt(i-1)=="(") {newformula += formula.charAt(i) + parcap}
			else if (upcase(formula.charAt(i))) {newformula += "+" + formula.charAt(i) + parcap}
			else if (digit(formula.charAt(i-1))) {newformula += formula.charAt(i) + parcap}
			else if (digit(formula.charAt(i))) {newformula += "*" + formula.charAt(i) + parcap}
			else {newformula += formula.charAt(i) + parcap}
			}
		else
			{
			if (formula.charAt(i)=="[") {newformula += "("}
			else if (formula.charAt(i)=="]") {newformula += ")"}
			else {newformula += formula.charAt(i)}
			}
	}
	return roundnum(eval(newformula), 6);
}

function roundnum(num, decs){
    if (num < 0.01){return Math.toScientific(num,7);}
    if (num > 100000){return Math.toScientific(num,7);}
    return "" + Math.round (eval(num) * Math.pow(10, decs))/Math.pow(10, decs);
}

function doStoich(){
	var formula = document.getElementById("calcDisplay").value;
	if (formula != ""){
		var output =  docalc(formula);
		document.getElementById("calcDisplay").value = output;
	}
	else {document.getElementById("calcDisplay").value = "";}
}

function update(){
	if (document.getElementById("calcDisplay").value.substring(0,1)=="j"){
		eval(document.getElementById("calcDisplay").value.substring(1,document.getElementById("calcDisplay").value.length));
	}
	else if (document.getElementById("calcDisplay").value.substring(0,1)=="f"){
		document.getElementById("calcDisplay").value=roundnum(eval(document.getElementById("calcDisplay").value),6);
	}
	else{
        calcEntry = document.getElementById("calcDisplay").value;
		doStoich();
	}
}

Math.formatDecimals = function (num, digits) {
	if (digits <= 0)
		return String(Math.round(num));
	if (num < 0) {
		var isNegative = true;
		num *= -1;
	}
	var tenToPower = Math.pow(10, digits);
	var cropped = String(Math.round(num * tenToPower));
	if (num < 1) {
		while (cropped.length < digits+1)
			cropped = "0" + cropped;
	}
	if (isNegative) cropped = "-" + cropped;
	var roundedNumStr = cropped.slice(0, -digits) + "." + cropped.slice(-digits);
	return roundedNumStr;
}

Math.toScientific = function (num, sigDigs) {
        num = Number(num);
        if (isNaN(num)) return num;
        var exponent = Math.floor(Math.log(Math.abs(num)) / Math.LN10);
        if (num == 0) exponent = 0;
        var tenToPower = Math.pow(10, exponent);
        var mantissa = num / tenToPower;
        mantissa = Math.formatDecimals(mantissa, sigDigs-1);
        var output = mantissa;
        if (exponent != 0) {
                output += "e" + exponent;
        }
        return(output);
}

function fgd(MW, T, P){
    T=(!T)?0.0000000001:T;
    T=T+273;
    P=(!P)?1:P;
    MW=(!MW)?"CO2":MW;
    MW = docalc(MW);
    return (P*MW)/(0.08205784*T);
}

function fph(PH){
    PH=(!PH)?1.0e-7:PH;
    if (PH<1){
        PH=-Math.log(PH)/Math.log(10);
        }
        else{
            PH=Math.toScientific(Math.pow(10,-PH),7);
    }
    return PH;
}
