//copyright 2001 Robert M. Hanson, St. Olaf College, Northfield, MN 55057

//version BH 10:35 AM 03/19/2001

Name=new Array("","","")
function getname(icmpd){
 //A[0]=pointer into Symmetry
 //A[1]=rotational position into Symmetry[A[0]]
 //A[2]=#subs
 //A[3]=nameinfo
 //A[4]=Symmetry entry already rotated
 var s=""
 var ipmethyl=0
 var S=new Array()
 var Subs=new Array()
 var N=new Array(0,0,0,0,0,0)
 var Pg=new Array(0,0,0,0,0,0)
 var Pa=new Array(0,0,0,0,0,0)
 var A=new Array(0,0,0,"","")
 var nsubs=getsubsets(Compound[icmpd],N)
 var npos=0
 var nameinfo=""
 var spre=""
 var iroot=999
 var iambi=999
 var igroup=999
 var iamine=-1
 var ipt=0
 if(nsubs==0)return "benzene"
 if(nsubs==1){
 	nsubs=checksymmetry(Compound[icmpd],A)
	nameinfo=A[3]
	N=A[4].split(",")
	for(var i=0;i<6;i++){if(eval(N[i])){
		Subs[1]=Compound[icmpd][i]
		s=Group[Subs[1]][0]
		s=";"+s.substring(0,s.indexOf("|"))+":"
		if(aminenames.indexOf(s)>=0){
			s=getfield(aminenames,aminenames.indexOf(s))
			spre=Multi[s.length/2]+"methyl"
			spre=s+"-"+spre
		}
		if(nameinfo.indexOf("di")>=0){
			if(sgroup==";CH3:")return strsub(nameinfo,"di|1","xylene")
//			if(sgroup==";OH:")return strsub(nameinfo,"di|1","catechol")
		}
		break
	}}
 }else{
	S=new Array("","","","","","","")
	for(var i=0;i<6;i++){
		if(N[i]){
		 npos++
		 s=Group[Compound[icmpd][i]][0]
		 s=";"+s.substring(0,s.indexOf("|"))+":"
		 if(s==";CH3:")ipmethyl=N[i]
		 S[N[i]]+=(i+1)+","
		 Pg[N[i]]=groupnames.indexOf(s)
		 Pa[N[i]]=ambinames.indexOf(s)
		 if(rootnames.indexOf(s)>=0){
			if(iroot<999)return ""//two roots
			iroot=N[i]
		 }
		 if(aminenames.indexOf(s)>=0)S[0]=getfield(aminenames,aminenames.indexOf(s))
		}
	}
	if(S[0].length){
		iamine=ipmethyl
		if(ipmethyl){
			S[ipmethyl]=S[0]+S[ipmethyl]
			S[0]=""
		}else{
			Pg[0]=groupnames.indexOf(";CH3:")
			S[0]=S[0]+"1,"
		}
	}
	ipt=0
	for(var i=1;i<6;i++){
	 	if(iroot==999 && Pa[i]>0 && S[i].length==2 && Pa[i]<iambi){ipt=i;iambi=Pa[i]}
	}
	if(ipt)iroot=ipt
	for(var i=0;i<7;i++)Subs[eval(N[i])]=Compound[icmpd][i]	
	if(npos==2 && iamine<0){
		s=N.join()+","+N.join()
		nameinfo="p-|1|2"
		if(s.indexOf("0,0,0")>=0)nameinfo="m-|1|2" 
		if(s.indexOf("0,0,0,0")>=0)nameinfo="o-|1|2" 
		if(Subs[1]==imethyl ||Subs[2]==imethyl){
			if(Subs[2]==iamino || Subs[1]==iamino)return strsub(nameinfo,"|1|2","toluidine")
			if(Subs[2]==ialcoh || Subs[1]==ialcoh)return strsub(nameinfo,"|1|2","cresol")
		}
		if(Pg[1]>Pg[2])nameinfo=strsub(nameinfo,"|1|2","|2|1")
	}else{
		nameinfo=getnameinfo(S,N,Pg,iroot)
	}
	if(iamine==0)Subs[0]=imethyl

 }
 return spre+thename(Subs,nameinfo,iroot,true)
}


function getnameinfo(S,N,Pg,iroot){
//must get lowest possible numbers
//must sort by alphabetical order
//remove root entry
 var A=new Array()
 var B=new Array()
 var Sa=new Array()
 var Alist=new Array()
 var s=""
 var slist=""
 var sprior=""
 var i0=0
 var ipos=0
 var n=0
 var smin="XXXXXX"
 var nmin=0
 var sout=""
 for(var i=0;i<7;i++){
	Sa[i]=""
	slist=S[i]
	while(slist.length){
		sprior="000"+(i==iroot?"":Pg[i])
		sprior=sprior.substring(sprior.length-3,sprior.length)
		s=slist.substring(0,slist.indexOf(","))
		slist=slist.substring(slist.indexOf(",")+1,slist.length)
		if(s=="N"){Sa[i]+="N,"}else{A[A.length]=s+""+sprior+""+i}
	}
 }
 for(var i=0;i<A.length;i++){
	s=""+A[i]
	i0=eval(s.substring(4,5))
	ipos=eval(s.substring(0,1))
	if(iroot==999 || iroot==i0){
		s=sortnums(A,ipos,false,false)
		if(s<=smin){
			smin=s
			nmin=Alist.length
			Alist[nmin]=new Array(i,s,sortnums(A,ipos,false,true))
		}
		s=sortnums(A,ipos,true,false)
		if(s<=smin){
			smin=s
			nmin=Alist.length
			Alist[nmin]=new Array(i,s,sortnums(A,ipos,true,true))
		}
	}
 }
 //list all minima
//alert(Alist)
 B=new Array()
 for(var i=0;i<Alist.length;i++){if(Alist[i][1]==smin)B[B.length]=i}
 if(B.length>1){
 //must find true minimum
	smin="XXXXXX"
	nmin=0
	for(var i=0;i<B.length;i++){
		scwfull=Alist[B[i]][2]
		if(scwfull<smin){
			smin=scwfull
			nmin=B[i]
		}
	}
 }
 B=Alist[nmin][2].split(",")
 for(var i=0;i<7;i++)S[i]=Sa[i]
 for(var i=0;i<B.length;i++){
	s=""+B[i]
	i0=eval(s.substring(4,5))
	ipos=eval(s.substring(0,1))
	if(i0>0)S[i0]+=ipos+","
 }
 B.sort(psort)
//alert(B)
 A=new Array(0,0,0,0,0,0,0) 
 for(var i=0;i<B.length;i++){
	s=""+B[i]
	i0=eval(s.substring(4,5))
	if(i0!=iroot && A[i0]==0)sout+=(sout.length?"-":"")+S[i0].substring(0,S[i0].length-1)+"-"+Multi[S[i0].length/2]+"|"+i0
	A[i0]=1
 }
 return sout
}

function fsort(a,b){return (a>b?1:(a<b?-1:0))}
function psort(a,b){return (a.substring(1,a.length)>b.substring(1,b.length)?1:(a.substring(1,a.length)<b.substring(1,b.length)?-1:0))}
function sortnums(A,ibase,ireverse,ifull){
 var B=new Array()
 var i0=0
 var v=0
 var vi=0
 var vpart=0
 for(var i=0;i<A.length;i++){
	vi=eval(A[i].substring(0,1))
	if(ibase)vi=(vi-ibase+6)%6+1
	if(ireverse && vi!=1)vi=8-vi
	B[i]=(ifull?vi+A[i].substring(1,5):vi)
 } 
 B.sort(fsort)
 return B.join()
}

function thename(Subs,nameinfo,iroot,doall){
 var nsubs=Subs.length-1
 var s=""
 var S=new Array()
 var sname=""
 var i=0
 var sgroup=Group[Subs[1]][0]
 if(nsubs==1){
  sgroup=";"+sgroup.substring(0,sgroup.indexOf("|"))+":"
  sroot=(nameinfo=="|1"?rootnames+ambinames:multirootnames)
  i=sroot.indexOf(sgroup)
  if(i>=0){
	s=getfield(sroot,i)
	s=s.substring(s.indexOf("/")+1,s.length)
	if(s.indexOf("@")>=0 && nameinfo.indexOf("-")>=0){
		i=nameinfo.lastIndexOf("-")
		s=strsub(s,"@",nameinfo.substring(0,i+1))
		s=strsub(s,"#-|",nameinfo.substring(i+1,nameinfo.length))
		nameinfo=""
	}
	s=strsub(s,"@","")
  }else{
	i=groupnames.indexOf(sgroup)
	if(i<0)return ""
	s=getfield(groupnames,i)+"benzene"
  }
  sname=(s.indexOf("|")>=0&&nameinfo!="|1"?strsub(s,"-|",nameinfo):strsub(nameinfo,"|1",s))
  sname=strsub(sname,"|1","")
  if(!doall)return strsub(sname,"|","*")
 }else{
	if(iroot<999){
		S=new Array(0,Subs[iroot])
		s=thename(S,"|1",1,false)
		nameinfo=strsub(s,"*",nameinfo)
		nameinfo=strsub(nameinfo,"|"+iroot,"")
		Subs[iroot]=0
	}
	sname=nameinfo+(iroot==999?"benzene":"")
	for(i=0;i<Subs.length;i++){if(Subs[i]){
 		sgroup=Group[Subs[i]][0]
  		sgroup=";"+sgroup.substring(0,sgroup.indexOf("|"))+":"
		s=getfield(groupnames,groupnames.indexOf(sgroup))
		sname=strsub(sname,"|"+i,s)
	}}
 }
 sname=strsub(sname,"#-o-","2-")
 sname=strsub(sname,"#-m-","3-")
 sname=strsub(sname,"#-p-","4-")
 sname=strsub(sname,"#o-","1,2-")
 sname=strsub(sname,"#m-","1,3-")
 sname=strsub(sname,"#p-","1,4-")
 sname=strsub(sname,"-#penta","penta")
 sname=strsub(sname,"-#hexa","hexa")
 sname=strsub(sname,"#-","")
 sname=strsub(sname,"#","")
 sname=strsub(sname,"|","")
 if(sname.indexOf("(-")>=0)sname=strsub(strsub(sname,"(-",""),")","")
 return strsub(sname,",-","-")
}
function getfield(sinfo,i){
 var i=sinfo.indexOf("::",i)
 return sinfo.substring(i+2,sinfo.indexOf(";",i))
}
