
function loadfilelist(mode)
{
 if(mode==0) return waitforload("loadfilelist(1)",parent.CALC_data,"./data") 
 var slist="Mark the file you want to load\n by placing an 'x' after its name\n and pressing 'OK'\n"
 for(var i=1;i<parent.CALC_data.document.links.length;i++)
 {
  s=parent.CALC_data.document.links[i].href
  s=s.substring(s.lastIndexOf("/")+1,s.length)+"----------"
  slist+="./data/"+s.substring(0,12)+"\n"
 }
 usr.xy.value=slist
 isfilelist=true
 return 1
}

function doBtn(sname)
{
 if(sname=="list") return dolist(1)
 if(going || sname=="stop")return going=false
 if(sname=="xyOK") return (isfilelist?doselect("sdata"):dogoto("#solve"))
 if(sname=="dataOK" || isfilelist && sname=="blur") return doselect("sdata")
 if(isfilelist){alert("Click 'OK' first.");dogoto("#data");return 0}
 if(sname=="load") return doselect("ssolve")
 if(sname=="blur"){sxyzold=";;;";return dosimplex(-1)}
 if(sname=="plot") return dograph(0)
 if(sname=="trace") return dotrace()
 if(sname=="img") return dograph(1)
 if(sname=="display") return dograph(4)
 if(sname=="apply"||sname=="solvesetup") return dosimplex(-1)
 if(sname=="solvereset") return dosimplex(-2)
 if(sname=="eval") return dosimplex(1)
 if(sname=="test") return dotest(usr.itest.value)
 if(sname=="quizOK") return doselect("squiz")
 if(sname=="ans") return alert("\n\n"+ans)
 if(sname=="hint") return alert("\n\n"+hint)
 return 0
}
function docheck(sname)
{
 if(sname=="o_apdata")return dobtn("apply")
 return 0
}


function doselect(sname)
{
 c=0;eval("c=usr."+(sname=="autosolve"?"ssolve":sname))
 var s=c[c.selectedIndex].value
 if(sname=="ssolve"||sname=="autosolve")
 {
  sxyzold=Math.random()+""
  getinfo(false)
  if(s=="DATA")
  {
   var st=sfunc
   if(st.indexOf("=")<=0)st=usr.tstitle.value
   if(st.indexOf("=")<=0)st=gettextof("sdata")
   s=(st.indexOf("=")>0?st:"LINE")
  }
  smodel=getfunc(s)
  usr.tsmodel.value=smodel
  dosimplex(-3+(sname=="autosolve"?1:0))
 }
 if(sname=="sdata")
 {
  if(s=="FILE")
  {
   if(!isfilelist) return loadfilelist(0)
   isfilelist=0
   s=usr.xy.value
   var i=s.indexOf("-x")
   if(i<0){alert("File has not been selected.");loadfilelist(0);dogoto("#data");return 0}
   s=s.substring(0,i)
   s=s.substring(s.lastIndexOf("./"),s.length)
   filename=s.substring(0,s.indexOf("-"))
   usr.sdata.options[usr.sdata.selectedIndex].text=filename+" (click 'OK' for file list)"
   return waitforload("dodata()",parent.CALC_data,filename)
  }
  isfilelist=0
  filename=s
  return waitforload("dodata()",parent.CALC_data,"./data/"+filename)
 }
 if(sname=="squiz")
 {
//  var v_=s.split(",")
//  s=v_[1+getrnd(v_.length-1)]+""
//  filename=strsub(v_[0],"*",s)+".htm"
  filename=s
  isfilelist=0
  return waitforload("dodata()",parent.CALC_data,"./data/"+filename)
 }
 return 0
}

function getfunc(sf)
{
 var s=sf
 var x=(is_apdata==2 && xyz[0]=="x"?"y":is_apdata?xyz[0]:"x")
 var y=(is_apdata==2 && xyz[1]=="y"?"x":is_apdata?xyz[1]:"y")
 if(s=="LINE") s="y=m*x+b"
 if(s=="QUAD") s= "y=a*x^2+b*x+c"
 if(s=="EXP+") s= "y=a*e^(k*x)"
 if(s=="EXP-") s= "y=a*e^(-k*x)+b"
 if(s=="1STP") s= "y=a(1-e^(-k*x))"
 if(s=="1-")   s= "y=yo*e^(-k1*x)"
 if(s=="1L-")  s= "ln(y)=ln(yo)-k1*x"
 if(s=="2-")   s= "y=1/(k2*x+1/yo)"
 if(s=="2L-")  s= "1/y=k2*x+1/yo"
 if(x!="x"||y!="y")s=strsub(s,"x","@")
 s=strsub(s,"y",y)
 s=strsub(s,"@",x)
 return s
}

function checkapdata(){
 doBtn("load")  
}

function dodata()
{
 if(btnlock)return
 var c=parent.CALC_data.document.forms
 if (c.length)
 {  
  var sa=findvalue(c[0],"action")
  var isquiz=(sa.length>0)
  if(isquiz)eval(sa)
  ans=strsub(findvalue(c[0],"sans"),";","\n")
  hint=strsub(findvalue(c[0],"shint"),";","\n")
  if(isfilelist || !(filename=="blank.htm") ||prompt("Erase data?","yes")=="yes")usr.xy.value=c[0].xy.value
  stitle=""
  if(!isquiz)
  {
   stitle=findvalue(c[0],"stitle")
   if (stitle=="")stitle=gettextof("sdata")
   if(stitle.indexOf("(click")>=0)stitle=stitle.substring(0,stitle.indexOf("(click"))
   if(stitle=="FUNCTION")usr.xy.value=getfunction()
  }
  var sinfo=strsub(findvalue(c[0],"sinfo"),"|","\n")
  if(sinfo=="")sinfo=findvalue(c[0],"windataheader")
  var sdefs=findvalue(c[0],"sdefs")
  usr.txyzvars.value=findvalue(c[0],"svars")
  getxyzdata(false)
  sfunc=getfunc(findvalue(c[0],"sfunc"))
  if(sfunc!="")
  {
   usr.ssolve.selectedIndex=0
   usr.tsmodel.value=sfunc
  }
  if(sdefs!="")
  {
   sdefs+=";"
   if(mainvlist.indexOf(sdefs)<0)mainvlist+=";"+sdefs
   sdefs=strsub(sdefs,"'","")
   sdefs=strsub(sdefs,"=;",";")
   eval(sdefs)
  }
  if(sinfo+sdefs!="")alert(stitle+"\n\n"+sinfo+"\n\n"+sfunc+"\n\n"+sdefs)
  usr.tstitle.value=stitle
  doselect("autosolve")
 }
 btnlock=true
 setTimeout('btnlock=false',200)
}

function getfunction()
{

  stitle=""
  sfunc=""
  var sf=prompt("Express a function of y in terms of x:","y=x")
  if(sf==null) return ""
  usr.txyzvars.value="x y"
  var i=sf.indexOf("=")
  if (i>=0)sf=sf.substring(i+1,sf.length)
  sf="y="+mathof(sf,false)
  var sb=prompt("Provide bounds for x:","0,100")
  if(sb==null) return ""
  if(sb.indexOf(",")<0)sb="0,100"
  var irange=sb.split(",")
  var i0=irange[0]
  var i1=irange[1]-i0
  s=""
  for(var i=0;i<=10;i++)
  {
   var x=i0+i/10*i1
   eval(sf)
   s+=roundoff(x,-5)+","+roundoff(y,-5)+"\n"
  }
  return s
}

function dolist(isnow)
{
 var s_="//:"
 if(isnow)
 {
  usr.o_list.checked=true
  is_list=true
  s_=usr.datavar.value + "//"
  s_=s_.substring(0,s_.indexOf("//"))+"//:"
 }
 if(havexyzs)
 {
  var doy=(sl_!=xyz[nq_-1])
  for(iq_=0;iq_<nq_;iq_++)s_+=sof(xyz[iq_],9)+" "
  s_+=(doy?sof(sl_,9):"")+" =?= "+sr_+"\n"
  for(var i__=0;i__<n__;i__++)
  {
   s_+="//:"
   for(iq_=0;iq_<nq_;iq_++)
   {
    eval(xyz[iq_]+"="+xyv[i__][iq_])
    s_+=sof(roundoff(eval(xyz[iq_]),-2),9)+" "
   }
   var e_=eval(srm_)
   s_+=(doy?sof(roundoff(eval(slm_),-2),9):"")+" =?= "+roundoff(e_,-2)+" ("+e_+")\n"
  }
 }else{
  s_+=sl_+"\t "+sr_+"\n"
  s_+="//"+eval(slm_)+"\t "+eval(srm_)+"\n"
 }
 if(isnow)usr.datavar.value=s_
 return s_
}

function dotrace()
{
 if(dosimplex(-1)!="1")return 0
 if(is_apdata)return alert("\n\nTrace is not available when applying a function to data.")
 var svar=Pinfo[0][0]
 for(var i=1;i<np__;i++)svar+=","+Pinfo[i][0]
 if(np__>1)svar=prompt("Pick ONE variable to trace:",svar)
 if (svar==null)return 0
 var e_=0
 for(i=0;i<np__;i++)
 {
  if(svar==Pinfo[i][0])e_=Pinfo[i][1]
 }
 var e_=Math.abs(e_*10)
 var sxlim=(txlimits==""?roundoff(-e_,-2)+","+roundoff(e_,-2):txlimits)
 sxlim=prompt("x-axis limits?",sxlim)
 if(sxlim==null)return 0
 txlimits=sxlim
 var sylim=tylimits
 sylim=prompt("y-axis limits? ([cancel]='auto')",sylim)
 if(sylim==null)sylim="auto"
 tylimits=sylim
 stitle="Trace of "+sm_+ " vs. "+svar
 stitle1=""
 sxfunc=svar
 xlabel=svar
 ylabel=sm_
 syfunc=sm_
 stheory=sm_
 xlimits="from "+strsub(sxlim ,","," to ")
 ylimits="from "+strsub(sylim ,","," to ")
 is_theory=true
 is_data=false
 isytrendline=false
 sflags=" LINES XAXIS0"
 dograph(-1)
 return 1
}

function mathof(sx,dovlist)
{
 var s=strsub(sx,"X","x")
 s=strsub(s,"Y","y")
 return math(s,dovlist)
}

function getinfo(doall)
{
 getxyzdata(doall)
 sflags=""
 for(var i=0;i<usr.elements.length;i++)
 {
  var e=usr.elements[i]
  var s=e.name
  var c=s.charAt(0)
  var sreal=s.substring(1,s.length)
  if(c=="o")
  {
   if(s.charAt(1)=="y" && e.checked)sflags+=" "+e.value
   if(s.charAt(1)=="n" &&!e.checked)sflags+=" "+e.value
   eval("is"+sreal+"="+(e.checked?"true":"false"))
  }
  if(c=="t")eval(sreal+"='"+e.value+"'")
  if(c=="s")eval(sreal+"='"+getselectof(s)+"'")
  if(c=="r" && e.checked)eval("is"+sreal+"="+e.value)
 }
 sxtext=gettextof("sxfunc")
 sytext=gettextof("syfunc")
 if(xlabel=="")xlabel=sxtext
 if(usr.sxfunc.options[0].text==xlabel)xlabel+=xyzu[0]
 if(ylabel=="")ylabel=sytext
 if(usr.syfunc.options[0].text==ylabel)ylabel+=xyzu[1]
 if(is_xauto)xlimits="from auto"
 if(is_yauto)ylimits="from auto"
 if(isyhist)
 {
  xlabel="Samples"
  xlimits="from auto"
  sflags=strsub(sflags,"LINES","")
  sflags=strsub(sflags,"DOTREND","")
  for(var i=0;i<n__;i++)xyv[i][0]=i+1
  is_theory=false
  isyconnect=false
  isytrendline=false
 }
 if(isytrendline)isyconnect=false
 if(is_theory)
 {
  sflags=strsub(sflags,"ALLLINES","") 
  sflags="LINES "+sflags
  sflags+=strsub(sflags,"ALLHIST","") 
  isyconnect=false
  isyhist=false
 }
 is_data=(is_data || isytrendline)
 usr.o_theory.checked=is_theory
 usr.oyconnect.checked=isyconnect
 usr.oytrendline.checked=isytrendline
 usr.oyhist.checked=isyhist
 if (xfunc=="special" || xfunc=="")dospecial(1)
 if (yfunc=="special" || yfunc=="")dospecial(2)
 return (n__>0 && xfunc!="" && yfunc!="")
}

function getxyzdata(doall)//interprets xy data
{
 sxyz=usr.xy.value
 if(sxyz==sxyzold && !doall)return n__
 sxyzold=sxyz
 sxyz=strclean(sxyz) 
 n__=0
 xyz=new Array("x","y")
 xyzu=new Array("","")
 var s=strclean(usr.txyzvars.value)
 if(s=="")s="x y"
 var i=sxyz.lastIndexOf(":")
 if(i>=0)
 {
  var s=sxyz.substring(0,i)
  sxyz=strclean(sxyz.substring(i+1),sxyz.length)
  xyz=s.split(":")
 }else{
  xyz=s.split(" ")
 }
 s=""
 nq_=xyz.length
 for(var iq=0;iq<nq_;iq++)
 {
  xyz[iq]=mathclean(xyz[iq])
  var i=xyz[iq].indexOf("(")
  if(i>=0)
  {
   xyzu[iq]=xyz[iq].substring(i,xyz[iq].length)
   xyz[iq]=xyz[iq].substring(0,i)
  }else{
   xyzu[iq]=""
  }
  s+=xyz[iq]+xyzu[iq]+" "
 }
 if(xyz[0]==""||xyz[0]==" "||xyz[0]==null){xyz[0]="x";xyzu[0]="";s="x "+s}
 if(xyz[1]==""||xyz[1]==" "||xyz[1]==null){xyz[1]="y";xyzu[1]="";s+="y"}
 usr.txyzvars.value=strclean(s)
 xyzlist=mathclean(","+xyz.join(",")+",")
 var c=usr.sxfunc
 for(var i=0;i<c.length-1;i++)c[i].text=strsub(c[i].value,".",xyz[0])
 var c=usr.syfunc
 for(var i=0;i<c.length-1;i++)c[i].text=strsub(c[i].value,".",xyz[1])
 stheory=strsub(strsub(usr.tstheory.value,"y",xyz[1]),"x",xyz[0]) 
 usr.tstheory.value=stheory 
 var haveselected=(sxyz.indexOf("*")>0)
 var i=(doall?1:-1)
 while (sxyz!="" && i!=0)
 {
  sxyz=getxyz(sxyz,nq_)
  if(!haveselected || sdata.indexOf("*")>0)
  {
   sdata=strsub(sdata,"*","")
   xyv[n__]=sdata.split(" ")
   for(var j=0;j<nq_;j++)xyv[n__][j]=eval(xyv[n__][j])
   n__++
   i++
  }
 }
 return n__
}

function getxyz(slist,nq)
{
 //global sdata
 sdata=""
 if (slist=="") return ""
 var i=0
 var s=slist+" "
 for(var iq=0;iq<nq;iq++)i=s.indexOf(" ",i+1)
 if(i<1) return ""
 sdata=slist.substring(0,i)
 return slist.substring(i+1,slist.length)
}



