//data set is at end

if(TData.length)alert("thermo.js loaded before bde.js!")

BDE=new Array()
MolInfo=new Array()
nrow=0
nmolinfo=0

function getStandardState(Eqn){
	var sout=""
	var n=0
	var s=""
	for(var a in Eqn.atoms){
		if(StandardState[a]){
			n=Eqn.atoms[a]/StandardState[a][0]
			s=setsubs(StandardState[a][1])
		}else{

			n=Eqn.atoms[a]
			s=a
		}
		sout+=(sout==""?"":" + ")+(n==1?"":n)+s
	}
	return sout
}


//Hess requires common/symbols.js
//filter to turn "BDE(C=O)" into BDE_C2O
//other ways: C---O C-3-O C--O C-2-O

function createExothermicEquation(Eqn){
 var du=1
 var sout=""
 while(du>=0){
	sout=createEquation(Eqn)
	du=calcDeltaU(Eqn)
 }
 return sout
}

function createEndothermicEquation(Eqn){
 var du=-1
 var sout=""
 while(du<=0){
	sout=createEquation(Eqn)
	du=calcDeltaU(Eqn)
 }
 return sout
}

function BDEfilter(sinfo){
 if(sinfo.indexOf("BDE(")<0)return sinfo
 var s=""
 var S=sinfo.split("BDE(")
 var i1=0
 var sout=S[0]
 for(var i=1;i<S.length;i++){
	sout+="(BDE_"
	s=S[i]
	i1=s.indexOf(")")
	if(i1<0){
		alert("Missing \")\" in "+sinfo)
		return ""
	}
	sout+=s.substring(0,i1).replace(/\-\-\-/g,"3").replace(/\-\-/g,"2").replace(/\=/,"2").replace(/1/,"").replace(/\-/g,"")
	sout+=s.substring(i1,s.length)
 }
 return sout
}

function showInfoBDE(Eqn){
	var s=""
	var bder=0
	var bdep=0
	var du=0
	var sout="<pre>\n"
	sout+=Eqn.show+"\n"
	var s=calcBDE(Eqn,0,0)
	var bder=eval(math(BDEfilter(s)))
	sout+="BDE_reactants = "+s+" = "+bder+" kJ/mol\n"
	s=calcBDE(Eqn,1,0)
	bdep=eval(math(BDEfilter(s)))
	sout+="BDE_products = "+s+" = "+bdep+" kJ/mol\n"
	du=bder+(-bdep) //or du=calcDeltaU(Eqn)
	sout+=sym("D")+"<sub>r</sub>U = (BDE_reactants)+(-BDE_products) = ("+bder+") + (-"+bdep+") = <font color="+(du>0?"red":"blue")+">"+du+" kJ/mol</font>\n"
	sout+="</pre>\n"
	return sout
}

function showEqnBDECalc(Eqn){
	var s=""
	var bder=0
	var bdep=0
	var du=0
	var sout=""
	var s=calcBDE(Eqn,0,0)
	sout+=";BDE_reactants = "+s+" [kJ/mol reaction]"
	s=calcBDE(Eqn,1,0)
	sout+=";BDE_products = "+s+" [kJ/mol reaction]"
	sout+=";Delta_r_U = (BDE_reactants)+(-BDE_products) [kJ/mol reaction]"
	return sout
}

function showMoleculeBDECalc(mol){
	var sout=""
	for(var i=0;i<MolInfo[mol].bonds.length;i++){
		sout+=";BDE("+BDE[MolInfo[mol].bonds[i][0]].s+")"
	}
	var s=calcBDE(mol,0,0)
	sout+=";BDE("+mol+") = "+s
	return sout
}


function addBDE(){
 var A=new Array
 var b=""
 var d=0
 var bondorder=0
 var sep="-"
 for(var i=0;i<arguments.length;i+=2){if(arguments[i]!=""){
	b=arguments[i]
	if(b.indexOf("-3-")>=0){
		sep="-3-"
		bondorder=3
	}else if(b.indexOf("=")>=0){
		sep="="
		bondorder=2
	}else{
		sep="-"
		bondorder=1
	}
	A=b.split(sep)
	d=parseInt(arguments[i+1])
	nrow++
	if(A[0]){
		newBDE(A[0],A[1],sep,bondorder,d,nrow,i/2,true)
		if(A[0]!=A[1])newBDE(A[1],A[0],sep,bondorder,d,nrow,i/2,false)
	}
 }}
}

function newBDE(a1,a2,sep,bondorder,d,row,column,isdisplayable){
 var b=a1+sep+a2
 BDE[b]=new Array()
 BDE[b].a1=a1
 BDE[b].a2=a2
 BDE[b].s=a1+sep+a2
 BDE[b].bondorder=bondorder
 BDE[b].d=d
 BDE[b].row=row
 BDE[b].column=column
 BDE[b].isdisplayable=isdisplayable
 BDE[b].v="BDE_"+a1+(bondorder==1?"":bondorder)+a2
 eval(BDE[b].v+"="+d)
}

function addMolInfo(mol){
 var b=""
 var d=0
 nmolinfo++
 MolInfo[mol]=new Array()
 MolInfo[mol].bonds=new Array()
 for(var i=1;i<arguments.length-1;i+=2){
	b=arguments[i]
	d=parseInt(arguments[i+1])
	if(!isNaN(d)){
		MolInfo[mol].bonds[MolInfo[mol].bonds.length]=new Array(b,d)
		//document.writeln("<br>"+mol+" "+b+" "+d)
	}
 }
 MolInfo[mol].BDE=calcBDE(mol,0,1)
 MolInfo[mol].BDEcalc=calcBDE(mol,0,0)
 MolInfo[mol].tref=""
 MolInfo[mol].BDEref=mol
}

function copyMolInfo(mol, tref){
 nmolinfo++
 MolInfo[tref]=new Array()
 MolInfo[tref].bonds=MolInfo[mol].bonds
 MolInfo[tref].BDE=MolInfo[mol].BDE
 MolInfo[tref].BDEcalc=MolInfo[mol].BDEcalc
 MolInfo[tref].tref=tref
 MolInfo[tref].BDEref=mol
}

function calcBDE(molorEqn,isproducts,icalc){
 var d=0
 if(arguments.length<3)icalc=1
 var sum=(icalc?0:"")
 var mol=""
 var factor=1
 var f=1
 if(typeof(molorEqn)=="string"){
	mol=molorEqn
	for(var i=0;i<MolInfo[mol].bonds.length;i++){
		var type = MolInfo[mol].bonds[i][0]
		var n = MolInfo[mol].bonds[i][1]
		if (!BDE[type])
			alert("Bond information for "+type+" is not available!")
		if(icalc){
			d=n*BDE[type].d
		}else{
			d=(sum.length?"+":"")+(n==1?"":n+"*")+"BDE("+BDE[type].s+")"
		}
		if(icalc && isNaN(d)){
			alert("Bond information for "+type+" is not available!")
		}else{
			sum+=d
		}
	}
 }else{  //for an equation
	if(arguments.length==1)isproducts=false
	factor=(arguments.length==1?-1:1)
	for(var mol in molorEqn.list){if(molorEqn.list[mol].n){
		if(MolInfo[mol]){
			f=(molorEqn.list[mol].n>0 && (factor==-1||isproducts)?factor:molorEqn.list[mol].n<0 && (!isproducts)?-1:0)
			if(f){
				if(icalc){
					sum+=f*molorEqn.list[mol].n*MolInfo[mol].BDE
				}else{
					d=f*molorEqn.list[mol].n
					sum+=(sum.length?" + ":"")+(d==1?"":d+"(")+MolInfo[mol].BDEcalc+(d==1?"":")")
				}
			}
		}else{
			alert("Bonding information is not available for "+mol)
		}
	}}
 }
 return sum
}

function calcDeltaU(Eqn){
 return calcBDE(Eqn)
}



function test(Eqn,where){
	sdebug+=where+"\n"
	for(var i in Eqn){
		sdebug+=i+"\t"+Eqn[i].n+"\t"+Eqn[i].js+"\n"
	}
	sdebug+="\n"
	for(var i in Eqn.Alist)sdebug+=i+"\t"+Eqn.Alist[i]+"\n"
	
	sdebug+="\n"
	var x=""
	x=findUnbalanced(Eqn,"","O;H;")
	if(x){
		var n=findUnbalanced(Eqn,x)
		if(n){
			sdebug+=x+" balance is "+n+"\n"
		}
	}
	x=findUnbalanced(Eqn,"H")
	if(x){
		sdebug+="H balance is "+x+"\n"
	}
	x=findUnbalanced(Eqn,"O")
	if(x){
		sdebug+="O balance is "+x+"\n"
	}
	return sdebug
	
}

///////////////data//////////////////

EqnData=new Array(["H","H2","H2O"]
	,["O","H2O","H2O2","O2"]
	,["C","CH4","C2H4","C2H2","CH3OH",["HCHO","CH3CO2H"],["HCO2H","CO"],"CO2"]
	,["N","NH3",["H2NNH2","NH2OH"],"N2",["NO2","N2O4"]]
	,["F","COF2","CO2,2HF"]
)

//add bond dissociation info if adding new type of bonds
//add addMolInfo() call if adding a new substance.
//add a standard state adding new elements.
//used in Hess's law calculation

StandardState=new Array()
StandardState["H"]=new Array(2,"H2(g)")
StandardState["O"]=new Array(2,"O2(g)")
StandardState["N"]=new Array(2,"N2(g)")
StandardState["C"]=new Array(1,"C(gr)")
StandardState["F"]=new Array(2,"F2(g)")


BDE=new Array()
addBDE('H-H','432','N-H','391','F-F','154','S-H','347','C=C','614')
addBDE('H-F','565','N-N','160','F-Cl','253','S-C','259','C=N','615')
addBDE('H-Cl','427','N-O','201','F-Br','237','S-F','327','C=O','799')
addBDE('H-Br','363','N-F','272','','','S-Cl','253','','')
addBDE('H-I','295','N-Cl','200','Cl-Cl','239','S-Br','218','C-3-C','839')
addBDE('','','N-Br','243','Cl-Br','218','S-S','266','C-3-N','891')
addBDE('C-H','413','','','Cl-I','208','','','C-3-O','1072')
addBDE('C-C','347','O-H','467','','','Si-H','393','','')
addBDE('C-N','305','O-O','146','Br-Br','193','Si-C','360','N=N','418')
addBDE('C-O','358','O-F','190','Br-I','175','Si-O','452','N=O','607')
addBDE('C-F','485','O-Cl','203','','','Si-Si','340','','')
addBDE('C-Cl','339','O-I','234','I-I','149','','','N-3-N','941')
addBDE('C-Br','276','','','','','','','N-3-O','628')
addBDE('C-I','240','','','','','','','O=O','495')

MolInfo=new Array()
addMolInfo('H2','H-H','1','','','','','','','')
addMolInfo('H2O','H-O','2','','','','','','','')
addMolInfo('H2O2','H-O','2','O-O','1','','','','','')
addMolInfo('O2','O=O','1','','','','','','','')
addMolInfo('CH4','C-H','4','','','','','','','')
addMolInfo('CH3OH','C-H','3','C-O','1','O-H','1','','','')
addMolInfo('HCHO','H-C','2','C=O','1','','','','','')
addMolInfo('CH3CO2H','C-H','3','C-C','1','C=O','1','O-H','1','C-O','1')
addMolInfo('HCO2H','H-C','1','C=O','1','C-O','1','O-H','1','')
addMolInfo('CO','C-3-O','1','','','','','','','')
addMolInfo('CO2','C=O','2','','','','','','','')
addMolInfo('COF2','C=O','1','C-F','2','','','','','')
addMolInfo('C2H4','C=C','1','C-H','4','','','','','')
addMolInfo('C2H2','C-3-C','1','C-H','2','','','','','')
addMolInfo('NH3','N-H','3','','','','','','','')
addMolInfo('H2NNH2','N-H','4','N-N','1','','','','','')
addMolInfo('NH2OH','N-H','2','N-O','1','O-H','1','','','')
addMolInfo('N2','N-3-N','1','','','','','','','')
addMolInfo('NO2','N=O','1','N-O','1','','','','','')
addMolInfo('N2O4','N=O','2','N-O','2','N-N','1','','','')
addMolInfo('F2','F-F','1','','','','','','','')
addMolInfo('HF','H-F','1','','','','','','','')
addMolInfo('C2H5OH','C-C','1','C-H','5','C-O','1','O-H','1','')
addMolInfo('N2H4','N-H','4','N-N','1','','','','','')
addMolInfo('C8H18','C-C','7','C-H','18','','','','','')
addMolInfo('HCl','H-Cl','1','','','','','','','')
addMolInfo('CCl4','C-Cl','4','','','','','','','')


