//masscalc.js
//3:54 PM 1/22/01
//copyright 2001 Bob Hanson, St. Olaf College

defmass=84
m=new Array()
f=new Array()
m["H"]=1.007825; f["H"]=.9999;
m["C"]=12.000000; f["C"]=.9890;
m["N"]=14.003074; f["N"]=.9963;
m["O"]=15.994915; f["O"]=.9976;
m["Cl"]=34.968853; f["Cl"]=.7577;
m["Br"]=78.918336; f["Br"]=.5069;
m["S"]=31.97207; f["S"]=0.950;
m["I"]=126,9004; f["I"]=1.00;

function doit(){
 var mh=m["H"]
 var mc=m["C"]
 var mn=m["N"]
 var mo=m["O"]
 var mcl=m["Cl"]
 var mbr=m["Br"]
 var ms=m["S"]
 var mi=m["I"]
 var nh=parseInt(document.msinfo.nh.value)
 var maxn=parseInt(document.msinfo.maxn.value)
 var mass=document.msinfo.m_z.value
 var cOK=document.msinfo.cOK.checked
 var hOK=document.msinfo.hOK.checked
 var oOK=document.msinfo.oOK.checked
 var nOK=document.msinfo.nOK.checked
 var clOK=document.msinfo.clOK.checked
 var brOK=document.msinfo.brOK.checked
 var sOK=document.msinfo.sOK.checked
 var iOK=document.msinfo.iOK.checked

 var Monly=document.msinfo.Monly[0].checked

 if(mass==""){
   alert("You must first indicate a mass")
   return
 }
 if(mass<1 || mass>300){
   alert("The mass requested is outside the range 12-300")
   return
 }
 mass=Math.floor(eval(mass))
 var intm=0
 var exactm=0
 var partc=0
 var partn=0
 var parto=0
 var partcl=0
 var partbr=0
 var parts=0
 var parti=0
 var sout=""
 var icount=0
 var slist=(cOK?", C":"")+(hOK?", H":"")+(nOK?", N":"")+(oOK?", O":"")+(clOK?", Cl":"")+(brOK?", Br":"")+(sOK?", S":"")+(iOK?", I":"")
 var selement=""
 var i=slist.lastIndexOf(",")
 if(slist.indexOf(",")!=i){
	selement="s"
	slist=slist.substring(0,i+(i==3?0:1))+" and"+slist.substring(i+1,slist.length)
 }
 if(slist==""){
  alert("You must select one of the possible elements.")
  return
 }
 for(C=0;C<=(cOK?mass/12:0);C++){
  partc=C*12
  for(N=0;N<=(nOK?(mass-partc)/14:0);N++){
	partn=partc+N*14
	for(O=0;O<=(oOK?(mass-partn)/16:0);O++){  
		parto=partn+O*16
		for(Br=0;Br<=(brOK?(mass-parto)/79:0);Br++){
			partbr=parto+Br*79
			for(Cl=0;Cl<=(clOK?(mass-partbr)/35:0);Cl++){
				partcl=partbr+Cl*35
				for(S=0;S<=(sOK?(mass-partcl)/32:0);S++){
					parts=partcl+S*32
					for(I=0;I<=(iOK?(mass-parts)/127:0);I++){
						parti=parts+I*127

	H=mass-partcl
	var maxh=C*2+2+N-Cl-Br-I
	if(Monly && ((maxh-H) % 2))H=-1
	if(!hOK && H>0)H=-1
        if(H>=0 && H<=maxh && (!nh || H==nh) && (!maxn || N+O+Br+S+I+Cl<=maxn)){
      		icount++
       		exactm=C*mc+H*mh+N*mn+O*mo+Br*mbr+Cl*mcl+S*ms+I*mi
       		sout+=roundoff(exactm,4)+"\t"
		sout+=the("C")+the("H")+the("N")+the("O")+the("Br")+the("Cl")+the("I")+the("S")
		sout+="\n"
	}
					}
				}
			}
		}
	}
  }
 }
 var s="There "+(icount==1?"is ":"are ")+(icount==0?"no":icount)+" possible "+(Monly?"molecular ion":"fragment")+(icount==1?"":"s")
 s+="\nwith nominal mass "+mass
 s+="\ninvolving only the element"+selement+" "+slist.substring(2,slist.length)
 s+=(nh?" and having exactly "+nh+" H atoms":"")
 s+=(maxn?" and having no more than "+maxn+" atoms other than C and H":"")
 s+="\n\n"+sout
 parent.fraDisp.document.info.list.value=s
}

function the(Element){
 var e=eval(Element)
 var subon=" "//<sub>
 var suboff=""//</sub>
 return (e>0?subon+Element+(e>1?e+suboff:""):"")
}

function roundoff(x,ndec)
{
 //round x to ndec decimal places (+) fixed; (-) floating
//# 1410
 if(x==0)return 0
 if(ndec==0)return Math.round(x)
 var xs=x+""
 var i=(xs.indexOf("E") & xs.indexOf("e"))
 if(ndec<0 && i<0)
 {
  var xs=roundoff(x*1e-100,-ndec)
  var i=(xs.indexOf("E") & xs.indexOf("e"))
  var e=(eval(xs.substring(i+1,xs.length))+100)
//# 1420
  return xs.substring(0,i)+(e!=0?"E"+e:"")
 }
 if (i>0)
 {
  var s=roundoff(xs.substring(0,i),Math.abs(ndec)-1)+"E"+xs.substring(i+1,xs.length)
  return s 
 }
 i=xs.indexOf(".")
 if (i<0) 
//# 1430
 {
  xs=x+"."+"00000"+" "
  i=xs.indexOf(".")
 }
 xs=xs.substring(0,i)+"."+xs.substring(i+1,i+1+ndec)
 if(i==0) xs="0"+xs
 if(xs.indexOf("-.")==0)xs="-0"+xs.substring(1,xs.length)
 if(xs=="-")xs="0"
 return xs
//# 1440
}


var stable="<center><form method=post action='' name=msinfo onsubmit=doit()>"
	+"<table bgcolor=#FFFF00 cellpadding=10 "
	+"<tr><td colspan=3 align=center><b>Mass Spectrometry Fragment Calculator</b></td></tr>"
	+"<tr><td rowspan=2 align=center><table><tr><td>Nominal Mass:</td><td><input type=text size=5 name=m_z value="+defmass+"></td></tr>"
	+"<tr><td>Known number of H:</td><td><input type=text size=5 name=nh value=''></td></tr>"
	+"<tr><td>max atoms not C or H:</td><td><input type=text size=5 name=maxn value='5'></td></tr>"
	+"</table></td>"
	+"<td colspan=2><table><tr><td>Allow"
	+"</td><td><input type=checkbox name=cOK checked>C "
	+"<input type=checkbox name=hOK checked>H "
	+"<input type=checkbox name=oOK checked>O "
	+"<input type=checkbox name=nOK>N "
	+"</td></tr><tr><td></td><td>"
	+"<input type=checkbox name=sOK>S "
	+"<input type=checkbox name=clOK>Cl "
	+"<input type=checkbox name=brOK>Br "
	+"<input type=checkbox name=iOK>I "
	+"</td></tr></table>"
	+"</td></tr>"
	+"<tr><td><input type=radio name=Monly checked>Must be the molecular ion<br><input type=radio name=Monly>Find all possible fragment ions</td>"
	+"<td><input type=button value=Check onclick=doit()></td></tr>"
	+"<tr><td colspan=3 align=center>Enter a nominal mass, check which elements to allow and what sort of ion to find,<br>then click on <b>Check</b> to see what combinations are possible.</td></tr>"
	+"</table></form></center>"

document.writeln(stable)


