//Bob Hanson and Melanie Casavant 6/15/2004 revised 12:41 PM 2/5/2008

//see navinfo.js for many adjustable constants

PT=new Array()

CMD_ATOMS=1
CMD_CENTER=-1
CMD_BONDS=2
CMD_SHAPES=3
CMD_METHOD=4
CMD_TEXT=5
CMD_SRC=6

Cmd=new Array(0
	,["atoms","Search for specific elements."]
	,["bonds","Search by specific pairs of elements X-Y."]
	,["shape","Search by shape and specific elements."]
	,["method","Search by the experimental method used to determine the structure."]
	,["text","Search by text in the formula, name, reference, or database code."]
	,["source","Search by data source."]
	)

thiscommand=CMD_ATOMS
docsearch=docsearch.replace(/method\=/,"by=me&search=").replace(/shape\=/,"by=sh&search=").replace(/text\=/,"by=te&search=").replace(/atoms\=/,"by=at&search=").replace(/bond\=/,"by=bo&search=")
operatest=(docsearch.indexOf("operatest")>=0)
searchdata=fieldof(docsearch,"by")
if(searchdata.indexOf("bo")==0)thiscommand=CMD_BONDS
if(searchdata.indexOf("me")==0)thiscommand=CMD_METHOD
if(searchdata.indexOf("sh")==0)thiscommand=CMD_SHAPES
if(searchdata.indexOf("te")==0)thiscommand=CMD_TEXT
if(searchdata.indexOf("sr")==0)thiscommand=CMD_SRC
searchdata=fieldof(docsearch,"search")
autoload=(docsearch.indexOf("&go")>=0)
thisgeom=(thiscommand==CMD_SHAPES?searchdata:"")
thismethod=(thiscommand==CMD_METHOD?searchdata:"")
thistext=(thiscommand==CMD_TEXT?searchdata:"")
thissrc=(thiscommand==CMD_SRC?searchdata:"")
islineartable=(docsearch.indexOf("linear")>=0)
jmoldivtext=""
scale3d=defaultscale3d
lastscript="background white"
lastpick=0
picktrigger=2
ithismodel=-1
thismode=""
thisapplet=""
thismodelcenter=""
thisstructure=""
firstbondsym=""
modename=""
bondsym=""
thisatomn=0
firstbondn=0
lastatomn=0
is2ndatom=0
shortestbond=0
iselect=1
nselected=0
isstartup=0
structurelist=""
ifirststructure=-1

clickablelist=""
query=""
nthistotal=0
nthiscenter=0
nthisbond=0
nthisgeom=0
nthistext=0
nthis0=0
nthismethod=0
nthissrc=0
thislist=""
thiselementset=""
isclicked=false
pointer1=0
pointer2=0
bdist2=0
Range=new Array(0,0)
PT=new Array()
jumptowindow=0
isjmolinline=false

function dodisplay(cmd,idoall){
 if(!cmd)cmd=thiscommand
 query="" //global
 var n=0
 if(0
	|| cmd==CMD_ATOMS && nthistotal==0
	|| cmd==CMD_CENTER && nthiscenter==0 
	|| cmd==CMD_BONDS && nthisbond==0
	|| cmd==CMD_SHAPES && nthisgeom==0
	|| cmd==CMD_METHOD && nthismethod==0
	|| cmd==CMD_TEXT && nthistext==0
	|| cmd==CMD_SRC && nthissrc==0
	){
	alert("First you must select some elements having structures to list")
	return
 }
 if(idoall){
  if(cmd==CMD_TEXT){
	query=getquery()+"|"+escape(thistext.toLowerCase().replace(/\+/g,"`"))
	n=nthistext
  }else if(cmd==CMD_SHAPES){
	query=getquery()+"&c=1"+(thisgeom!="any"?"&shape="+thisgeom:"")
	n=nthisgeom
  }else if(cmd==CMD_METHOD){
	query=getquery()+"&c=1"+(thismethod!="any"?"&method="+thismethod:"")
	n=nthismethod
  }else if(cmd==CMD_BONDS){
	query=bondsym+"&r=1&r1="+pointer1+"&r2="+bdist2
	n=nthisbond
  }else if(cmd==CMD_SRC){
	query=getquery()+"&c=1"+(thissrc!="any"?"&src="+thissrc:"")
	n=nthissrc
  }else{
	query=getquery()+"&c="+(cmd==CMD_CENTER?1:0)
	n=(cmd==CMD_CENTER?nthiscenter:nthistotal)
  }
  if(idodetails)query+="&d=1"
  query=searchpage+query
  jumptowindow=0
  divsetvisibility("showplace",true)
  showworking()
  setTimeout("getthedata("+n+");dowait(0)",100)
 // createWindow(query)
 }else{
  waitfor("dodisplay("+cmd+",1)")
 }
}

function showfilelist(slist){
	var s=searchfor("|file list",prescreen("",-4,slist))
//	divwrite("selectplace",gettable(s,"dosortby"))
        //divwrite("selectplace",gettable(0,"dosortby"))
	divsetvisibility("showplace",true)
	divsetvisibility("selectplace",false)
	createthelist(s)
	showdata(0)
}

function getthedata(n,q){
	if(!q)q=query
	var s=searchfor(q)
	createthelist(s,(thiscommand==CMD_BONDS),bondsym,firstbondsym,Range)
	showdata(0)
}

function showdata(isrevised){
	divwrite("showplace",(thiscommand==CMD_BONDS?"<br>&nbsp;<br>":"")+gettable(isrevised,"dosortby",(thiscommand==CMD_BONDS),bondsym))
	if(autoload && ifirststructure>=0){
		setTimeout("doshowmolinfo("+ifirststructure+");autoload=false",1000)
	}else{
		autoload=false
		isstartup=false
	}
}

function dopick(isall){
	if(thiscommand==CMD_BONDS){
		alert("Just pick the two atoms in the bond\nyou want to search for.")
		return
	}
	if(isall){
		dowait(1)
		setTimeout("PTselectElements(0,0,thiselementset);shownprescreen(1,'pickall');dowait(0)",500)
	}else{
		dowait(1)
		setTimeout("remapcolors();dowait(0)",500)
	}
}

function remapcolors(ia,ib,n){
 if(arguments.length<2)ia=ib=0
 if(arguments.length<3)n=PT.thisscheme
 PTgetScheme(PT,n)
 thiselementset=";"
 var s=""
 for(var i=1;i<Elements.length;i++){
	if(i!=ia && i!=ib){
		Elements[i].icolor=""
		Elements[i].isselectable=isselectable(i)
		s=getselectablecolor(i)
		if(s!=nostruccolor)thiselementset+=Elements[i].sym+";"
		PTsetColors(i,Elements[i].blockcolor,s)
		Elements[i].selected=0
	}
 }
 shownprescreen(1,"remap")
}

function loaddatabase(){
 mo()
}

function settableproperties(){
 PT=new Array()
 PTsetDefaults(PT,"from settableproperties")
 PT.miniversion=miniversion
 PT.largesymbols=largesymbols
 PT.havemini=true
 PT.openCallback=doopentable
 PT.closeCallback=doclosetable
 PT.mouseclickCallback=mCLICK
 PT.clickColCallback=doclickcol
 PT.clickRowCallback=doclickrow
 PT.PickBtns=[bref("dopick(1) title=\"Click here to select all relevant elements, or double-click one element to select just it.\"","PICK ALL",2)
	,bref("dopick(0) title=\"Click here to unselect all the elements.\"","CLEAR",2)]
 PT.tmbgcolor=nostruccolor
 PT.bgcolor=backgroundcolor
 PT.bodycolor=bodycolor
 PTgetScheme(PT)
}

function loadtable(){
 setpointer(level)
 settableproperties()
 thiselementst=";"
 var s=""
 for(var i=1;i<Elements.length;i++){
	Elements[i].isselectable=isselectable(i)
	s=getselectablecolor(i)
	if(s!=nostruccolor)thiselementset+=Elements[i].sym+";"
 }
 s="<div id=resultplace></div>"
 s+="<div id=showplace></div>"
 s+="<div id=graphplace></div>"
 s+="<div id=selectplace></div>"
 s+="<div id=jmolplace></div>"
 s+="<div id=infoplace></div>"
 s+=PTgetDiv(PT,"notableplace","notablep",1,"","")
 document.write(s)
 s=PTgetDiv(PT,"tableplace","tablep",0,"",getmoflags("<p>"))
 document.write(s)
 //document.write(s.replace(/\</g,"<br>&lt;"))
}

function loadindex(){
 s="<table><tr><td>"+getbuttons()+"</td></tr></table>"
 writetoindex("<head>"+getstyles()+"</head><body>"+s+"</body>")
}

function writetoindex(s){
 parent.fraIndex.document.open()
 parent.fraIndex.document.write("<html>"+s+"</html>")
 parent.fraIndex.document.close()
}

function getselectablecolor(n){
	var s=(isclickable(n) && Elements[n].isselectable?backgroundcolor:nostruccolor)
	Elements[n].bgcolor=s
	return s
}

function isselectable(n){
	var e=Elements[n].sym
	if(!HasMO[e])return 0
	if(thiscommand==CMD_TEXT){
		if(thistext=="")return Elements[n].iscenter
		return isclickable(n)
	}else if(thiscommand==CMD_METHOD){
		if(thismethod=="")return Elements[n].iscenter
		return parseInt(prescreen(e,-2,thismethod))
	}else if(thiscommand==CMD_SHAPES){
		if(thisgeom=="any")return Elements[n].iscenter
		return parseInt(prescreen(e,-1,thisgeom))
	}else{
		return HasMO[e].length
	}
}

function getquery(isn,isarray){
 var S=new Array()
 for(var i=1;i<Elements.length;i++){
	if(Elements[i].selected>0)S[S.length]=(isn?i:Elements[i].sym)
 }
 nselected=S.length
 return (isarray?S:S.join(","))
}

function getbuttons(){
 var s=thetitle+"<p><center>Search by..."
 s+="<table   border=0>"
 for(var i=1;i<Cmd.length;i++)s+="<tr>"+buttoncell(i,thiscommand,Cmd[i][0],Cmd[i][1],1)+"</tr>"
 s+="</table>"
 s+="</center>"
 s+="<p><span class=info>"+thenote.replace(/NSTRUC/,nstruc).replace(/LEVEL/,Level[level][2])+"</span>" 
 return s

}

function docmd(n,isall){
 if(n>10){
	//navigation toolbar
	setpointer(n)
	var s="periodic.htm?noview=1&"+(islineartable?"linear&":"")+"list=&level="+parent.fraNav.Subsets[n]
	location=s
	return
 }

 if(!n)n=thiscommand
 if(!isall){
	waitfor("docmd("+n+",1)")
	return
 }

 if(isjmolinline){
	var s=PTgetDivContents(PT,"tableplace","tablep",0,"",getmoflags("<p>"))
	divwrite("tableplace",s)
	isjmolinline=0
 }

 isstartup=(n==-99)
 if(isstartup){
	if(islineartable)PTdoCloseTable()
	n=thiscommand
	if(n==CMD_BONDS && searchdata){
		PTselectElements(0,0,";"+searchdata.replace(/\-/g,";")+";")
	}
 }
 setenables(false)
 getclickhistory(0,thiscommand,n)

 thiscommand=n
 setmousepointer(-1,"docmd")
 setpointer(n)
 divwrite('selectplace',getselectpanel())
 remapcolors(thisatomn,lastatomn)
 var isstart=isstartup
 if(isstartup && filelist)showfilelist(filelist)
 if(isstartup && thiscommand==CMD_TEXT && searchdata)checktext()
 if(isstartup && thiscommand==CMD_METHOD && searchdata)checkmethod()
 if(isstartup && thiscommand==CMD_SRC && searchdata)checksrc()
 if(isstartup && thiscommand==CMD_SHAPES && searchdata)checkgeometry()
 if(isstart && iloadview)doview()
}

function changecolorb(r,isin){
 var d=divfind("blen"+r)
 if(d)d.bgColor=(isin?"#000000":bodycolor)
}

function mCLICK(n,isdblclick){
	var s=""
	if(n && !isclickable(n)){
		if(thiscommand==CMD_ATOMS){
			alert("Elements that have a dark background\nhave no stuctures in the database.")
			return 0
		}else if(thiscommand==CMD_METHOD||thiscommand==CMD_SHAPES||thiscommand==CMD_TEXT){
			alert("Elements that have a dark background\nhave no stuctures in the database of this type.")
			return 0
		}
	}
	if(thiscommand==CMD_BONDS){

		//always turn on 
		Elements[n].selected=1
		PTchangeColor(n,0)

		getclickhistory(n)

		for(var i=1;i<Elements.length;i++){
			if(i!=n && i!=firstbondn && Elements[i].selected!=0){
				Elements[i].selected=0
				Elements[i].isselectable=0
				PTsetColors(i,Elements[i].blockcolor,Elements[i].bgcolor)
			}
			if(!is2ndatom){
				Elements[i].isselectable=nbond(firstbondsym,Elements[i].sym)
				s=getselectablecolor(i)
				PTsetColors(i,0,s)
			}
		}
		shownprescreen(1,"mClick")
	}else{
		if(isdblclick){
			remapcolors()
			Elements[n].selected=1
			PTchangeColor(n,0)
		}
		shownprescreen(1,"mClick")
	}
	isclicked=true
	return 1
}

function isclickable(n){
	return (!clickablelist || clickablelist.indexOf(";"+Elements[n].sym+";")>=0)
}

function gIN(d){
	(d==pointer1 || d==pointer2?"":changecolorb(d,1))
}

function gOUT(d){
	return (d==pointer1 || d==pointer2?"":changecolorb(d,0))
}

function gCLICK(d){
	return setmousepointer(d,"gCLICK")
}

function getbdist2(){
 return (pointer2?pointer2:pointer1?pointer1:longestbond)+pm_per_bin-0.1
}

function setmousepointer(r,mess){
 //p1, p2, p1, p2, p1, p2, etc...  r<0 no show

 var p1=pointer1
 var p2=pointer2

 if(!pointer1||pointer2||r<=0){
	pointer2=0
	pointer1=(r<0?0:r)
 }else{
	pointer2=Math.max(pointer1,r)
	pointer1=Math.min(pointer1,r)
 }
 bdist2=getbdist2()
 
 if(r<0)return

 if(p1!=pointer1 && p1!=pointer2){
	changecolorb(p1,0)
 }
 if(p2!=pointer1 && p2!=pointer2){
	changecolorb(p2,0)
 }
 if(pointer1)changecolorb(pointer1,1)
 if(pointer2)changecolorb(pointer2,1)
 shownprescreen(0,"setmousepointer")
}

function getclickhistory(n,lastcommand,newcommand){
 if(n)lastcommand=newcommand=thiscommand

 var S=getquery(1,1)
 if(nselected==0)S[0]=0
 if(lastcommand>CMD_BONDS
  ||lastcommand==CMD_ATOMS&&S.length>2
  ||newcommand!=CMD_BONDS
  ||S[0]==0){
	thisatomn=0
	lastatomn=0
	firstbondn=0
	firstbondsym=""
	bondsym=""
	is2ndatom=isclicked=false
	return
 }
 if(S.length==1||is2ndatom){
	lastatomn=(is2ndatom||!isclicked?0:n)
	firstbondn=thisatomn=(is2ndatom?n:S[0])
	firstbondsym=Elements[thisatomn].sym
	is2ndatom=(lastatomn==thisatomn)
	bondsym=firstbondsym+(is2ndatom?"-"+firstbondsym:"")
	isclicked=true
	return
 }
 //must determine last two clicked:
 thisatomn=(n?n:getlastselected(0))
 lastatomn=getlastselected(thisatomn)
 firstbondsym=Elements[lastatomn].sym
 bondsym=(firstbondsym+"-"+Elements[thisatomn].sym).split("-").sort().join("-")
 is2ndatom=isclicked=true
}

function getlastselected(n){
	var ilast=0
	var iselect=0
	for(var i=1;i<Elements.length;i++){
		if(Elements[i].selected>iselect && i!=n){
			ilast=i
			iselect=Elements[i].selected
		}
	}
	return ilast
}

function nbond(a,b){
	var s=""
	if(a>b){s=b;b=a;a=s}
	return (BondList[a] && BondList[a][b]?BondList[a][b].length:0)
}

function doclickrow(r){
	if(!PT.rowcolbuttonsenabled)return alert("Row and Column buttons are not enabled for bond searches.")
	shownprescreen(1,"doclickrow")
}

function doclickcol(c){
	if(!PT.rowcolbuttonsenabled)return alert("Row and Column buttons are not enabled for bond searches.")
	shownprescreen(1,"doclickcol")
}
 
function dojs(){
	var f=getwhatp("showp")
	if(!f)return alert("NO SHOWP ID?")
	alert(eval(f.txtjs.value))
}

function shownprescreen(idoall,mess){
	//idoall set 0 in setmousepointer
	var s=""
	var slist=""
	var n=thiscommand
	var S=new Array()
	var where="resultplace"
	nthiscmd=0
	divwrite(where,"")
//modifying to write to two lower panels, showselect and showplace

	if(n==CMD_ATOMS){
		where="selectplace"
	}else if(n==CMD_BONDS){
		where="selectplace"
		if(idoall)setmousepointer(0,"shownpresidoall")
	}else if(n==CMD_SHAPES){
		slist=getquery()
		nthisgeom=(thisgeom!="any"?parseInt(prescreen(slist,-1,thisgeom)):parseInt(prescreen(slist,1)))
	}else if(n==CMD_METHOD){
		slist=getquery()
		nthismethod=(thismethod!=""?parseInt(prescreen(slist,-2,thismethod)):parseInt(prescreen(slist,1)))
	}else if(n==CMD_TEXT){
		slist=getquery()
		thislist=prescreen(slist,-3,thistext)
		nthistext=(thistext!=""?parseInt(thislist):0)
	}else if(n==CMD_SRC){
		slist=getquery()
		nthissrc=(thissrc!=""?parseInt(prescreen(slist,-5, thissrc)):parseInt(prescreen(slist,1)))
	}
	//alert("in shownprescreen"+idoall+" "+mess)
	if(mess=="setmousepointer"){
		getgraphpanel(0)
	}else{
		divwrite("graphplace",getgraphpanel(1))
	}
	s+=getlowerpanel()
	if(nthiscmd>0 && nthiscmd<=MAXDISPLAY){
		divwrite(where,s)
		if(where!="showplace")showworking()
		dodisplay()
	}else{
		if(nthiscmd)s="<table><tr><td>"+s+"</td><td><a href=javascript:dodisplay()>Display list of "+nthiscmd+" structures</a></td></tr></table>"
		divwrite(where,s)
		divwrite("showplace","")
		divsetvisibility("showplace",false)
		ifirststructure=-1
	}
}

function showworking(){
	divwrite("showplace",(thiscommand==CMD_BONDS?"<br>&nbsp;<br>":"")+"working . . .")
}

function getlowerpanel(){

 var slist=""
 var n=thiscommand
 var s=""
 var st=""

 nthiscmd=0
 PT.rowcolbuttonsenabled=true
 clickablelist=""
 var aname=""
 var forma=""
 var formb=""
 if(n==CMD_ATOMS){
	clickablelist=getchecklist(0)
	slist=getquery()
	aname=(AtomNum[slist]?Elements[AtomNum[slist]].name:"??")
	forma=prescreen(slist,0)
	nthistotal=parseInt(forma)
	formb=prescreen(slist,1)
	nthiscenter=parseInt(formb)
	s+="<td align=center width=800>"
	if(slist==""){
		s+="To begin, select one or more elements, rows, columns, or blocks of the periodic table.<br>Or you can choose to search by bonds, shape, experimental method, or text."
		if(onetimemessage)s+="<p>"+onetimemessage
		onetimemessage=""
		s+="<pre>\n\n\n\n\n\n\n\n\n\n\n</pre>"
	}else{
		s+="NX WHERE either in a central location or connected to it. "
		st=(!nthistotal?"No structures":nthistotal+" structure"+(nthistotal==1?", "+getstructurename(forma)+", has":"s have"))
		s=s.replace(/NX/,st)
		st=(nselected==1?aname:"one of the selected elements")
		s=s.replace(/WHERE/,st)
	}
	if(nthistotal){
		s+="<br>"+(nthistotal==1 && nthiscenter==1?"In this compound, it is":"Of these, CX WHERE")+" in a central location. "
		st=(nthiscenter==nthistotal?"all have":!nthiscenter?"none have":nthiscenter+(nthiscenter==1?", "+getstructurename(formb)+", has "+slist:" have"))
		s=s.replace(/CX/,st)	
		st=(nselected==1?aname:"one of these elements")
		s=s.replace(/WHERE/,st)
		if(nthiscenter && nthiscenter!=nthistotal)s+=" <a href=javascript:dodisplay("+CMD_CENTER+")>(Show just these.)</a>"
	}
	s+="</td>"
	nthiscmd=nthistotal
 }else if(n==CMD_BONDS){
	clickablelist=getchecklist(0)
	s+="</tr><tr><td width=400></td>"
	s+="<td><table>"
	s+="<tr><td align=center>"
	if(!isclicked && bdist2==0){
		s+="Click on a pair of elements (or one element twice) to define a bond, <br>or click on the graph to define a range of bond lengths."
	}else{
		if(pointer1==0 && pointer2==0){
			if(nthisbond>1)st=".<br>You may display them or pick a bond length range<br>by clicking on the graph on the left"
			Range=0
		}else{
			st=" <br>in the range "+pointer1+" - "+bdist2+" pm"
			Range=[pointer1,bdist2]
		}	
		st+=".<p>"	
		if(nthisbond==0){
			s+="No structures are in the database having at least one bond to "+bondsym+st
		}else{
			s+="There are "+nthisbond
			if(is2ndatom){
				s+=" structures in the database with at least one "+bondsym+" bond"
			}else if(!isclicked){
				s+=" structures in the database with at least one bond"
			}else{
				s+=" structures in the database with at least one bond to "+firstbondsym
			}
			if(nthisbond==1)s=s.replace(/are 1 structures/,"is one structure, "+getstructurename(structurelist)+", ")
			s+=st
			s+="</td></tr>"
		}
	}	
	s+="</table></td>"
	PT.rowcolbuttonsenabled=false
	nthiscmd=nthisbond
 }else if(n==CMD_SHAPES){
	slist=getquery()
	aname=(AtomNum[slist]?Elements[AtomNum[slist]].name:"??")
	s+="<td align=center width=800>"
	if(nselected==0){
		s+="Select one or more elements, rows, columns, or blocks of the periodic table.<br>Or you can choose to search by atoms, bonds, experimental method, or text."
		nthisgeom=0
	}else{
		s+="There are "+nthisgeom+" structure"+(nthisgeom==1?"":"s")+" with this shape<br>having the selected elements in a central location."
		if(nselected==1)s=s.replace(/the selected elements/,aname)
		s=s.replace(/are 1 /,"is one ")

	}
	s+="</td>"
	nthiscmd=nthisgeom
 }else if(n==CMD_METHOD){
	slist=getquery()
	aname=(AtomNum[slist]?Elements[AtomNum[slist]].name:"??")
	s+="<td align=center width=800>"
	if(nselected==0){
		s+="Select one or more elements, rows, columns, or blocks of the periodic table.<br>Or you can choose to search by atoms, bonds, shape, or text."
		nthismethod=0
	}else{
		s+="There are "+nthismethod+" structure"+(nthismethod==1?" that was":"s that were")+" determined using this method<br>having the selected elements in a central location."
		if(nselected==1)s=s.replace(/the selected elements/,aname)
		s=s.replace(/are 1 /,"is one ")
	}
	s+="</td>"
	nthiscmd=nthismethod
 }else if(n==CMD_SRC){
	slist=getquery()
	aname=(AtomNum[slist]?Elements[AtomNum[slist]].name:"??")
	s+="<td align=center width=800>"
	if(nselected==0){
		s+="Select one or more elements, rows, columns, or blocks of the periodic table.<br>Or you can choose to search by atoms, bonds, shape, or text."
		nthissrc=0
	}else{
		s+="There are "+nthissrc+" structure"+(nthissrc==1?" that is":"s that are")+" from this source<br>having the selected elements in a central location."
		if(nselected==1)s=s.replace(/the selected elements/,aname)
		s=s.replace(/are 1 /,"is one ")
	}
	s+="</td>"
	nthiscmd=nthissrc
 }else if(n==CMD_TEXT){
	slist=getquery()
	aname=(AtomNum[slist]?Elements[AtomNum[slist]].name:"??")
	s+="<td align=center width=800>"
	if(nselected==0){
		s+="Select one or more elements, rows, columns, or blocks of the periodic table.<br>Or you can choose to search by atoms, bonds, shape, or experimental method."
		nthistext=0
	}else{
		s+="There are "+nthistext+" structures that have the text \""+thistext+"\" somewhere in the <br>formula, name, reference, or database code."
		s=s.replace(/ 0 /," no ")
		if(nthistext==1)s=s.replace(/are 1 structures that have/,"is one structure, "+getstructurename(thislist)+", that has ")
	}
	s+="</td>"
	nthiscmd=nthistext
 }
 s="<form id=showp name=showp><table border=0 align=center><tr>"+s+"</tr></table></form>"
 //writeNewWindow(s.replace(/\</g,"<br>&lt;"))
 return s
}

function getselectpanel(){
 var s="<form id=selectp name=selectp action=javascript:checktext()//><table   border=0 align=center><tr>"
 if(thiscommand==CMD_SHAPES){
	if(!isstartup||!thisgeom)thisgeom="any"
	clickablelist=getchecklist(1)
	nthis0=nthisgeom=parseInt(clickablelist)
	s+="<td align=center>Select a shape to see what elements are involved as central atoms: "
	s+=getgeomlist(thisgeom,1,"checkgeometry()")
	s+="</td>"
 }else if(thiscommand==CMD_METHOD){
	if(!isstartup)thismethod=""
	clickablelist=getchecklist(1)
	nthis0=nthismethod=parseInt(clickablelist)
	s+="<td align=center>Select an experimental method to see what elements are involved as central atoms:"
	s+=getmethodlist(thismethod,1,"checkmethod()")
	s+="</td>"
 }else if(thiscommand==CMD_TEXT){
	//thistext=""
	clickablelist=getchecklist(1)
	nthis0=nthistext=parseInt(clickablelist)
	s+="<td align=center>Indicate text to see what elements are involved as central atoms:"
	s+="<input type=text size=30 name=thetext value=\""+thistext.replace(/\"/g,"")+"\"> "+jref("Search","checktext()")
	s+="</td>"
 }else if(thiscommand==CMD_SRC){
	if(!isstartup)thissrc=""
	clickablelist=getchecklist(1)
	nthis0=nthissrc=parseInt(clickablelist)
	s+="<td align=center>Select a data source to see what elements are involved as central atoms:"
	s+=getsourcelist(thissrc,1,"checksrc()")
	s+="</td>"
 }
 s+="</tr></table></form>"
 return s
}

function getgraphpanel(idoall){
 if(thiscommand!=CMD_BONDS)return ""
 var lookfor=bondsym+"-"
 var s="<table   border=1><tr><td><table><tr><td><table   cellpadding=0 cellspacing=0 border=0><tr><td width=5></td>"
 var d=0
 var S=new Array()
 var n=0
 var h=0
 var ntop=maxgraphbar
 var nmin=1
 var nmax=0
 var nbins=0
 var isinrange=0
 var pt1=999
 var pt2=0
 structurelist=""
 for(var i in DistList){
	DistList[i].count=0
	d=parseInt(i)*pm_per_bin
	isinrange=(d>=pointer1 && d<=bdist2)
	for(var j in DistList[i]){
		if(j.indexOf("-")>=0 && (!lookfor || j.indexOf(lookfor)>=0)){
			if(isinrange)addtoslist(DistList[i][j])
			n=DistList[i][j].length
			if(n>nmax)nmax=n
			nbins++
			DistList[i].count+=n
			if(d<pt1)pt1=d
			if(d>pt2)pt2=d
		}
	}
 }
 if(pointer1==0 && pointer2==0){
	pointer1=(pt1==999?0:pt1)
	pointer2=pt2
	bdist2=getbdist2()
 }
 nthisbond=structurelist.split(";").length-1

 if(!idoall){
	return ""
 }
 if(nmax<5)ntop*=5
 //maxndist was found to be 98
 s+="<td><img src=img/t4.gif width=1 height="+(maxgraphbar+nmin+5)+"></td>"

 for(var d=0; d<=longestbond;d+=pm_per_bin){
	i=(d/pm_per_bin)+"_"
	n=(DistList[i]?DistList[i].count:0)
	h=Math.floor(n/maxndist*ntop+1)
	s+="<td id=blen"+d+" onmouseover=gIN("+d+") onmouseout=gOUT("+d+") valign=bottom title=\""+d+"-"+(d+pm_per_bin-0.1)+" pm ("+n+" structure"+(n==1?"":"s")+")\""
	+(d==0||d!=pointer1&&d!=pointer2?"":" bgcolor=#000000")+">"
	s+="<a href=javascript:gCLICK("+d+")><img src=img/t4.gif border=0 width=4 height="+(maxgraphbar-h)+"><br><img border=0 src=img/r4.gif width=4 height="+h+"></a></td>"
 }
 s+="</tr></table></td></tr><tr><td><img src=img/scale.gif></td></tr></table></td></tr></table>"
 s+="<font color=red>click on two distances to define a range to display</font>"
 return s
}

function addtoslist(A){
 if(!structurelist){
	structurelist=";"+A.join(";")
	return
 }
 var s=""
 for(var i=0;i<A.length;i++){
	s=";"+A[i]
	if(structurelist.indexOf(s)<0)structurelist+=s
 }
}

function getchecklist(icenteronly){
 var s=";"
 var n=0
 for(i=1;i<Elements.length;i++){
	if(!icenteronly && Elements[i].hasstruc || Elements[i].iscenter){
		s+=Elements[i].sym+";"
		n+=Elements[i].iscenter
	}
 }
 return n+" "+s
}

function checkgeometry(){
 var s=";"
 var f=getwhatp("selectp")
 thisgeom=f.glist[f.glist.selectedIndex].text
 if(thisgeom=="any"){
	s=getchecklist()
 }else{
  for(var i in ShapeList[thisgeom])s+=i+";"
 }
 if(s==clickablelist)return
 clickablelist=s
 //thiselementset=s ???
 setenables(false)
 remapcolors()
 PTselectElements(0,0,s)
 shownprescreen(1,"checkgeometry")
 //if(cleartime)setTimeout("dopick(0)",cleartime)
}

function checkmethod(){
 var s=";"
 var slast=thismethod
 var f=getwhatp("selectp")
 thismethod=f.mlist[f.mlist.selectedIndex].value
 if(thismethod==""){
	s=getchecklist()
 }else{
  for(var i in MethodList[thismethod])s+=i+";"
 }
 if(s==clickablelist)return
 clickablelist=s
 setenables(false)
 remapcolors()
 PTselectElements(0,0,s)
 shownprescreen(1,"checkmethod")

 //if(cleartime)setTimeout("dopick(0)",cleartime)
}

function checksrc(){
 var s=";"
 var slast=thissrc
 var f=getwhatp("selectp")
 thissrc=f.srclist[f.srclist.selectedIndex].value
 if(thissrc==""){
	return
 }
 clickablelist=getchecklist(1)
 var S=prescreen(clickablelist.replace(/\;/g,","),-5,thissrc).split(";")
 for(var i=1;i<S.length;i++)s+=S[i].split(":")[0]+";"
 clickablelist=s
 remapcolors()
 PTselectElements(0,0,s)
 shownprescreen(1,"checksrc")
}

function checktext(){
 var s=";"
 var f=getwhatp("selectp")
 thistext=f.thetext.value
 if(!thistext){
	thistext=""
	return
 }
 clickablelist=getchecklist(1)
 var S=prescreen(clickablelist.replace(/\;/g,","),-3,thistext).split(";")
 for(var i=1;i<S.length;i++)s+=S[i].split(":")[0]+";"
 clickablelist=s
 remapcolors()
 PTselectElements(0,0,s)
 shownprescreen(1,"checktext")
}

function getjmolscript(i){
	var s="set bonds off;set perspectivedepth off;set echo bottom left; font echo 16;echo .  "+getshape(i)+";set echo top center;echo "+getformula(i,1)+";select "+thismodelcenter+";font label 20;label %e;"+dozoom(1)//set display selected"
	return s
}

function setupjmol(){
 divwrite('jmolplace',jmoldivtext)
 divsettop("jmolplace",document.body.scrollTop)
 if(isbuggynn && document.jmol.style){
 	document.jmol.style.marginTop=2
	document.jmol.style.marginTop=1
 }
}

function setenables(TF){
 //divsetvisibility("jmolplace",TF)
 //divsetvisibility("infoplace",TF)
 //divsetvisibility("tableplace",!TF)
}

thismonitor=""

function jmolpick(jmol,a,i){
 if(!jmol){
  document.jmol.script("select *;labels off;monitor off;")//set display normal")
  return
 }
 var i=parseInt(i)+1
 var a=a.split(" ")[0] 
 var s="select atomno="+i+";label "+a+";select "+thismodelcenter+";"//set display select;"

 s+=";set echo bottom left;echo double-click for measurements;"

 lastpick=i
 document.jmol.script(s)
}

function highlight(i){
 var j=ishighlighted
 if(!document.getElementById || i==j)return
 var d=document.images["tpt0_"+i]
 if(!d)return
 if(j>=0 && document.images["tpt0_"+j]){
	document.images["tpt0_"+j].src="img/t1.gif"
	document.images["tpt1_"+j].src="img/t1.gif"
 }
 d.src="img/a1.gif"
 d=document.images["tpt1_"+i]
 if(!d)return
 d.src="img/b1.gif"
 ishighlighted=i
 i=MO[i][TABLEPT]
 if(j>=0){
	j=MO[j][TABLEPT]
	if(i==j)return
	d=document.getElementById("tn"+j)
	if(!d)return
	d.style.color="black"
	d=document.getElementById("tf"+j)
	if(!d)return
	d.style.color="black"
 }
 d=document.getElementById("tn"+i)
 if(!d)return
 d.style.color="darkred"
 d=document.getElementById("tf"+i)
 if(!d)return
 d.style.color="darkred"

}

function dojumpto(isnext){
  if(opener){
	opener.jumpto(isnext,window)
  }
}

function jumpto(isnext,w){
 var i=MO[ithismodel][(isnext?TABLENEXT:TABLEPREV)]
 if(isNaN(i) || !MO[i] || !MO[i][TABLEPT]){
	//alert("No where to go:"+ithismodel+" "+i)
	return
 }
 jumptowindow=w
 doshowmolinfo(i)
}

function dozoom(f){
  scale3d*=f
  var r=scale3d/3*20
  if(r>20)r=20
  var s="set scale3d "+scale3d+";select *;wireframe "+Math.floor(scale3d/3*32+1)+";cpk "+Math.floor(r+1)+"%"
  if(f==1)return s
  document.jmol.script(s)
  if(opener)opener.scale3d=scale3d
  var d=document.getElementById("hline")
  var ifac=Math.floor(72/scale3d)-2
  if(d)d.innerHTML="<img src=img/hline.gif width="+ifac+" height=10>"
}

function dosendscript(s){
 if(!lastscript)lastscript="background white"
 if(!s)s=prompt("script to send",lastscript)
 if(!s)return
 if(s=="BIGGER"){
	if(getbigger){
		getbigger()
	}else if(opener && opener.getbigger){
		opener.getbigger()
	}
	return
 }
 document.jmol.script(s)
 lastscript=s
 if(opener)opener.lastscript=s
}

function getbigger(){
	var s=thisapplet.replace(/\=400 /g,"=800 ")
	writeNewWindow("<body>"+s+"</body>")
}

function doshowthevibration(){
 if(!opener)return
 var i=document.vinfo.themode.selectedIndex
 opener.showthevibration(i,window) 
}

function showthevibration(i,w){
 	if(!allowvibrations){
		alert("Vibrations are not available at this moment. Check tomorrow.")
		return
	}
	var s=""
	jumptowindow=w
	if(jumptowindow && jumptowindow.document){
		d=jumptowindow.document.getElementById("binfo")
		if(d && MO[ithismodel][MODELIST][i]){
			s=getvibration(MO[ithismodel][VIBMODEL],MO[ithismodel][VIBINFO],MO[ithismodel][MODELIST][i],0)
		}
	}
	if(s){
		//writeNewWindow("<pre>"+s.replace(/\</g,"&lt;"))
		jumptowindow.document.jmol.loadInline(s.replace(/\|/g,""))
		jumptowindow.document.jmol.script(getjmolscript(ithismodel)+jmolscriptv)
	}else{
		doshowmolinfo(ithismodel)
	}
	jumptowindow=0
}

function showthetext(app,info,i,selectedmode){
	var ispopup=true
	var sf=""
	var sinfo=""
	var s="<table><tr><td width=400 bgcolor="+bodycolor+">"+info+"</td></tr></table>"
	thismodelcenter=Elements[AtomNum[MO[i][CENTER]]].name
	app=app.replace(/SCRIPT/,getjmolscript(i)+(selectedmode?jmolscriptv:""))
	thisapplet=app
	jmoldivtext="<table cellspacing=5><tr><td bgcolor="+bodycolor+"><table><tr><td valign=center align=center width=400>"+app+"</td>"
	if(TheList.length > 1)jmoldivtext+="<td valign=center align=center><a href=javascript:dojumpto(0)>[previous]</a><br><span id=nof>"+MO[i][NOF]+"/"+(TheList.length)+"</span><br><a href=javascript:dojumpto(1)>[next]</a></td>"
	jmoldivtext+="</tr>"
	if(document.getElementById){
		jmoldivtext+="<script language=javascript>\ngetbigger=false;\nthismodelcenter='"+thismodelcenter+"';scale3d="+scale3d+"\n"
		+dosendscript+dozoom+jmolpick+dojumpto+doshowthevibration+"\nfunction setenables(){window.close()}"
		+";lastscript='"+lastscript.replace(/\'/,'"')+"';</script>"
		+"<tr><td align=center>100 pm (1.00 Angstroms)=<img src=img/vline.gif width=2 height=10><span id=hline><img src=img/hline.gif width="+(72/scale3d)+" height=10></span><img src=img/vline.gif width=2 height=10></td></tr>"
		+"<tr><td align=center><a href=javascript:jmolpick()>[clear labels]</a> <a href=javascript:dozoom(.5)>[zoom in]</a> <a href=javascript:dozoom(2)>[zoom out]</a></td></tr>"
		+"<tr><td align=center><a href=javascript:dosendscript()>[send script]</a> <a href=javascript:dosendscript('BIGGER')>[big model]</a></td></tr>"
		+"<tr><td align=center><span id=modelist>"+getmodelist(i,selectedmode)+"</span><pre>\n\n\n\n\n\n</pre></td></tr>"
	}
	jmoldivtext+="</table></td></tr></table>"
	var d=0
	if(jumptowindow && jumptowindow.document){
		d=jumptowindow.document.getElementById("binfo")
		if(d){
			if(!operatest)d.innerHTML="<pre>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n</pre>" //for opera?
			d.innerHTML=s
			d=jumptowindow.document.getElementById("modelist")
			s=getmodelist(i,0)
			d.innerHTML=s
			jumptowindow.thismodelcenter=thismodelcenter
			s="load "+molserver+MO[i][MOLFILE]+";"+getjmolscript(i)
			jumptowindow.document.jmol.script(s)
			d=jumptowindow.document.getElementById("nof")
  			d.innerHTML=MO[i][NOF]+"/"+(TheList.length)
		}
	}
	jumptowindow=0
	if(!d){
		//if(ispopup){
			s="<head><title>Results--Molecular Structure Explorer</title>"+getstyles()+"</head><body><table><tr><td valign=top width=400><span id=binfo>"+s+"</span></td><td valign=top>"+jmoldivtext+"</td></tr></table></body>"
			if(iloadview){
				iloadview=0
				divsetvisibility("showplace",false)
				divsetvisibility("selectplace",false)
				divwrite("tableplace",s)
				isjmolinline=1
			}else{
				writeNewWindow(s)
				isjmolinline=0
			}
		//}else{
		//	divwrite("infoplace",s)
		//	divwrite("jmolplace",jmoldivtext)
		//	setenables(true)
		//	isstartup=false
		//}
	}
	picktoggle=lastpick=0
	ithismodel=i
	thismode=""
}

function dowait(TF){
 if(!document.styleSheets)return
 var r=document.styleSheets[0].rules
 if(!r)r=document.styleSheets[0].cssRules
 if(!r)return
 r[0].style.cursor=(TF?"wait":"")
}

function waitfor(cmd,time){
	dowait(1)
	if(!time)time=500
	setTimeout(cmd+";dowait(0)",time)
	return
 }

function getwhatp(p){
//nn7 or ie6:document.tablep.chkdetail
//op7:document.all.chkdetail
	if(document.all)return document.all
	var d=document[p]
	if(d)return d
	d=document[p+"lace"]
	if(d && d.document[p])return d.document[p]
}

function debugwrite(s){
 writeNewWindow("<body>"+s.replace(/\</g,"<br>&lt;")+"</body>")
}

function doclosetable(){
 islineartable=true
 divsettop("resultplace",resultplacetop-dyoff)
 divsettop("showplace",showplacetop-dyoff)
 divsettop("selectplace",selectplacetop-dyoff)
 divsettop("graphplace",graphplacetop-dyoff)
}

function doopentable(){
 islineartable=false
 divsettop("resultplace",resultplacetop)
 divsettop("showplace",showplacetop)
 divsettop("selectplace",selectplacetop)
 divsettop("graphplace",graphplacetop)
}

function dolist(){
 dodisplay()
}

function doview(){
 if(ifirststructure<0){
	alert("First do a search that returns some structures, and list them. Then click here.")
	return
 }
 doshowmolinfo(ifirststructure)
}

function dosortby(imode){
 if(imode==-1){
	//detail
	idodetails=true
	dolist()
	return
 }else if(imode==-2){
	idodetails=false
	dolist()
	return
 }
 //clicked radio sort button
 showworking()
 displayorder=["bycenter","byshape","bylength","bytype"][imode]
 setTimeout("showdata(1)",10)
}


function dohelp(n){
 if(!n){
	var s=parent.fraLoad.document.body.innerHTML
	if(thiscommand==CMD_BONDS)s="<table><tr><td width=400></td><td>"+s+"</td></tr></table>"
	var where=(thiscommand>CMD_BONDS?"showplace":"selectplace")
	divwrite(where,s)
	divsetvisibility("showplace",false)
	divsetvisibility(where,true)
	return 
 }
 parent.fraLoad.location="help/help"+n+".htm"
}
