<!--

var atomString = "";
var badData = false
NumAtoms = new Array(0,0,0,0,0,0,0,0,0,0)
ANofAtom = new Array(0,0,0,0,0,0,0,0,0,0)
var MM = 0
var printS = ""
var formula = ""
var numEls = 0;
var elList=""
reactant = new Array(0,0,0,0,0,0,0,0,0,0);
formulaArray = new Array(10);
var atomString = "H*HeLiBeB*C*N*O*F*NeNaMgAlSiP*S*ClArK*CaScTiV*CrMnFeCoNiCuZnGaGeAsSeBrKrRbSrY*ZrNbMoTcRuRhPdAgCdInSnSbTeI*XeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaW*ReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaU*";
var massString = "1.00804.00306.94109.012210.81112.01114.00715.99918.99820.18022.99024.30526.98228.08630.97432.066"+
	"35.45339.94839.09840.07844.95647.88050.94251.99654.93855.84758.93358.69063.54665.39069.72372.61074.92278.96079.904"+
	"83.80085.46887.62088.90691.22492.90695.94098.000101.07102.91106.42107.87112.41114.82118.71121.75127.60126.90131.29132.91137.33"+
	"138.90140.10140.90144.20145.00150.40152.00157.30158.90162.50164.90167.30168.90173.00174.97178.49180.95183.85186.21190.20192.22195.08196.97"+
	"200.59204.38207.20208.98209.00210.00222.00223.00226.00227.00232.04231.04238.03";
m = new Array(10);for (var i=0;i<10;i++){m[i]=0}
var row = 0;
counter=0;
R=0;
P=0;
error = 0;
results="";
coef = new Array(11);for (var i=0;i<11;i++){coef[i]=0;}

	function makem(row0,row1,row2,row3,row4,row5,row6,row7,row8,row9,row10)
	{
	this.row0=row0;
	this.row1=row1;
	this.row2=row2;
	this.row3=row3;
	this.row4=row4;
	this.row5=row5;
	this.row6=row6;
	this.row7=row7;
	this.row8=row8;
	this.row9=row9;
	this.row10=row10
	}

m[0] = new makem("*","*","*","*","*","*","*","*","*","*");
for (var i=0;i<10;i++){m[i] = new makem("",0,0,0,0,0,0,0,0,0)}

//************************************************************

function init()
	{
	for (var h=0;h<10;h++)
		{for (var h1=0;h1<10;h1++){m[h]["row"+h1]=0}}
	elList="";
	}

//***************************************************************

	function cmpd(MM,printS) 
	{
	this.MM = MM;
	this.printS = printS;
	}

//************************************************************
for (var i = 0;i<10;i++)
	{reactant[i] = new cmpd(MM,printS);}
//**************************************************************

	function ParseFormula(formula,k)  
	{
	var c=0; x=0; y=0; c1=0; marker1=0; marker2=-1; loopCount=0;
	var badData=false; multiplier=1
	a1 = new Array(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0);
	a2 = new Array(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0);
	var f = formula;
	var signal = false;
	var digit = false;
	var decimal = false
	reactant[k].printS = "";
	while (c<formula.length)
		{
		var f1 = f.substring(0,1);
		f = f.substring(1,f.length)
		AN = findNum(f1);
		if (AN == -1)
			{
			if (decimal){reactant[k].printS += f1;decimal=false}
			else
				{
				if (signal){reactant[k].printS += "</sub>"+f1;signal=false;digit=false;if (f1 == "."){decimal=true}}
				else {reactant[k].printS += f1;if (f1 == "."){decimal=true}}
				}
			}
		else {
			if (digit || decimal) {reactant[k].printS += f1;if(!decimal){signal=true;}}
			else {reactant[k].printS += "<sub>"+f1;signal=true;digit=true;}
			}
		c++;
		}
	if (signal){reactant[k].printS += "</sub>";signal=false;}
	c = 0;
	while (c <= formula.length - 1 && !badData)
		{
		AN = findAN(formula.substring(c,c+2));
		if (AN == -1)
			{
			AN = findAN(formula.substring(c,c+1));	
			y=1;
			}
		else y=2;
		if (AN > -1)
			{
			marker2=-1
			for (var c2=0; c2<=9; c2++)  
				{
				if (a2[c2] == AN) 
					{ 
					marker2 = c2; break
					}
				}
			if (marker2>=0) {marker1=marker2;loopCount-=1;} else marker1=loopCount;
			c += y;
			a2[marker1] = AN;
			var OK = true;
			var c3 = 0;
			while (OK && c+c3 <= formula.length-1)  
				{
				AN = findNum(formula.substring(c+c3, c+c3+1));
				if (AN >= 0) c3++; else OK = false;
				}
			if (c3>0) 
				{
				if (marker2>=0) a1[marker1] += parseInt(formula.substring(c, c+c3))*multiplier;
				else a1[marker1] = parseInt(formula.substring(c, c+c3))*multiplier;
				}
			else 
				{ if (marker2>=0) a1[marker1] += 1*multiplier; else a1[marker1] = 1*multiplier 
				}
			c += c3;
			loopCount++
			}
		else 
			{
			AN="[]().".indexOf(formula.substring(c,c+1));
			if (AN==-1) {badData=true;break}
			if (AN==0 || AN==2)
				{
				if (AN==2) 
					{
					var zz=0
					for (x=c;x<=formula.length-1;x++)
						{
						if (formula.substring(x,x+1)==")"){zz=x; break}
						}
					}
				else
					{
					for (x=c;x<=formula.length-1;x++)
						{
						if (formula.substring(x,x+1)=="]"){zz=x; break}
						}
					}
				var c4=1;OK=true
				while (OK && zz+c4 <= formula.length-1)  
					{
					var AN1 = findNum(formula.substring(zz+c4, zz+c4+1));
					if (AN1 >= 0) c4++; else OK = false;
					}
				if (c4>1) 
					{
					var z=parseInt(formula.substring(1+zz, c4+zz));
					multiplier=multiplier*z
					}
				c++
				}
			if (AN==1 || AN==3)
				{
				var c5=1;OK=true
				while (OK && c+c5 <= formula.length-1)  
					{
					var AN1 = findNum(formula.substring(c+c5, c+c5+1));
					if (AN1 >= 0) c5++; else OK = false;
					}
				if (c5>1) 
					{
					multiplier=Math.round(multiplier/parseInt(formula.substring(c+1, c+c5)));
					}
				c+=c5
				}
			if (AN==4)
				{
				var c6=1;OK=true
				while (OK && c+c6 <= formula.length-1)  
					{
					var AN1 = findNum(formula.substring(c+c6, c+c6+1));
					if (AN1 >= 0) c6++; else OK = false;
					}
				if (c6>1) 
					{
					multiplier *= parseInt(formula.substring(c+1, c+c6));
					}
				c+=c6
				}
			}
		if (badData){}
		}
	NumEls = loopCount-1;
	counter = NumEls;
	for (var i=0; i<=NumEls; i++)  
		{
		NumAtoms[i] = a1[i];
		ANofAtom[i] = a2[i];
		}
	if (badData) {alert("The formula "+ formula + "did not parse correctly");error=0;};
	}

//**********************************************************

	function findAN(aSym)  {
	var AN = 0
	if (aSym.length == 1) aSym +="*";
	var x = atomString.indexOf(aSym);
	AN = (x == -1) ?  x : (x/2) + 1;
	return AN;
	}

//*********************************************************

	function findNum(ch)  {
	var numstring = "0123456789";
	var x = numstring.indexOf(ch);
	return x;
	}
	
//**********************************************************

	function assignvars(k)
	{
	this.k = k;
	reactant[k]["MM"] = 0.0;
	for (var k1 = 0; k1 <= counter; k1++)
		{
		var a = atomString.substring((ANofAtom[k1]-1)*2,atomString.length);
		var a1 = a.substring(0,1);
		a = a.substring(1,a.length);
		if (a.substring(0,1) != "*"){a1 += a.substring(0,1)} 
		var a3=0;
		var a2 = "";
		if (a1.length == 1){a2=a1+"*";}else{a2=a1}	
		a3 = elList.indexOf(a2);
		if (a3 == -1){elList += a2; a3 = elList.indexOf(a2)}
		a3 = (a3/2)+1;
		var a4 = "row" + (k+1);
		m[a3][a4] = NumAtoms[k1];
		m[a3]["row0"] = ANofAtom[k1];
		var mass = massString.substring((ANofAtom[k1]-1)*6,massString.length);
		mass = mass.substring(0,6);
		reactant[k].MM += Math.round(parseFloat(mass)*NumAtoms[k1]*10)/10;
		}
	}

//*******************************************************

	function correctM()
	{
	for (var h1=R+1;h1<=(P+R-1);h1++)
		{
		for (var h=1;h<elList.length/2+1;h++)
			{
			if (m[h]["row"+h1] != 0){m[h]["row"+h1] = -m[h]["row"+h1]}
			}
		}	
	}


//*********************************************************

	function analyse()
	{
	results = "";
	var coltotal = P+R;
	var rowtotal = elList.length/2+1;
	for (var k=1;k<=coltotal-1;k++)
		{
		if (m[k]["row"+k] == 0)
		parent.frames[1].document.write(m[9]["row"+k]);
		parent.frames[1].document.close();
		parent.frames[1].document.open();
			{
			error = 1;
			var kk = 0;
			var k1 = k;
			while ((m[k]["row"+k] == 0) && (error == 1) && kk < 100)
				{
				kk++;
				if (k>rowtotal-1) {error = 0}
				else 
					{
					for ( r = k; r <= rowtotal-1; r++)
						{
						for ( cols = 1; cols <= coltotal; cols++)
							{
							var temp = 0.0;
							temp = m[r]["row"+cols];
							m[r]["row"+cols] = m[(r+1)]["row"+cols];
							m[(r+1)]["row"+cols] = temp;
							}
						}
					}			
				}
			if (kk > 99){error = 0;}
			}
		if (error != 1) {results = "No"; break;}
		var con = 1/m[k]["row"+k];
		for (var c=1;c<=coltotal;c++)
			{m[k]["row"+c] *= con;}
		for (var r=1;r<=rowtotal;r++)
			{
			if ((r != k) && (m[r]["row"+k] != 0))
				{
				con = -m[r]["row"+k];
				for (c=1;c<=coltotal;c++)
					{m[r]["row"+c] += con*m[k]["row"+c]}
				}
			}
		}
	if (results == "") 
		{
		c1 = 1;
		for (c1=1;c1<=200;c1++)
			{
			flag = 0;
			for (var r=1;r<=coltotal-1;r++)
				{
				var v=0.0;
				if (Math.round(m[r]["row"+coltotal]*c1) != 0)
					{v = m[r]["row"+coltotal]*c1/Math.round(m[r]["row"+coltotal]*c1)}
				else {v = 0;}
				if ((v>1.00002) || (v < 0.99998)){flag = 0; break;}
				else {flag = 1}
				}
			if (flag == 1) break;
			}
		}
	if (c1 > 200 || flag != 1 || results != "") {if (results == "") {results = "No"}}
	else 	{ for (var i=1;i<=coltotal-1;i++)
			{
			coef[i] = Math.round(m[i]["row"+coltotal]*c1); results += "coef "+i+ " = " + coef[i] +"<br>";}
		coef[coltotal] = c1; results += "coef "+coltotal+" = "+coef[coltotal];
		}
	if (results == "No"){alert("No balance found")}
	}

//**********************************************************

	function begin()  
	{
	parent.frames[1].document.open();
	init();
	R=0;P=0;
	var c = 0;
	for (k3 = 0; k3<6;k3++)
		{
		if (parent.frames[0].document.forms[0].elements[k3].value != "" && parent.frames[0].document.forms[0].elements[k3].value != " "){formulaArray[c] = parent.frames[0].document.forms[0].elements[k3].value;c++}
		}
	R = c
	for (var k = 0; k<R;k++)
		{
		for (k1 = 0; k1<10;k1++)
			{
			NumAtoms[k1] = 0;
			ANofAtom[k1] = 0;
			counter = 0;
			}
		if (formulaArray[k] != "")
			{
			formula = formulaArray[k];
			ParseFormula(formula,k);
			assignvars(k)
			}
		}
	for (k3 = 6; k3<12;k3++)
		{
		if (parent.frames[0].document.forms[0].elements[k3].value != "" && parent.frames[0].document.forms[0].elements[k3].value != " "){formulaArray[c] = parent.frames[0].document.forms[0].elements[k3].value;c++}
		}
	P = c-R;
	for (var k = R; k<(R+P);k++)
		{
		for (k1 = 0; k1<10;k1++)
			{
			NumAtoms[k1] = 0;
			ANofAtom[k1] = 0;
			counter = 0;
			}
		if (formulaArray[k] != "")
			{
			formula = formulaArray[k];
			ParseFormula(formula,k);
			assignvars(k)
			}
		}
	correctM();
	analyse();
	var xx = "";xy = 0;
	PS = "<p><center><table><tr><td>Equation : </td>";
	for (var e=0;e<=P+R-1;e++)
		{
		if (coef[e+1] == 1){PS += "<td>"+reactant[e].printS+"</td>";}
		else {PS += "<td>"+coef[e+1]+" "+ reactant[e].printS+"</td>";}
		if (e != R-1 && e != P+R-1){PS += "<td>+</td>";}
		if (e == R-1){PS += "<td><img src='arrow.gif'></td>";}
		}
	PS += "</tr><tr><td>Molar<br>Masses : </td>"
	for (e=0;e<P+R;e++)
		{
		PS += "<td>"+Math.round(reactant[e].MM*100)/100+"</td>";
		if (e != P+R-1){PS += "<td></td>"}
		}
	PS += "</tr><tr><td>Reacting or<br>equivalent<br>masses</td>";
	var x = 0.0;var totalMass = 0.0;
	x = 100/(reactant[0].MM*coef[1]);
	for (e=0;e<P+R;e++)
		{
		xx = "" + Math.round(parseFloat(reactant[e].MM)*parseFloat(coef[e+1])*x*10)/10;
		PS += "<td>"+xx+"</td>";
		if (e != P+R-1){PS += "<td></td>"}
		if (e<R){totalMass += parseFloat(reactant[e].MM)*parseFloat(coef[e+1])*x;}
		else {totalMass -= parseFloat(reactant[e].MM)*parseFloat(coef[e+1])*x;}
		}
	PS += "</tr></table></center>";
	if (totalMass >1 || totalMass < -1){results="No";alert("Nobalance found")}
	if(results!="No"){
	parent.frames[1].document.write(PS);
	}
	parent.frames[1].document.close();
	}

//-->

