//CHECKJS  D:\bob\promote\profwork\software\organic\js\data\code.js 6/7/02 3:31:46 AM
//
//copyright 2001,2002 Robert M. Hanson, St. Olaf College
//all code and functionality herein not simply in the
//classification of generally useful stuff is copyrighted.
//all rights reserved
//10:00 PM 12/2/2002 fixes alpha and beta for nn6 (HTML 4.0, see http://www.w3.org/TR/MathML2/byalpha.html)
//6:39 PM 12/23/2002 fixes IE left 0: on quiz divs. 
isnn4=(document.layers?true:false)
isie4=(document.all?true:false)
isnn6=(!isie4 && document.getElementById?true:false)
_winoptions='width=700,height=500,left=50,scrollbars,resizable'
//Data is [substrate,conditions,product,info,quizflag,echapter,bruicesection,[[bruicechapter,bruicepage]],[[otherchap,otherpage],[otherchap,otherpage],...],...]
////common////
datadir=(document.location.href.indexOf("data")>0?".":"../../../medialib/data")
nchapmax=40
datatesting=false
sortbybook=0
iquiz=0
nchapmax=40
endash="&#150##"
Quiz=new Array()
qpt=0
quizflag=4
echapterpt=5
bruicept=7
bookdatapt=7
Topiclist=new Array()
Elist=new Array(0,0)   //Elist[ch#]=Topic#
Tlist=new Array(0,0)   //Tlist[topic#]=selectedIndex
Books=new Array(
	["Bruice","<I>Organic Chemistry, Fourth Edition</i> by Paula Yurkanis Bruice",1,true]
	,
	["Wade","<i>Organic Chemistry, Fifth Edition</i> by L. G. Wade, Jr.",3,true]
)
sdigits=" 0123456789"
sbooklist=getbooklist()


//utilities
////unique////

function chapterof(i,ibook,ip){ //ip:0,1,2
	return Data[i][bookdatapt+ibook][ip][0]
}

function checkfor(subst,swhat){
	var i=swhat.indexOf("|")
	var s=(i>0?swhat.substring(0,i):swhat)
	if(s.indexOf(",")<0)return (subst.indexOf(s)>=0)
	var S=s.split(",")
	for(var j=0;j<S.length;j++){if(subst.indexOf(S[j])>=0)return true}
	return false
}

function chp(i,ibook,ip){
	var ch=chapterof(i,ibook,ip)
	if(ch==0)return ""
	var p=pageof(i,ibook,ip)
	return "<font color=blue>"+Books[ibook][0]+" ch. "+ch+(p?", p. "+p:"")+"</font>"
}

function cleancode(s){
	var st=strsub(s,"@","")
	st=strsub(st,"##","")
	st=strsub(st,"^","")
	st=strsub(st,"_","")
	st=strsub(st,"--","-")
	st=strsub(st,"<I>","")
	st=strsub(st,"</I>","")
	return st
}

function dochapter(){}

function doend(){}

function dofind(nquiz,sterm,ichap){
	setbookflags()
	var sreag=(nquiz<0?sterm:(document.info.isreag.checked?document.info.reagent.value:""))
	var isubst=(nquiz<0?0:parseInt(document.info.start[document.info.start.selectedIndex].value))
	var iprod=(nquiz<0?0:parseInt(document.info.end[document.info.end.selectedIndex].value))
	var mode=(nquiz<0?1:document.info.mode.selectedIndex)
	var itopic=(nquiz<0?ichap:parseInt(document.info.chapter[document.info.chapter.selectedIndex].value))
	var ich=(itopic?Topics[itopic][0]:0)
	var ich2=(mode==2?0:ich)
	var ich1=(mode==2?0:mode==1?ich:1)
	
	if(nquiz<0){
		nquiz=0
		doreset('start')
		doreset('end')
		doreset('chapter')
		if(itopic){
			document.info.mode.selectedIndex=1
			document.info.chapter.selectedIndex=Tlist[itopic]
		}else{
			document.info.mode.selectedIndex=2
		}
	}
	sreag=strsub(sreag,"'","")
	var A=new Array()
	var Found=new Array()
	for(var i=0;i<Data.length;i++)Found[i]=-1
	var n=finddata(isubst,iprod,ich1,ich2,sreag,A,Found)
	if(n==0){
		alert("No reactions matched your request, at least for this substrate/product/topic/book combination.")
		return
	}
	if(n>100 && nquiz==0){
		alert("More than 100 reactions matched your request, at least for this substrate/product/chapter combination.")
		return
	}
	var title=document.info.start[document.info.start.selectedIndex].text+" <img src="+datadir+"/dataa2.gif align=baseline> "+document.info.end[document.info.end.selectedIndex].text
	if(sreag.length)title+='<br>mentioning "<font color=red>'+sreag+'</font>"'
	title+="<br>"+(ich2==0||ich1==ich2?"in ":"through ")+"<font color=blue>"+(ich2?Topics[Elist[ich2]][1]:" any topic")+"</font>"
	loadwindow(A,Found,title,n,nquiz,0)
}

function domode(){
	if(document.info.mode.selectedIndex==2)document.info.chapter.selectedIndex=0
}

function doreag(){document.info.isreag.checked=true}

function doreset(what){eval("document.info."+what+".selectedIndex=0")}

function dostart(){}

function dotopic(){
	if(document.info.mode.selectedIndex==2)document.info.mode.selectedIndex=1
}

function dowrite(doc,s){
	doc.open()
	doc.write(s)
	doc.close()
}

function finddata(isubst,iprod,ich1,ich2,sreag,A,Found){
	//if ich1<0 then this is a page range
	//A is the answer array for quizzes
	var iss=true
	var isp=true
	var isr=true
	var ich=0
	var ipage=0
	var s=""
	var subst=""
	var prod=""
	var ipage0=(ich1<0?-ich1:0)
	var ipage1=(ich2<0?-ich2:9999)
	if(isubst){
		s=Groups[isubst][2]
		subst=Groups[isubst][0]+(s.length?","+s:"")
	}
	if(iprod){
		s=Groups[iprod][2]
		prod=Groups[iprod][0]+(s.length?","+s:"")
	}
	for(var i=1;i<Data.length;i++){if(Found[i]<0 && isbooktype(i)){
			ich=Data[i][echapterpt]
			ipage=Data[i][bruicept][0][1]
			if(ipage>=ipage0 && ipage<=ipage1 && (ich2<=0 || ich2>=ich && ich1<=ich)){
				if(isubst)iss=checkfor(subst,Data[i][0])
				if(iss && iprod)isp=checkfor(prod,Data[i][2])
				if(iss && isp){
					if(sreag.length){
						s=cleancode(Data[i].join())
						isr=(s.indexOf(sreag)>=0)
					}
					if(isr){Found[i]=A.length;A[A.length]=new Array(i,0,0,0)}
				}
		}}
	}
	return A.length
}

function findreaction(nquiz,subst,reag,prod,ich1,ich2,title,allowrp){
	var n=0
	var A=new Array()
	var Found=new Array()
	for(var i=0;i<Data.length;i++)Found[i]=-1
	var S=new Array()
	var R=new Array()
	var P=new Array()
	setbookinfo()
	reag=strsub(reag," ","")
	reag=strsub(reag,"_"," ")
	S=subst.split(",")
	R=reag.split(",")
	P=prod.split(",")
	if(nquiz<0){nquiz=0}
	for(var is=0;is<S.length;is++){
		isubst=findatype(S[is],Groups)
		if(isubst<0){
			alert("No substrate matched your request:"+S[is])
			return
		}
		for(var ip=0;ip<P.length;ip++){
			iprod=findatype(P[ip],Groups)
			if(iprod<0){
				alert("No product matched your request:"+P[ip])
				return
			}
			for(var ir=0;ir<R.length;ir++){
				n=finddata(isubst,iprod,ich1,ich2,R[ir],A,Found)
			}
		}
	}
	
	
	if(n==0){
		alert("No reactions matched your request, at least for this substrate/product/chapter combination.")
		return
	}
	loadwindow(A,Found,title,n,nquiz,allowrp)
}

function findatype(s,A){
 if(s=="")return 0
 for(var i=1;i<A.length;i++)if(A[i][0]==s)return i
 return -1
}

function fixline(sout){
	var s=strsub(sout,";","<br>")
	s=strsub(s,"##",";")
	return s
}

function getbooklist(){
	var s=""
	var npt=0
	for (var i=0;i<Books.length;i++){
		s+="<br><input type=checkbox name=book value="+i+">"+Books[i][1]
	}
	s=s.substring(4,s.length)
	return s
}

function getquiz(A,nj,nquiz,allowrp){
	//allowrp:
	//0 any re,pr
	//1 sm only
	//2 re only
	//3 pr only
	//-1 not sm
	//-2 not re
	//-3 not pr
	//99 any sm, re, pr
	//A[][0] is data pointer
	//A[][1,2,3] track what's been asked
	if(allowrp==0)allowrp=-1
	var sout=""
	var i=0
	var ia=0
	var ij=0
	var ok=false
	var B=new Array(6)
	var ntry=0
	while(!ok){
		if(ntry++>50)return ""
		ia=Math.floor(Math.random()*A.length)
		j=Math.floor(Math.random()*3)+1
		ij=(A.length>9?1:j)
		ok=(!A[ia][ij] && (allowrp==99 || allowrp==j || allowrp<0 && allowrp!==-j))
		i=A[ia][0]
		ok=(ok&&(Data[i][quizflag]>=0)&&(j!=Data[i][quizflag]))//check for type allowed
	}
	A[ia][ij]=true
	setinfo(i,B)
	sans=B[j]
	B[j]="?"
	iquiz=(nj==1?1:iquiz+1)
	var it='it'+nj
	var shead=""//<p><hr><a name=qqq"+nj+"></a>"
	shead+=(true||isnn4?"<div class=q id=q"+nj+">&nbsp;</div>"+(nj>1?"<pre>\n\n\n</pre>":""):"")+"#"+iquiz
	shead+="&nbsp;&nbsp;<a href=\"javascript:void(document."
	+(isnn4?"layers['"+it+"'].visibility='show'"
		:(isie4?"all."+it:"getElementById('"+it+"')")+".style.visibility='visible'")
	+")\">Show Answer</a> "
	shead+="<a href=javascript:close()>Close</a> "
	shead+=(nj<nquiz?(true || isnn4?"&nbsp;<a href=javascript:window.opener.gotoq(window,"+(nj+1)+")>Next</a>":"&nbsp;scroll down for the next question"):"")
	if(nj>1 && (true ||isnn4))shead+="&nbsp;<a href=javascript:window.opener.gotoq(window,"+(nj-1)+")>Previous</a> "
	var sout="<center><table><tr><td colspan=3>"
	sout+="<tr><td valign=center align=right>"+B[1]
	sout+="<td align=center>"+B[2]+"<br><img src="+datadir+"/"+B[0]+".gif><p>&nbsp;"
	sout+="<td valign=center>"+B[3]+"\n"
	sout+="<tr><td colspan=3>"
	sout=shead+fixline(sout)
	sans+="\n<p>"+B[4]
	sans+="\n<p>"+B[5]
	sans=fixline(sans)
	sout+="</table>"
	sout+="<p>\n</center><div class=ans id="+it+">\n<center>"+sans+"\n</center></div><pre>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
	sout+=(isnn4?"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n":"")+"</pre>"
	if(nj==1)sout="<html><style type='text/css'>\n.q {position:absolute}\n.ans {position:absolute;left:0;width:700;visibility:hidden}\n</style>\n<body>"+sout
	if(nj==nquiz)sout+="</body></html>"
	return sout
}

function gettopiclist(){
	
	var itopic=0
	var ilast=-1
	var ilen=0
	var ilena=0
	Topiclist=new Array(["any",0])
	Elist=new Array(0,0)
	Tlist=new Array(0,0)
	for(var i=1;i<Topics.length;i++)Elist[Topics[i][0]]=i
	
	for(var i=1;i<=nchapmax;i++)Topiclist[i]=new Array(0,0)
	for(var i=1;i<Data.length;i++){
		itopic=Elist[Data[i][5]]
		if(itopic){
			Topiclist[itopic][0]=itopic
			Topiclist[itopic][1]++
			Topiclist[0][1]++
		}
	}
	var s="<select name=chapter  onchange=dotopic() onselect=dotopic()><option value=0 selected>All Topics"
	n=0
	for(var i=1;i<Topics.length;i++){
		if(Topiclist[i][1]){
			s+="\n<option value="+i+">"+Topics[i][1]
			n++
			Tlist[i]=n
		}
	}
	s+="</select>"
	return s
}

function gotoq(w,n){
	var y=(isnn4?document.layers["q"+n].top:isie4?w.document.all["q"+n].offsetTop:w.document.getElementById("q"+n).offsetTop)
	w.scrollTo(0,y)	
}

function isbooktype(idata){
	for(i=0;i<Books.length;i++){
		if(Books[i][3] && chapterof(idata,i,0))return true
	}
	return false
}

function listalldata(itype,ichap){
	var s=""
	var sout=""
	var ipt=0
	for(var i=1;i<Data.length;i++){
		if(ichap==0 || Data[i][echapterpt]==ichap){
			s=Data[i][itype]
			ipt=s.indexOf("|")
			if(ipt>=0)s=s.substring(0,ipt)
			sout+=s+","
		}
	}
	return sout
}

function loadwindow(A,Found,title,n,nquiz,allowrp){
	if(nquiz>=1){
		var npossible=(allowrp==99?3:(allowrp<1?2:1))
		if(n*npossible<nquiz)nquiz=n*npossible
		var sout="<p><center>"+title+"</center>"
		for (var nj=1;nj<=nquiz;nj++)sout+=getquiz(A,nj,nquiz,allowrp)
		openwin("",sout,_winoptions)
	}else{
		A=A.sort(sortdatabypage)
		showdata(A,title)
	}
}

function openwin(sname,shtml,soptions){
	if(sname.length)return window.open(sname,'',soptions)
	putnewwindow(shtml,soptions)
}

function pageof(i,ibook,ip){ //ip:0,1,2
	return Data[i][bookdatapt+ibook][ip][1]
}

function putnewwindow(s,soptions){
	var sm=""+Math.random()
	sm=sm.substring(3,10)
	var newwin=open("","data_"+sm,soptions)
	dowrite(newwin.document,s)
}

function setbookflags(){
	sortbybook=-1
	for (var i=0;i<Books.length;i++){
		Books[i][3]=(document.info.book[i].checked)
		if(Books[i][3] && sortbybook<0)sortbybook=i
	}
	if(sortbybook>=0)return
	sortbybook=0
	for (var i=0;i<Books.length;i++)Books[i][3]=true
}

function setbookinfo(){
	Books[0][3]=true  //bruice
	Books[1][3]=true //wade
}setbookinfo()

function setinfo(i,B){
	//0:arrow 1:sm 2:re 3:pr
	B[1]=strsub(setsubs(Data[i][0]),","," + ")
	var re=setsubs(Data[i][1])
	B[0]=(re.indexOf("==")>=0?"datae":"dataa")
	if(re.indexOf("==")>=0)re=re.substring(0,re.indexOf("=="))
	B[2]=re
	B[3]=strsub(setsubs(Data[i][2]),","," or ")
	B[4]=""
	for(var ib=0;ib<Books.length;ib++){
		if(Books[ib][3]){
			for(var ip=0;ip<Books[ib][2];ip++){
				B[4]+="<br>"+chp(i,ib,ip)
			}
		}
	}
	B[4]=B[4].substring(4,B[4].length)
	B[5]="<font color=red>"+setsubs(Data[i][3])+"</font>"
}

function setselect(what,A){
	var sout=""
	var ipt=0
	var s=""
	var slist=(what=="start"? "any,"+listalldata(0,0):(what=="end"?"any,"+listalldata(2,0):""))
	for (var i=0;i<A.length;i++){
		s=A[i][0]
		if(s.length>0 && s.indexOf("'")<0 && (slist.length==0 || slist.indexOf(s)>=0))sout+="\n<option  value="+i+">"+s+"</option>"
	}
	s="<select  name="+what+" onchange='do"+what+"()'>"+sout+"\n</select>"
	return s
}

function setsubs(sform)
{
	//generally numbers subscripted and +/- superscripted
	//overridden by _, ^, and @
	//|imagefile overrides entire operation
	//,/, truncates
	var i=sform.indexOf("|")
	if(i>=0)return "<img src="+datadir+"/"+sform.substring(i+1,sform.length)+".gif>"
	i=sform.indexOf(",/,")
	var ilast=(i>=0?i:sform.length)
	var sf=""
	var isnext=false
	var isfirst=true
	sform=strsub(sform,"--","~")
	sform=strsub(sform,"( ","(")
	sform=strsub(sform," )",")")
	for (var i=0;i<ilast;i++)
	{
		s=sform.charAt(i)
		if(isnext){
			sf+=(isnext==1?"<sup>"+s+"</sup>":(isnext==-1?"<sub>"+s+"</sub>":s))
			isnext=0
			continue
		}
		if(s=="_"){isnext=-1;continue}
		if(s=="^"){isnext=1;continue}
		if(s=="@"){isnext=2;continue}
		var isdigit=(sdigits.indexOf(s)>0)
		if(!isfirst && isdigit){
			sf+="<sub>"+s+"</sub>"
		}else{
			if(s=="+"||s=="-")s="<sup>"+s+"</sup>"
			sf+=s
			if(!isdigit)isfirst=false
		}
		if(s==" " || s==";"||s=="~")isfirst=true
	}
	sf=strsub(sf," oC"," <sup>o</sup>C")
	sf=sf.replace(/alpha/g,(isnn4?"<span style='font-family: symbol'>a</span>":"&alpha##"))
	sf=sf.replace(/beta/g,(isnn4?"<span style='font-family: symbol'>b</span>":"&beta##"))
	sf=strsub(sf,"<sup>-</sup>","<sup>"+endash+"</sup>")
	sf=strsub(sf,"~",endash)
	return sf
}

function showdata(A,title){
	var B=new Array(6)
	var ndata=A.length
	var sout="<center>"+title+"<p><b>"+ndata+" reaction"+(ndata==1?"":"s")
	var i=0
	sout+="<p><a href=javascript:close()>close</a><p><table><tr><td colspan=3><hr>"
	for(var ipt=0;ipt<A.length;ipt++){
		i=A[ipt][0]
		setinfo(i,B)
		sout+="<tr><td>"//#"+i
		sout+="<tr><td valign=center align=right>"+B[1]
		sout+="<td align=center>"+B[2]+"<br><img src="+datadir+"/"+B[0]+".gif><p>&nbsp;"
		sout+="<td valign=center>"+B[3]+"\n"
		sout+="<tr><td>"+B[4]
		sout+="<td colspan=2 align=right>"+B[5]
		sout+="<tr><td colspan=3><hr>"
	}
	sout=fixline(sout)
	sout+="</table><p><a href=javascript:close()>close</a></center>"
	sout="<html><body>"+sout+"</body></html>"
	openwin("",sout,_winoptions)
}

function sortdatabypage(a,b){
	var pa=pageof(a[0],sortbybook,0)
	var pb=pageof(b[0],sortbybook,0)
	if(pa==0)pa=9999
	if(pb==0)pb=9999
	return pa-pb
}

function strsub(ssub,ch1,ch2)
{
	if (ch2!=""){if (ch2.indexOf(ch1)>=0) return ssub}
	var s=ssub
	var i=s.indexOf(ch1)
	while (i>=0)
	{
		s=s.substring(0,i)+ch2+s.substring(i+ch1.length,s.length)
		i=s.indexOf(ch1)
	}
	return s
}

