//functions used by arosel and arosyn
//to determine selectivity

Grouptype=new Array()
Reagenttype=new Array()
SM=new Array()
PR=new Array()
REAG=new Array()
Q0=new Array()

itosulfonic=-1//reagent TO sulfonic from H (set below)
ifromsulfonic=-1//reagent FROM sulfonic to H (set below)

allowsulfonic=true
metadeactivators=""

function checkreagent(r,I){
 var isok=true

 if(REAG[0]!=0 && REAG[REAG[0]]==ifromsulfonic && r==itosulfonic)return false
 var rtype=Reagenttype[r][9]
 if(rtype==0)return true
 if(rtype & 1){
 //[4] is excluded in intermediate, from x=
 for(var ii=0;ii<6;ii++)if(Reagenttype[r][4].indexOf(","+I[ii]+",")>=0)return false
 }
 if(rtype & 2){
 //[5] is (one of) required in global SM, from s=
 isok=false
 for(var ii=0;ii<6;ii++)if(Reagenttype[r][5].indexOf(","+SM[ii]+",")>=0)isok=true
 }
 if(!isok || rtype<4)return isok
 //[6,7,8] is (one of) required in intermediate, from o= m= p=
 if(rtype&4)for(var ii=0;ii<6;ii++)if(Reagenttype[r][6].indexOf(","+I[ii]+",")>=0)return true
 if(rtype&8)for(var ii=0;ii<6;ii++)if(Reagenttype[r][7].indexOf(","+I[ii]+",")>=0)return true
 if(rtype&16)for(var ii=0;ii<6;ii++)if(Reagenttype[r][8].indexOf(","+I[ii]+",")>=0)return true
 return false
}

function checkomp(I,i,r,icheckomp){
 var isok=false
 if(icheckomp & 4)isok|=(Reagenttype[r][6].indexOf(","+I[(i-1)%6]+",")>=0||Reagenttype[r][6].indexOf(","+I[(i+1)%6]+",")>=0)
 if(icheckomp & 8)isok|=(Reagenttype[r][7].indexOf(","+I[(i-2)%6]+",")>=0||Reagenttype[r][7].indexOf(","+I[(i+2)%6]+",")>=0)
 if(icheckomp & 16)isok|=(Reagenttype[r][8].indexOf(","+I[(i-3)%6]+",")>=0||Reagenttype[r][8].indexOf(","+I[(i+3)%6]+",")>=0)
 return isok
}

function getproduct(S,r,P,allowmulti){
// var isymmetry=checksymmetry(Compound[0])
// var isym=(isymmetry-isymmetry % 100)/100
// var ipt=isymmetry-isym*100
// var Equiv=Symmetry[isym*2+1].split(",")

if(!checkreagent(r,S))return false

 var V=new Array(0,0,0,0,0,0)
 var iold=Reagenttype[r][2]
 var inew=Reagenttype[r][3]
 var done=false
 var r1=r
 var rtype=Reagenttype[r][9]
 copyarray(S,P,-1)
 while(iold>0){
	done=true
	if(Reagenttype[r1][6].length>1)imeta=initro
	for(var i=0;i<6;i++){
		if(S[i]==iold && (rtype<4||checkomp(S,i,r1,rtype)))P[i]=inew
	}
	r1=Reagenttype[r1][1] //points to related reactions
	iold=(r1?Reagenttype[r1][2]:-1)
	inew=(r1?Reagenttype[r1][3]:-1)
 }
 if(done)return true 
 getreactionvalues(S,V)
 var vmax=-9999
 var imax=-1
 for(var i=0;i<6;i++){
	if(S[i]==0){
	 if(V[i]>vmax){
		vmax=V[i]
		imax=i
	 }
	 if(allowmulti && V[i]>500 && Group[inew][2]>-3)P[i]=inew
	}
 }
 if(imax>=0)P[imax]=inew
 return true
}

function getreactionvalues(S,V){
 for(var i=0;i<6;i++)V[i]=(S[i]?0:getshift(S,i))
}

function getshift(S,isub){
 return orthosum(S,isub)+metasum(S,isub)+parasum(S,isub)
}

function orthosum(S,isub){
 var i1=(isub+5)%6
 var i2=(isub+1)%6
 return Group[S[i1]][2]+Group[S[i2]][2]
}
function metasum(S,isub){
 var i1=(isub+4)%6
 var i2=(isub+2)%6
 return Group[S[i1]][3]+Group[S[i2]][3]
}
function parasum(S,isub){
 var i1=(isub+3)%6
 return Group[S[i1]][4]
}
function showshift(S,isub){
 var s=isub
 var i1=(isub+4)%6
 var i2=(isub+2)%6
 s+="\northo: "+orthosum(S,isub)
 s+="\nmeta: "+metasum(S,isub)
 s+="\npara: "+parasum(S,isub)
 return s
}


function setreagentoption(r,S,k,s3,iopt,i9){
  var slist=""
  var A=new Array()
  var j=S[0].indexOf(s3)
  S[k]=(j>=0?S[0].substring(j+3,S[0].length):"")
  if(j>=0){
	slist=strsub(S[k],"METADEACTIVATORS",metadeactivators)
	S[0]=S[0].substring(0,j)
	A=slist.split(",")
	for(var ii=0;ii<A.length;ii++)A[ii]=findsub(Group,A[ii])
	Reagenttype[r][iopt]=","+A.join(",")+","
	Reagenttype[r][9]+=i9
  }
}

function setreagenttypes(){
 var s=""
 var slist=""
 var j=0
 var inew=-1
 var iold=0
 var ii=0
 var S=new Array()
//[0] is a dummy
 for(var i=1;i<Reagent.length;i++){
  s=Reagent[i]
  Reagenttype[i]=new Array("info",0,iold,-1,"x","s","o","m","p",false)
  Reagenttype[i][0]=s.substring(0,s.indexOf("|"))
  S[0]=s.substring(s.indexOf("|")+1,s.length)
  setreagentoption(i,S,5," x=",4,1)
  setreagentoption(i,S,4," p=",8,16)
  setreagentoption(i,S,3," m=",7,8)
  setreagentoption(i,S,2," o=",6,4)
  setreagentoption(i,S,1," s=",5,2)
  s=S[0]
  j=s.indexOf("-->")
  if(j>=0){
	ii=s.indexOf(",")
	slist=(ii>=0?s.substring(ii+1,s.length):"")
	if(ii>=0)s=s.substring(0,ii)
	iold=findsub(Group,s.substring(0,j))
	s=s.substring(j+3,s.length)
	inew=findsub(Group,s)
	if(slist.length){
		j=Reagenttype[i][9]
		s=Reagenttype[i][0]+"|"+slist
		s+=(j & 2?" s="+S[1]:"")
		s+=(j & 4?" o="+S[2]:"")
		s+=(j & 8?" m="+S[3]:"")
		s+=(j & 16?" p="+S[4]:"")
		s+=(j & 1?" x="+S[5]:"")
		Reagenttype[i][1]=Reagent.length
		Reagent[Reagent.length]=s
	}
  }else{
	iold=-1
	inew=findsub(Group,s)
  }
  Reagenttype[i][2]=iold
  Reagenttype[i][3]=inew
  Group[inew][5][Group[inew][5].length]=i
 }
 itosulfonic=Group[isulfonic][5][0]
 ifromsulfonic=Group[0][5][0]
}

