//copyright 2002, St. Olaf College, Northfield, MN

anonymous=true
numbered=true
doheader=true

F=new Array()

function addf(f){
 F[F.length]=f.toString()
}
addf(addf)

function setoptions(A,list){
 var S=list.split(",")
 for (var i in S)A[A.length]=S[i].split("|")
}
addf(setoptions)

function resetall(ichecktop){
 admin="hansonr@stolaf.edu"
 iscreate=(ichecktop?top!=self:false)
 sperl="http://www.stolaf.edu/cgi-bin/form-mailto.pl"
 testing=false
 stest=""
 color=""

 Q=new Array()
 nq=0

 n=0
 havedata=false
 havekeys=false
 inagree=false
 AgreeOptions=new Array()
 agreeoptions="Strongly Disagree|1,Disagree|2,Agree|3,Strongly Agree|4,No Opinion|9,Does Not Apply|10"
 agreeheader="Use the scale below to indicate your agreement or disagreement with the following statements."
 setoptions(AgreeOptions,agreeoptions)
 recipient=""

 SID=new Array()
 SSORT1=new Array()
 SSORT2=new Array()
 idfield=0
 idfieldname=""
 isortfield1=0
 isortfield2=0
 sortfield1=""
 sortfield2=""

}
addf(resetall)

function doinfo(stitle,sprofname,sprofemail,sdeadline,sform,swho,scourse,sections,syear,sterm,sweek,havekeys){
 infolist="a_coursetitle,a_profname,a_profemail,a_deadline,_formname,_recipient,a_course,a_sectionlist,a_year,a_term,a_week,a_keys"
 if(arguments.length==0){
	doinfo("TITLE OF COURSE HERE"
	,"YOUR NAME"
	,"YOUR EMAIL ADDRESS"
	,"DEADLINE DATE HERE (e.g. Monday, April 23)" //last day
	,color+"form"	//output form just gets put on subject line
	,"arp@stolaf.edu (could be YOU if you wish)" 	//recipient	
	,"COURSE CODE (e.g. 08-0126)"		//course
	,"SECTIONS (e.g. CD)"		//course sections
	,"YEAR"			 	//year
	,"TERM (e.g. Semester 2)"		//term
	,"WEEK (optional)"			//week
	)
	return
 }
 var s=""
 recipient=swho
 if(iscreate){
   newquestion("doinfo",arguments)
   s+="\n<form ACTION=javascript:// METHOD=POST>"
   s+="<table>"
   writedoc(s)
   s=""
 }else{
  s="<body"+(havekeys?" onload=clearkey()":"")+">\n<!--Note: actual javscript is not viewable here. All this was produced by eval.js-->"
  s+="\n<!--analysis info averagerange=1-8 -->"
  s+="\n<h3>"+stitle+"</h3>"

if(doheader){
  s+="Please take a few minutes to answer the questions on this form. "
  s+="Your answers will help your professor serve you and future students better. "
}
  s+="Responses will be accepted through <b>"+sdeadline+"</b>. "
if(anonymous)  s+="<b>This form is delivered to your professor completely anonymously.</b>"
  s+="\n<form ACTION="+sperl+" METHOD=POST>"
 }
 s+=hidden("a_coursetitle",stitle)
 s+=hidden("a_profname",sprofname)
 s+=hidden("a_profemail",sprofemail)
 s+=hidden("a_deadline",sdeadline)
 s+=hidden("_formname",(iscreate?sform:sform+scourse+sections+syear+sterm+sweek))
 s+=hidden("_recipient",swho)
 s+=hidden("a_course",scourse)
 s+=hidden("a_sectionlist",sections)
 s+=hidden("a_year",syear)
 s+=hidden("a_term",sterm)
 s+=hidden("a_week",sweek)

 if(iscreate)s+="</table>"
 writedoc(s)
 if(havekeys)askkey()
 s=""
 var c=""
 sections=sections.toUpperCase().replace(/\ /g,"")
 for(var i=0;i<sections.length;i++){
	c=sections.charAt(i)
	if(c=="(")break
	s+=",\""+c+"|Section "+c+"\""
 }
 if(!iscreate && s.length){
	 s="doradio(\"What section of "+stitle+" are you in?\",\"a_section\""+s+")"	
	 eval(s)
 }
}
addf(doinfo)

function dosubmit(stext){
 if(inagree)doagree()
 if(iscreate){
	newquestion("dosubmit",arguments)
	parent.fraInfo.dosubmit(stext,admin,color)
	return
 }

 var son=""
 var stype="submit"
 if(arguments.length==0)stext="Send to "+recipient
 if(havekeys){
	son="onclick=submitk()"
	stype="button"
 }
 var s="\n<p><hr><hr><center><p>"
 s+="Thank you for taking the time to fill out this form."
 s+="<p>\n<input type="+stype+" value=\""+stext+"\" "+son+">"
 writedoc(s)
 s="</center></form></body>"
 writedoc(s)
}
addf(dosubmit)

function dohead(stext){
 if(inagree)doagree()
 if(iscreate)newquestion("dohead",arguments)
 writedoc("\n\n<p><hr><h2>"+stext+"</h2><p>\n")
}
addf(dohead)

function dohidden(name,value){
	if(iscreate){
		newquestion("dohidden",arguments)
		Q[nq][2]=name
	}
	writedoc(hidden(name,value))
}
addf(dohidden)

function doradio(){
 if(iscreate)newquestion("doradio",arguments)
 showoption("radio",arguments)
}
addf(doradio)

function docheck(){
 if(iscreate)newquestion("docheck",arguments)
 showoption("checkbox",arguments)
}
addf(docheck)

function dotext(){
 if(iscreate)newquestion("dotext",arguments)
 showtext("text",arguments)
}
addf(dotext)

function dotextarea(){
 if(iscreate)newquestion("dotextarea",arguments)
 showtext("textarea",arguments)
}
addf(dotextarea)

function doagree(stext){
 if(stext=="HEADER"){
	agreeheader=arguments[1]
	if(iscreate)newquestion("doagree",arguments)
	return
 }
 if(stext=="OPTIONS"){
	AgreeOptions=new Array()
	setoptions(AgreeOptions,arguments[1])
	if(iscreate){
		newquestion("doagree",arguments)
		return
	}else{
		if(!havedata || !inagree)return
	}
	arguments=""
 }
 if(stext=="MORE"){
  if(iscreate){
	for(var i=0;i<10;i++)doagree("BLANK")
  }
  return
 }
 var sn=""
 var s=""
 var i1=1
 var w=0
 var ncol=0
 if(arguments.length>1){
	sn=arguments[1]
	i1=2
 }
 if(arguments.length>0 && sn.length==0){
	n++
	s=(numbered?n+". ":"")
	sn=snof(n)
 }
 if(iscreate && stext=="BLANK"){
  stext="<input type=text size=50 name="+sn+"_MORE>"
 }
 
 options=(arguments.length>i1?arguments[i1]:0)
 if(!inagree && arguments.length==0){
  inagree=true
  ncol=AgreeOptions.length+(havedata?2:0)
  s="\n<table BORDER WIDTH='82%'>"
  if(!iscreate){
	s+="\n<tr>\n<td ALIGN=CENTER COLSPAN="+(ncol+1)+"><b>"+agreeheader+"</b></td>\n</tr>"
	s+="\n<tr>\n<td WIDTH='2%'>&nbsp;</td>\n<td WIDTH='10%'>&nbsp;</td>"
  	w=Math.round(70/ncol)
  	for(var i in AgreeOptions)s+="<th width='"+w+"%'>"+AgreeOptions[i][0]+"</th>"
  	if(havedata){
  	  s+="<th width='"+w+"%'>mean</th><th width='"+w+"%'>median</th>"
  	}
  }
  writedoc(s)
  return
 }
 if(arguments.length==0){inagree=false;writedoc("\n</table>\n");return}
 if(!inagree)doagree()
 if(iscreate){
        newquestion("doagree",arguments)
	Q[nq][2]=sn
	s=scheck(sn)
 }
 s="\n<tr>\n<td ALIGN=LEFT><b>"+s+"</b></td>\n<td ALIGN=LEFT><b>"+stext+"</b></td>"
 if(!iscreate){
	 for(var i=0;i<AgreeOptions.length;i++){
	  s+="\n<td ALIGN=CENTER>"
	  if(havedata){
	   s+=svalof(OPTDATA[i+1],OPTDATA[0])
	  }else{
	   s+="<input TYPE=radio NAME="+sn+" VALUE='"+AgreeOptions[i][1]+"'"+(AgreeOptions[i][1]==9?" checked":"")+">"
	  }
	  s+="</td>"
	 }
	 if(havedata){
	  s+="\n<td ALIGN=CENTER>"+mean+"</td>"
	  s+="\n<td ALIGN=CENTER>"+median+"</td>"
	 }
 }
 s+="\n</tr>"
 writedoc(s)
}
addf(doagree)

function hidden(swhat,stext){
 if(iscreate)return "\n<tr><td>"+swhat+"</td><td><input type=text name="+swhat+" value=\""+stext+"\" size=50></td></tr>"
 return "\n<input type=hidden name="+swhat+" value=\""+stext+"\">"
}
addf(hidden)

function showoption(stype,A){
 var sn=""
 var s=""
 var st=""
 var i1=1
 var ipt=0
 var stext=A[0]
 if(inagree)doagree()
 if(A.length<2){
	alert("Too few "+stype+" arguments for "+stext)
	return
 }
 if(A[1].indexOf("|")<0){
	sn=A[1]
	i1=2
 }
 if(sn.length==0){
	n++
	s=(numbered?n+". ":"")
	sn=snof(n)
 }
 if(iscreate){
	s=scheck(sn)
	Q[nq][2]=sn
 }
 s="\n<p><b>"+s+stext+"</b>"+(stype=="radio"?"":" (check all that apply)")+"<blockquote>"
 writedoc(s)
 if(havedata)showdata()
 s="\n<table>"
 if(iscreate)i1=9999
 for(var i=i1;i<A.length;i++){
  St=A[i].split("|")
  var schecked=(stype=="radio" && St[0].charAt(0)=="*"?" checked":"")
  s+="\n<tr>\n<td>"
  if(havedata){
	ipt++
	s+=svalof(OPTDATA[ipt],OPTDATA[0])+"</td>\n<td>"+St[1]
  }else{
	s+="<input name="+sn+" type="+stype+" value='"+St[0]+"'"+schecked+">"+"</td>\n<td>"+St[1]
	if(St.length>2)s+=":\n<input name="+sn+"_"+St[2]+" type=text size=40>"
  }
  s+="</td>\n</tr>"
 }
 s+="\n</table></blockquote>\n"
 writedoc(s)
}
addf(showoption)

function showtext(stype,A){
 var sn=""
 var s=""
 var i1=1
 var size=0
 var nr=0
 var nc=0
 var swhat=""
 var stail=""
 var stext=A[0]

 if(inagree)doagree()

 if(stext=="MORE"){
  if(iscreate){
	s="\n<p>Additional Open-Ended Questions?"
	writedoc(s)
	for(var i=0;i<10;i++)dotextarea("BLANK")
  }
  return
 }

 if(A.length>1 && isNaN(parseInt(A[1]))){
	sn=A[1]
	i1=2
 }
 if(sn.length==0){
	n++
	s=(numbered?n+". ":"")
	sn=snof(n)
 }
 if(iscreate){
	s="<br>"+scheck(sn)
	Q[nq][2]=sn
 }
 if(stext=="BLANK"){
  s+=" <input type=text name="+sn+"_MORE size=50>"
  writedoc(s)
  return
 }

 if(stype=="text"){
	size=(A.length<i1+1?40:A[i1])
	s="\n<table>\n<tr>\n<td width=100 valign=top><b>"+s+stext+"</b></td>\n<td valign=top>"
	if(!iscreate)swhat="<input type=text name="+sn+" size="+size+">"
	sclose="</td>\n</tr>\n</table>"
 }else{
	nr=(A.length<i1+1?10:A[i1])
	nc=(A.length<i1+2?60:A[i1+1])
	s="\n<p><b>"+s+stext+"</b><blockquote>"
 	if(!iscreate)swhat="<textarea name="+sn+" rows="+nr+" cols="+nc+" wrap=virtual></textarea>"
	sclose="</blockquote>"
 }
 writedoc(s)
 if(havedata){
	swhat=""
	showdata()
 }
 writedoc(swhat+sclose)
}
addf(showtext)

//---utilities

function writedoc(s){
 document.write(s)
}
addf(writedoc)

function snof(n){
 var s="0"+n
 return "q"+s.substring(s.length-2,s.length)
}
addf(snof)

function svalof(n,ntotal){
 if(n==0)return "&nbsp;&nbsp;&nbsp;"
 if(n==1 && ntotal==1)return "X"
 return "("+n+"/"+ntotal+")"
}
addf(svalof)

//key info

function askkey(){
 havekeys=true
 dohead("Authentication")
 var s='Enter your 9-digit key here: <input type=password name=key size=12> <input type=button value="Check Key" onclick="javascript:checkkey()"><p>'
 writedoc(s)
}
addf(askkey)

function checkkey()
{
 if(iskeyvalid(document.forms[0].key.value)){
 alert ("The key you have entered is valid.")
 return true
 }
 alert ("The key you have entered is invalid. If you proceed, your form will NOT be processed.")
 return false
}
addf(checkkey)

function iskeyvalid(k){
 var k2=Math.floor(k/1000)
 var k1=(k-k2*1000)
 var k3=k2/19
 var k4=0

 if(k3!=Math.floor(k3)){return false}
 for(i=1;i<10;i++){
   var r=Math.floor(k3/10)
   var d=k3-r*10
   k4+=d*i
   k3=(k3-d)/10
 }

 if (k4!=k1){return false}
 return true
}
addf(iskeyvalid)

function clearkey(){
  if(!havekeys)return
  document.forms[0].key.value=""
}
addf(clearkey)

function submitk(){
 if (!checkkey()){return}
 document.forms[0].submit()
}
addf(submitk)

//---data functions

function resetdata(){
	DATA=new Array()
	OPTDATA=new Array()
	mean=""
	median=""
}

function newdata(i){
 if(arguments.length==0){
	resetdata()
	return
 }	
 var n=DATA.length
 DATA[n]=new Array(i,ss)
}

function showdata(){
 var s=""
 if(idfield || isortfield1){
	writedoc("<table cellspacing=2 cellpadding=2 border>")
	for(var i=0;i<DATA.length;i++){
		s=""
		if(idfield)s+="\n<td valign=top><b>"+idfieldname+" "+SID[DATA[i][0]]+"</b></td>"
		if(isortfield1){
			s+="\n<td valign=top><b>"+sortfield1+" "+SSORT1[DATA[i][0]]+"</b></td>"
			if(isortfield2)s+="\n<td valign=top><b>"+sortfield2+" "+SSORT2[DATA[i][0]]+"</b></td>"
		}
		writedoc("\n<tr>"+s+"\n<td valign=top>"+DATA[i][1]+"</td>\n</tr>")
	}
	writedoc("\n</table><p>")
 }else{
	for(var i=0;i<DATA.length;i++){
		writedoc("<p>"+DATA[i][1]+"</p>")
	}
 }
}

// form creation

function scheck(swhat){
 return "<td><input type=checkbox name=CHK_"+swhat+" checked>"+swhat+" </td>"
}
addf(scheck)

function newquestion(stext,A){
	Q[++nq]=new Array()
	Q[nq][0]=stext
	Q[nq][1]=new Array()
	arraycopy(A,Q[nq][1])
}
addf(newquestion)

function arraycopy(A,B){for(var i=0;i<A.length;i++){B[i]=A[i]}}
addf(arraycopy)

// startup

resetdata()
resetall(true)


