/*

Copyright 2006, Robert M. Hanson, St. Olaf College, Northfield, MN, hansonr@stolaf.edu

That said, consider this page open for genernal use, study, and copying. 


*/

if(top==self)document.location.href="index.htm"
resonancedelay=2000
natoms=0
nbonds=0
sname=""
sbondlist=""
satomlist=""
icharge=0
nbondesigma=0
nbonde=0
nloneelec=0
ntotalve=0
ntotalvp=0
totalc=0
nneeded=0
lastrow=0
lastcol=0
ishowtable2=true
istest=false
idata=0
ithis=0
Grid=new Array()
Atoms=new Array()
Bonds=new Array([0,0,0,0,0,0])
ResStr=new Array()
hashlist=""
Images=new Array()
minussign="&#150;"
sdigits=" 0123456789"

/*  
 Data are "name","form",charge,"row1","row2","row3"...
 where a row character is an Atom symbol, _ to skip, or ! to NOT bond to next atom
 Yes, only single-character elements are allowed. (Others get in the way of electrons.)
 the last element is the solution. semicolons separate resonance structures
 atom clicks|bond clicks
 0 indicates "copy element 0"
 use ?test to get the list of these
*/
Data=new Array(""
,["acetate ion","CH3CO2",-1,"_H!O|HCCO|_H","2,2,6,6,6|4;2,2,2,6,6|5"]
,["acetic acid","CH3CO2H",0,"_H!O|HCCOH|_H","2,2,6,6|4"]
,["acetone","CH3COCH3",0,"_H!O!H|HCCCH|_H_H","2,2|4"]
,["acetylene","HCCH",0,"HCCH","|2,2"]
,["allene","CH2CCH2",0,"H_H|CCC|H_H","|2,3"]
,["ammonia","NH3",0,"HNH|_H","2|"]
,["boron trifluoride","BF3",0,"_F|FBF","1,1,1,2,2,2,4,4,4|"]
,["carbide ion","C2",-2,"CC","1,2|1,1"]
,["carbon dioxide","CO2",0,"OCO","1,1,3,3|1,2"]
,["carbonic acid","H2CO3",0,"__O|HOCOH","1,1,3,3,5,5|3"]
,["carbonate ion","CO3",-2,"_O|OCO","1,1,1,2,2,4,4,4|1;1,1,2,2,2,4,4,4|2;1,1,1,2,2,2,4,4|3"]
,["dihydrogen phosphate ion","H2PO4",-1,"__O|HOPOH|__O","1,1,1,5,5,7,7,7,3,3|;0,1|3;0,7|6"]
,["ethanol","CH3CH2OH",0,"_H!H|HCCOH|_HH","6,6|"]
,["ethylene","CH2CH2",0,"_H|HCCH|__H","|3"]
,["ethyl ether","CH3CH2OCH2CH3",0,"_H!H_H!H|HCCOCCH|_HH_HH","8,8|"]
,["hydrogen carbonate ion","HCO3",-1,"__O|HOCO","1,1,1,5,5,5,3,3,1|3;1,1,1,5,5,5,3,3,5|4"]
,["hydrogen fluoride","HF",0,"HF","2,2,2|"]
,["hydrogen peroxide","H2O2",0,"HO|_OH","2,2,3,3|"]
,["hydrogen phosphate ion","HPO4",-2,"__O|HOPO|__O","1,1,1,5,5,5,6,6,6,3,3|;0,1|3;0,5|4;0,6|5"]
,["hydrogen sulfate ion","HSO4",-1,"__O|HOSO|__O","1,1,1,5,5,5,6,6,6,3,3|;0,1|3;0,5|4;0,6|5;0,1,5|3,4;0,1,6|3,5;0,5,6|4,5"]
,["methylamine","CH3NH2",0,"_H|HCNH|_HH","4|"]
,["methyl cation","CH3",1,"HCH|_H","|"]
,["methanol","CH3OH",0,"_H|HCOH|_H","4,4|"]
,["methoxide ion","CH3O",-1,"_H|HCO|_H","4,4,4|"]
,["methyl fluoride","CH3F",0,"_H|HCF|_H","4,4,4|"]
,["molecular fluorine","F2",0,"FF","1,1,1,2,2,2|"]
,["molecular nitrogen","N2",0,"NN","1,2|1,1"]
,["nitrate ion","NO3",-1,"_O|ONO","1,1,1,4,4,4,2,2,2,1|2;1,1,1,4,4,4,2,2,2,2|1;1,1,1,4,4,4,2,2,2,4|3"]
,["nitric acid","HNO3",0,"__O|HONO","1,1,1,5,5,5,3,3,1|3;1,1,1,5,5,5,3,3,5|4"]
,["nitrite ion","NO2",-1,"_O|ON","1,1,1,2,2,2,3,1|2;1,1,1,2,2,2,3,2|1"]
,["nitrous acid","HNO2",0,"__O|HON","1,1,1,3,3,4,1|3"]
,["oxalic acid","(CO2H)2",0,"__O!O|HOCCOH","1,1,2,2,7,7,4,4|5,3"]
,["oxalate ion","(CO2)2",-2,"_O!O|OCCO","1,1,1,2,2,2,6,6,6,3,3,3,1,2|2,4;1,1,1,2,2,2,6,6,6,3,3,3,1,6|2,5;1,1,1,2,2,2,6,6,6,3,3,3,3,6|1,5;1,1,1,2,2,2,6,6,6,3,3,3,3,2|1,4"]
,["oxygen difluoride","OF2",0,"FO|_F","1,1,1,3,3,3,2,2|"]
,["ozone","O3",0,"OO|_O","1,1,1,3,3,3,2,1|1;1,1,1,3,3,3,2,3|2"]
,["phosphate ion","PO4",-3,"_O|OPO|_O","1,1,1,4,4,4,5,5,5,2,2,2|;0,1|2;0,4|3;0,5|4;0,2|1"]
,["phosphine","PH3",0,"_H|HPH","3|"]
,["phosphoric acid","H3PO4",0,"__OH|HOPOH|__O","1,1,6,6,8,8,8,4,4|;0,8|7"]
,["sulfate ion","SO4",-2,"_O|OSO|_O","1,1,1,4,4,4,5,5,5,2,2,2|;0,1|2;0,4|3;0,5|4;0,2|1;0,1,4|2,3;0,1,5|2,4;0,1,2|2,1;0,4,5|3,4;0,4,2|3,1;0,5,2|4,1"]
,["sulfuric acid","H2SO4",0,"__O|HOSOH|__O","1,1,1,5,5,7,7,7,3,3|;0,1,7|3,6;0,1|3;0,7|6"]
,["water","H2O",0,"HO|_H","2,2|"]
)

function putanswer(ires){
 if(ithis!=idata)return
 s=ResStr[ires]
//alert(ires + " " + s)
 if(s.indexOf("0,")==0)s=ResStr[0].substring(0,ResStr[0].length-1)+s.substring(1,s.length)
 var S=s.split("|")
 var A=S[0].split(",")
 var B=S[1].split(",")
 createstructure()
 drawstructure()
 if(S[0].length)for(var i=0;i<A.length;i++)doatom(eval(A[i]))
 if(S[1].length)for(var i=0;i<B.length;i++)dobond(eval(B[i]))
 ithis=(ResStr.length>1?idata:-1)
 drawtable(true)
 if(ResStr.length>1)setTimeout("putanswer("+((ires+1)%ResStr.length)+")",resonancedelay)
}

function gethash(s){
 if(s.indexOf("0,")==0)s=ResStr[0].substring(0,ResStr[0].length-1)+s.substring(1,s.length)
 var S=s.split("|")
 var A=S[0].split(",")
 var B=S[1].split(",")
 var Alist=new Array()
 var Blist=new Array()
 for(var i=0;i<=natoms;i++)Alist[i]=0
 for(var i=0;i<=nbonds;i++)Blist[i]=1
 if(S[0].length)for(var i=0;i<A.length;i++)Alist[A[i]]+=(Alist[A[i]]==3?-1:1)
 if(S[1].length)for(var i=0;i<B.length;i++)Blist[B[i]]++
 return ""+Alist+"|"+Blist
}
function gethashlist(){
 var s=""
 ResStr=new Array()
 ResStr=Data[idata][4].split(";")
 for(i=0;i<ResStr.length;i++)s+=gethash(ResStr[i])+";"
 return s
}

function checkhash(){
 var s=""
 var Alist=new Array()
 var Blist=new Array()
 for(var i=0;i<=natoms;i++)Alist[i]=0
 for(var i=1;i<=natoms;i++){
  for(var j=0;j<4;j++)Alist[i]+=Atoms[i]["elecs"][j]/2
 }
 for(var i=0;i<=nbonds;i++)Blist[i]=1
 for(var i=1;i<=nbonds;i++)Blist[i]+=Bonds[i][2]+Bonds[i][3]-1
 return ""+Alist+"|"+Blist  
}

function checkanswer(){
 var s=checkhash()
 if(nneeded){
	alert((nneeded<0?"There are too many electrons.":"There are not enough electrons."))
	return
 }
 if(hashlist.indexOf(s)<0){
	alert("Your structure is not correct. Try again or click on \"show all resonance structures\"")
	return
 }
 alert("Correct.")
}

function dohelp(){
 ishowtable2=true
 drawtable(true)
}

function showanswers(){
 if(ithis==idata){
  ithis=-1
  drawtable(true)
  return
 }
 ResStr=new Array()
 ResStr=Data[idata][4].split(";")
 ithis=idata
 if(ResStr.length){putanswer(0)}
}

function strfirst(s,swhat){ //up to swhat
 return(s.indexOf(swhat)<0?"":s.substring(0,s.indexOf(swhat)))
} 

function loadx(){                                           
 var s=unescape(parent.document.location)
 var i=s.indexOf("?")
 if(i>=0){
  s=s.substring(i+1,s.length)
  for(var i=1;i<Data.length;i++){
	if(Data[i][0]==s||s=="?"){
		ishowtable2=false
		donew((s=="?"?-1:i))
                s="<p><a href=javascript:donew(-1)>random quiz</a>"
		return s
	}
  }
  if(s=="test")istest=true
 }
 var s="<select name=examples onchange=getexample()>"
 s+="<option value=0>PICK A COMPOUND"
 var ipt=0
 for(var i=1;i<Data.length;i++){s+="<option value="+i+">"+Data[i][0]}
 s+="</select>"
 s+="<br /><br />&nbsp;&nbsp;more from the<br/> <a target=_blank href=../../>St. Olaf College General Chemistry Toolkit</a>"
 return s

}


function getexample(){
 var i=document.frm.examples[document.frm.examples.selectedIndex].value
 donew(i)
}

Atypes=new Array()
Atypes["H"]=new Array(1,1,1,2)//row,col,valence,maxE
Atypes["B"]=new Array(2,3,3,8)
Atypes["C"]=new Array(2,4,4,8)
Atypes["N"]=new Array(2,5,3,8)
Atypes["O"]=new Array(2,6,2,8)
Atypes["F"]=new Array(2,7,1,8)
Atypes["P"]=new Array(3,5,3,12)
Atypes["S"]=new Array(3,6,2,12)
Atypes["I"]=new Array(5,7,1,12)
//Atypes["Cl"]=new Array(3,7,1,12)
//Atypes["Br"]=new Array(4,7,1,12)

function dowrite(doc,s,isrep)
{
 if(arguments.length==2)isrep=true
 isrep?doc.open("text/html","replace"):doc.open()
 doc.write("<html><body>"+s+"</body></html>")
 doc.close()
} 

function showthename(){
 dowrite(parent.fraStatusL.document,"<center><h2>"+sname+"</h2></center>")
}

function donew(i){
 if(i<=0)i=Math.floor(Math.random()*(Data.length-1))+1
 idata=i
 createstructure()
 showthename()
 drawstructure()
 drawtable(true)
 hashlist=gethashlist()
}

function drawstructure(){
 var s=maketable()
 dowrite(parent.fraQL.document,s)
}

function drawtable(isfull){
 var s=maketable2(isfull)
 dowrite(parent.fraIL.document,s)
}

function drawatom(iatom,isall){
  if(isall){
   var imag=Images[Atoms[iatom]["ix"]][Atoms[iatom]["iy"]]["n"]
   parent.fraQL.document.images[imag].src=atomimage(iatom)
  }
  var imag=Images[Atoms[iatom]["ix"]+1][Atoms[iatom]["iy"]-1]["n"]
  if(nneeded==0){
   parent.fraQL.document.images[imag].src=chargeimage(Atoms[iatom]["cformal"])
  }else{
   parent.fraQL.document.images[imag].src=chargeimage(0)
  }
}

function drawbond(ibond){
 var imag=Images[Bonds[ibond][0]][Bonds[ibond][1]]["n"]
 parent.fraQL.document.images[imag].src=bondimage(ibond)
}

function drawcharges(){
 for(var i=1;i<=natoms;i++)drawatom(i,0)
}

function doatom(iatom){
 ithis=-1
 var need0=nneeded
 var inew=-1
 var edir=Atoms[iatom]["edir"]
 var elast=-1
 var idolist=(iatom>0)
 if(!idolist)iatom=-iatom
 //if(Atoms[iatom]["maxe"]==Atoms[iatom]["etotal"]){alert("\n\nYou can't add additional electrons to this atom.");return}
 for(var i=0;i<4;i++){
  if(edir<0 && Atoms[iatom]["elecs"][i]){elast=i;break}
  if(edir>0 && Atoms[iatom]["elecs"][i]+Atoms[iatom]["bonds"][i]==0){inew=i;break}
 }
 if(inew<0){
  if(elast>=0){
        Atoms[iatom]["elecs"][elast]=0
  }else{
        Atoms[iatom]["elecs"]=new Array(0,0,0,0)
  }
 }else{
  if(Bonds[Atoms[iatom]["bonds"][1]][2]==3){Atoms[iatom]["elecs"]=new Array(0,0,0,2);inew=-1}
  if(Bonds[Atoms[iatom]["bonds"][3]][2]==3){Atoms[iatom]["elecs"]=new Array(0,2,0,0);inew=-1}
  if(inew>=0)Atoms[iatom]["elecs"][inew]=2
 }
 setatominfo(iatom,true)
 setfullinfo()
 drawatom(iatom,1)
 if(nneeded==0 || need0==0)drawcharges()
 if(idolist)satomlist+=","+iatom
 drawtable(idolist)
}

function dobond(ibond){
 ithis=-1
 var idolist=(ibond>0)
 if(!idolist)ibond=-ibond
 var need0=nneeded
 var ia1=Bonds[ibond][4]
 var ia2=Bonds[ibond][5]
// if(Atoms[ia1]["maxe"]==Atoms[ia1]["etotal"] || Atoms[ia2]["maxe"]==Atoms[ia2]["etotal"]){alert("\n\nNo more electrons may be added between these atoms.");return}
 var i1=Bonds[ibond][2]
 var i2=Bonds[ibond][3]
 //note: only one of these will be nonzero
 var di=(i1+i2!=1 
	&& (
		Atoms[ia1]["orule"] 
		|| Atoms[ia2]["orule"] 
		|| i1+i2==3
		|| i1+i2==2 && (Atoms[ia1]["row"]>2 || Atoms[ia2]["row"]>2)
		|| Atoms[ia1]["edir"]==-1 && Atoms[ia2]["edir"]==-1)
	?-1:1)
 if(i1)Bonds[ibond][2]=i1+di
 if(i2)Bonds[ibond][3]=i2+di
//	alert(Atoms[ia1]["edir"]  +" ," +  Atoms[ia2]["edir"] +" " + di + " " + i1+ " " + i2)
 Atoms[ia1]["edir"]=di
 Atoms[ia2]["edir"]=di
 if(di<0 && (i1+i2)==1){
	Atoms[ia1]["edir"]=1
	Atoms[ia2]["edir"]=1
 }
//	alert(Atoms[ia1]["edir"]  +" after " +  Atoms[ia2]["edir"] +" " + di + " " + i1+ " " + i2)
 drawbond(ibond)
 setatominfo(ia1,false)
 setatominfo(ia2,false)
 setfullinfo()
 if(nneeded==0 || need0==0){
  drawcharges()
 }else{
  drawatom(ia1,0)
  drawatom(ia2,0)
 }
 if(idolist)sbondlist+=","+ibond
 drawtable(idolist)
}

function createstructure(){
 var n=-2
 var s=""
 var srow=""
 var ix=0
 var iy=0
 var ab=0
 nbonds=0
 natoms=0
 sbondlist=""
 satomlist=""
 var skipbond=0
 for(var i=0;i<16;i++){
  Images[i]=new Array()
  for(var j=0;j<16;j++){
    Images[i][j]=new Array()
    Images[i][j]["n"]=-1
    Images[i][j]["ab"]=0
    Images[i][j]["c"]=0
  }
 }
 lastrow=0
 lastcol=0

 icharge=Data[idata][2]
 sname=Data[idata][0]+", "+setsubs(Data[idata][1],icharge)
 var D=Data[idata][3].split("|")
 for(var irow=0;irow<D.length;irow++){
  iy+=2
  srow=D[irow]
  ix=0
  for(var i=0;i<srow.length;i++){
   s=srow.charAt(i)
   if(s=="!"){
   skipbond=1
   }else{
   ix+=2
   n+=2
   if(s!="_"){
    natoms++
    Atoms[natoms]=new Array()
    Atoms[natoms]["sym"]=s
    Atoms[natoms]["row"]=Atypes[s][0]
    Atoms[natoms]["grp"]=Atypes[s][1]
    Atoms[natoms]["val"]=Atypes[s][2]
    Atoms[natoms]["maxe"]=Atypes[s][3]
    Atoms[natoms]["ix"]=ix
    Atoms[natoms]["iy"]=iy
    Atoms[natoms]["bonds"]=new Array(0,0,0,0,0,0)
    Atoms[natoms]["maxb"]=0
    Atoms[natoms]["elecs"]=new Array(0,0,0,0)
    Atoms[natoms]["edir"]=1
    Atoms[natoms]["etotal"]=0
    Atoms[natoms]["eshare"]=0
    Atoms[natoms]["cformal"]=0
    Atoms[natoms]["image"]=n
    Images[ix][iy]["ab"]=natoms
    if(ix+1>lastcol)lastcol=ix+1
    if(iy>lastrow)lastrow=iy
    var ia1=Images[ix-2][iy]["ab"]
    var ia2=Images[ix][iy-2]["ab"]
    //check atom to left
    if(!skipbond && ia1 && !Atoms[ia1]["maxb"]){
	Atoms[natoms]["bonds"][3]=addbond(ix-1,iy,1,0,natoms,ia1)
	Atoms[ia1]["bonds"][1]=Atoms[natoms]["bonds"][3]
	Atoms[natoms]["maxb"]=(Atoms[natoms]["sym"]=="H")
	Atoms[ia1]["maxb"]=(Atoms[ia1]["sym"]=="H")
    }
    //check atom above only if not H or not bonded
    if(ia2 && !Atoms[natoms]["maxb"] && !Atoms[ia2]["maxb"]){
	Atoms[natoms]["bonds"][0]=addbond(ix,iy-1,0,1,natoms,ia2)
	Atoms[ia2]["bonds"][2]=Atoms[natoms]["bonds"][0]
	Atoms[natoms]["maxb"]=(Atoms[natoms]["sym"]=="H")
	Atoms[ia2]["maxb"]=(Atoms[ia2]["sym"]=="H")
    }
    skipbond=0
   }
   }
  }
 }
 var n=0
 for(var iy=1;iy<=lastrow;iy++){
  for(var ix=2;ix<=lastcol;ix++){
   Images[ix][iy]["n"]=n
   n++
  }
 }
 for(var i=1;i<=natoms;i++)setatominfo(i,true)
 setfullinfo()
}

function addbond(ix,iy,ih,iv,a1,a2){
 nbonds++
 Bonds[nbonds]=new Array(ix,iy,ih,iv,a1,a2)
 Images[ix][iy]["ab"]=nbonds
 return nbonds
}

function setatominfo(i,dodir){
 var totalc=0
 var nelec=0
 var nbonds=0
 for(var j=0;j<4;j++)nelec+=Atoms[i]["elecs"][j]
 for(var j=0;j<4;j++)nbonds+=(Bonds[Atoms[i]["bonds"][j]][2]+Bonds[Atoms[i]["bonds"][j]][3])
 totalc=Atoms[i]["grp"]-(nelec+nbonds)
 Atoms[i]["cformal"]=totalc
 Images[Atoms[i]["ix"]+1][Atoms[i]["iy"]-1]["c"]=totalc
 Atoms[i]["orule"]=0
 j=nelec+nbonds*2
// alert("Atom " + Atoms[i]["sym"]+" " + nelec+" " + nbonds+" " + j)
 Atoms[i]["etotal"]=j
 if(Atoms[i]["row"]<3 && j>8){
  Atoms[i]["orule"]=1
  alert("\n\nThe octet rule has been violated for "+Atoms[i]["sym"]+"!")
 }
 if(!dodir)return
 j=(nelec?j:0)
 if(j==8||Atoms[i]["orule"])Atoms[i]["edir"]=-1
 if(j==0)Atoms[i]["edir"]=1
 return	

}

function setfullinfo(){
 nbondesigma=0
 nbonde=0
 nloneelec=0
 ntotalve=0
 ntotalvp=0
 totalc=0
 nneeded=0
 for(var i=1;i<=nbonds;i++){
  nbondesigma+=(Bonds[i][2]>0?2:0)
  nbondesigma+=(Bonds[i][3]>0?2:0)
  nbonde+=Bonds[i][2]*2
  nbonde+=Bonds[i][3]*2
 }
 for(var i=1;i<=natoms;i++){
  ntotalvp+=Atoms[i]["grp"]
  for(var j=0;j<4;j++)nloneelec+=Atoms[i]["elecs"][j]
 }
 ntotalve=nloneelec+nbonde 
 nneeded=ntotalvp-icharge-ntotalve
}

function setsubs(sform,icharge)
{
 var s=""
 var sf=""
 for (var i=0;i<sform.length;i++)
 {
  s=sform.charAt(i)
  sf=sf + (sdigits.indexOf(s)>0?"<sub>"+s+"</sub>":s)
 }
//# 630
 if(icharge)sf+="<sup>"+(icharge==1||icharge==-1?"":Math.abs(icharge))+(icharge>0?"+":minussign)+"</sup>"
 return sf
}

function maketable(){
 var s="<center><table cellpadding=0 cellspacing=0>"
 var ab=1
 var n=0
 var nab=0
 var i=0
 var arow=1
 for(var iy=1;iy<=lastrow;iy++){
  s+="\n<tr>"
  arow=1-arow
  ab=(arow?1:0)
  for(var ix=2;ix<=lastcol;ix++){
   n=Images[ix][iy]["n"]
   nab=Images[ix][iy]["ab"]
   if(nab){
        if(ab){
          s+="\n<td><a href=javascript:parent.fraIndexL.doatom("+nab+")><img border=0 alt='"+Atoms[nab]["sym"]+" contributes "+Atoms[nab]["grp"]+" valence electron"+(Atoms[nab]["grp"]==1?"":"s")+"' src="+atomimage(nab)+"></a></td>"
        }else{
          s+="\n<td><a href=javascript:parent.fraIndexL.dobond("+nab+")><img border=0 src="+bondimage(nab)+"></a></td>"
        }
   }else{
        if(nneeded==0 && !arow && Images[ix][iy]["c"]) {
		s+="\n<td><img border=0 src="+chargeimage(Images[ix][iy]["c"])+"></td>"
        }else{
		s+="\n<td><img border=0 src=_0000.gif></td>"
	}
   }
  ab=(arow?1-ab:0)
  }
 }
 s+="\n</table><p>Click on an atom to add or remove lone pairs or on a bond to change its type.</center>"
 return s
}


function maketable2(isfull){
 if(!isfull)return
 var s="<center>"
 var sfont=(nneeded==0?"":"<font color=red>")
 if(ishowtable2){

 s+="<table border><tr><th rowspan=2 colspan=2><small>Required Valence Electrons:<td><small>For Atoms<td><small><center>Charge ("+(icharge>0?"+":"")+icharge+")<td><small><center>Total"
 s+="<tr><th><small>"+ntotalvp
 s+="<th><small>"+(icharge>0?icharge+" MISSING":(icharge==0?"NONE":-icharge+" EXTRA"))
 s+="<th><small>"+(ntotalvp-icharge)
 s+="<tr><th rowspan=2><small>"+sfont+"Electrons As Written:<td><small>Single Bonds<td><small><center>Lone Pair<td><small>Double/Triple Bonds<td><small>Still Needed"
 s+="<tr><th><small>"+nbondesigma
 s+="<th><small>"+nloneelec
 s+="<th><small>"+(nbonde-nbondesigma)
 s+="<th><small>"+sfont+nneeded
// s+="<tr><th colspan=4><small>Valence Electrons if Neutral<th><small>"+ntotalvp
// i=(ntotalvp-ntotalve)
// s+="<tr><th colspan=4><small>Overall Charge<th><small>"+(i<0?"<font color=blue>":"")+(i>0?"<font color=red>+":"")+i
 s+="</font>\n</table><p>"
 if(istest)s+="<form><input type=text size=30 value='"+satomlist.substring(1,1000)+"|"+sbondlist.substring(1,1000)+"'></form>"
}else{
 s+="<a href=javascript:parent.fraIndexL.dohelp()>help</a>&nbsp;&nbsp;"
}
 s+="<a href=javascript:parent.fraIndexL.checkanswer()>check structure</a>"
 s+="&nbsp;&nbsp;<a href=javascript:parent.fraIndexL.showanswers()>"+(ithis==idata?"stop showing ":"show all ")+"resonance structures</a>"
 return s
}




function atomimage(nab){
 return Atoms[nab]["sym"].toLowerCase()+Atoms[nab]["elecs"][0]+Atoms[nab]["elecs"][1]+Atoms[nab]["elecs"][2]+Atoms[nab]["elecs"][3]+".gif"
}
function bondimage(nab){
 return "_"+Bonds[nab][2]+Bonds[nab][3]+".gif"
}
function chargeimage(i){
 return "c"+i+".gif"
}


