/*

 hansonr@stolaf.edu 4:32 AM 11/12/2003


roster.js contains the Roster[date] array, with elements of form:

Roster['date1']=['DayType','date2',' Topic/Assignment','Chapter','Problem Set','Due','OnlineReading','OnlineReactions','OnlinePractice']


*/

//variables

 isReport = (document.location.search.indexOf("REPORT")>=0)

doreactions=true

classdays="MonWedFri"
weekdaystoshow="SunMonTueWedThuFriSat"
weekdaystoshow=classdays
percentwidth=Math.floor(98/(weekdaystoshow.length/3))
stolafsite=""//" 4 5 6 7 8 "
ScrewyFlash=new Array()
ScrewyFlash["10"]="Flash"
DueList=new Array()
Resources=new Array()
istable=false
//columns in roster

reacsiteX = reacsite.split("?")[0]

daytype=0
date2=1
topic=2
chapter=3
probset=4
probonline=5
probdue=6
onlinereading=7
onlinereactions=8
onlinepractice=9
dateLabel=10

//constants

cellheight=30
thisdate=""
year=date.substring(date.length-4,date.length)
Month=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
WeekDay=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]
msperday=24*60*60*1000
yesterday = new Date() - msperday

//global arrays

Calendar=new Array()

//date functions

function fixdate(sdate,justdate){
 var d=sdate+"/"+year
 var S=d.split("/")
 if (S.length == 4)S[2] = "20" + S[2]
 d=new Date(Date.UTC(S[2],S[0]-1,S[1],12))
 if(S.length==4)year=S[2]
 if(justdate)return d
 d=d+""
 return d.substring(0,4)+S[0]+"/"+S[1]+"/"+S[2]
}

function mmdd(date){	//10/13
 return (date.getMonth()+1)+"/"+date.getDate()
}

function ddmm(date){	//Mon 10/13
 return WeekDay[date.getDay()]+" "+(date.getMonth()+1)+"/"+date.getDate()
}


function mmmdd(date){	//Oct 23
 return Month[date.getMonth()]+" "+date.getDate()
}

function setdaterange(when,D){
 D[0]=new Date("1/1/1990")
 D[1]=new Date("1/1/2050")
 D[2]=0
 if(when=="unit"){
   var E = [0,0]
   for (var n = 0; n < Calendar.length; n++)if ("_Xx".indexOf(Calendar[n].daytype) > 0) {
	if (Calendar[n].realdate < yesterday)E[0]=Calendar[n].realdate - 0 + msperday
	if (Calendar[n].realdate > yesterday){E[1]=Calendar[n].realdate;break}
   }
   if (E[0]){
	D[0] = E[0]
	D[2] = new Date(E[0])-(new Date(E[0])).getDay()*msperday
   }
   if (E[1])D[1] = E[1]
   return
 }
 if(when=="full")return
 var d=new Date()
 D[0]=new Date(d-d.getDay()*msperday)
 if(when=="end")return
 D[1]=new Date(d-(d.getDay()-13)*msperday)
}

//sort functions

function asort(a,b){
 return fixdate(a,1)-fixdate(b,1)
}

function nsort(a,b){
 return a-b
}

//createcalendar() creates Calendar[iday]

function createcalendar(when,iwrite){
 var i=0
 var s=""
 var date=new Date()
 var dtype=""
 var datefirst=new Date()
 var datelast=new Date()
 var datea=new Date()
 var dateb=new Date()
 var d=new Date()
 var R=new Array()
 for(date in Roster){if(date.length && Roster[date][date2]!="date2" && Roster[date][topic].length){
	R[R.length]=fixdate(date,1)
	if(parseInt("1"+Roster[date][date2])!=1){
		R[R.length]=fixdate(Roster[date][date2],1)
	}
 }}
 R=R.sort(nsort)
 //Note! You can only take differences of dates.
 datefirst=new Date(R[0]-R[0].getDay()*msperday)
 datelast=new Date(R[R.length-1]-(R[R.length-1].getDay()-6)*msperday)
 datea=datefirst-0
 dateb=datelast-0
 var nday = 0
 for(i=datea;i<=dateb;i+=msperday){
	d=new Date(i)
	var n=Math.floor((d-datefirst)/msperday)
	Calendar[n]=new Array()
	Calendar[n].realdate=d
	Calendar[n].rosterpt=""
	Calendar[n].daytype=(d<R[0]||d>R[R.length-1]?"prepost":"")
 }

 for(date in Roster){if(date.length && Roster[date][date2]!="date2" && Roster[date][topic].length){
  var Rd = Roster[date];
  if (Rd[topic].indexOf("DATE=") >= 0) {
    Rd[dateLabel] = Rd[topic].split(";")[0].split("=")[1]
    Rd[topic] = Rd[topic].split(";")[1]
  }
	datea=(fixdate(date,1)-0)
	dateb=((parseInt("1"+Rd[date2])==1?datea:fixdate(Rd[date2],1))-0)
	for(i=datea;i<=dateb;i+=msperday){
		d=new Date(i+0.5*msperday)
		var n=Math.floor((i-datefirst)/msperday)
		Calendar[n].rosterpt=date		
		Calendar[n].daytype=(classdays.indexOf(WeekDay[d.getDay()])>=0?Rd[daytype]:"")
		if ("_xd".indexOf(Calendar[n].daytype)>0)Calendar[n].nday=(++nday)
	}
 }}
 for(var i=0;i<Calendar.length;i++){
  dtype=Calendar[i].daytype
  date=Calendar[i].rosterpt
  if (!date)continue
  onlineinfo(date,"")
  calinfo(date,dtype,0,0)
 }
 if(iwrite)makecalendar(when,datefirst)
}

function makecalendar(when,datefirst){
 var D=new Array()
 setdaterange(when,D)
 if(D[1]<datefirst)D[1]=new Date(datefirst-(-6*msperday))
 var s=""
 var i=0
 var dtype=""
 var daylast=99
 var monthlast=99
 var iday=0
 var imonth=0
 var date=""
 var datea=new Date()

 document.writeln("<table width=100% cellspacing=0 border=1 cellpadding=2><tr><td></td>")
 daylast=99
 monthlast=99
 for(i=0;i<weekdaystoshow.length;i+=3)document.writeln("<td class=calhead>"+weekdaystoshow.substring(i,i+3)+"</td>")
 var ndaytype = "past"
 var ndaytypecode
 for(i=0;i<Calendar.length;i++){
  dtype=Calendar[i].daytype
  date=Calendar[i].rosterpt
  datea=Calendar[i].realdate
  iday=datea.getDay()
  imonth=datea.getMonth()
  if((D[2] && datea>=D[2] || datea>=D[0]) && datea<=D[1] && weekdaystoshow.indexOf(WeekDay[iday])>=0){
   var ndaycode = "&nbsp;"
   if (datea >= D[0] && (dtype == 'd' || dtype=='x')){
	ndaycode = Calendar[i].nday
	if (datea > yesterday)ndaytype = (ndaytype == "past" ? "now" : "future")
	ndaytypecode = ndaytype	
   } else {
	ndaytypecode = ""
   }
   if(iday<daylast)document.writeln("</tr><tr><td><img src=transp.gif width=1 height="+cellheight+"></td>")
   s="<td valign=top width="+percentwidth+"% class=type"+dtype+">"
   s+="<table border=0 width=100% cellpadding=0;cellspacing=0><tr><td class=mmmdd><b>"
     +(Roster[date][dateLabel] ? Roster[date][dateLabel] : mmmdd(datea))+"</b></td><td align=right><table cellpadding=0 cellspacing=0><tr><td class=nday"+ndaytypecode+">"+ndaycode+"</td></tr></table></td></tr></table>"
   if (datea >= D[0]) s+=calinfo(date,dtype,i==0||date!=Calendar[i-1].rosterpt,datea)
   s+="</td>"
   document.writeln(s.replace(/<br><br>/g,"<br>"))
   daylast=iday
   monthlast=imonth
  }
 }
 document.writeln("</tr></table>")
}

//calinfo() does roster-depenedent stuff for makecalendar()

function calinfo(date,dtype,doprobset,datea){
  var s=""
  var st=""
  if(dtype=="d"||dtype=="x"||dtype=="X"||dtype=="B"||dtype==""){
	s="<em>"+Roster[date][topic]+"</em>"
  }
  if(dtype=="d"||dtype=="x"||dtype=="X"){
	var st = Roster[date][chapter]
	if(st.length){	
		s+="<br>Reading: " + (st.indexOf(".") >= 0 ? "Section" : "Chapter")+(st.length<3?" ":"s ")+st
	}
	st=probsetinfo(date,datea,0,"problems: ").replace(/<br>/," ")
	if(st.length && doprobset|| st.indexOf("DUE TODAY")>=0)s+="<br>&nbsp;"+st
	st=onlineinfo(date,"online ")
	if(st.length)s+="<br>&nbsp;"+st+"<br>&nbsp;"
  }
  return s
}

//maketable() does all writing for a table:

function maketable(when){
 istable=true
 var i=0
 var s=""
 var sdata=""
 var date=""
 var dtype=""
 var dateend=""
 var isbold=0
 var sclass="c"
 var datefirst=new Date()
 createcalendar(when,0)
 document.write("<table width=100% cellspacing=0><td class=head colspan=2>Inclusive dates</td>")
 for(var i=topic;i<Roster['date1'].length;i++){
	var name = Roster['date1'][i]
	if (isReport && (name.indexOf("Problem Set") >= 0 || name.indexOf("Online Resources")>=0))name = ""
	if(name.length)document.write("<td class=head>"+name+"</td>")
 }
 var R=new Array()
 for(date in Roster){
	if(date.length && Roster[date][date2]!="date2" && Roster[date][topic].length){
		R[R.length]=date
	}
 }
 var R=R.sort(asort)
 var D=new Array()
 setdaterange(when,D)
 datefirst=fixdate(R[0],1)
 datefirst=new Date(datefirst-datefirst.getDay()*msperday)
 if(D[1]<datefirst)D[1]=new Date(datefirst-(-6*msperday))

 for(i=0;i<R.length;i++){
  date=R[i]
  dtype=Calendar[i].daytype
  thisdate=""
  dateend=Roster[date][date2]
  isbold=(dateend=="")
  sclass=(isbold?"d":"d")
  if(isbold)dateend=date
  var datea=fixdate(date,1)
  var dateb=fixdate(dateend,1)
  if(datea>=D[0] && datea<D[1] || dateb>=D[0] && dateb<=D[1]){
   document.write("<tr>")
   td("d"+(i%2)+" colspan=2",(Roster[date][dateLabel] ? Roster[date][dateLabel] : fixdate(date))+(dateend==date?"":"<br>&nbsp;&nbsp;&nbsp;- "+fixdate(dateend)))
   td(sclass+(i%2),Roster[date][topic])
   td(sclass+(i%2),Roster[date][chapter])
   if (!isReport) {
	   td(sclass+(i%2),probsetinfo(date,datea,dateb,""))
	   td("l"+(i%2),onlineinfo(date))  
   }
   document.write("</tr>")
  } 
 }
 document.write("</table>")
}

// td() returns cell for maketable()

function td(sclass,what){
 document.write( "<td valign=" + (isReport ? "left" : "center") + " class="+sclass+">&nbsp;"+what+"&nbsp;</td>")
}


//probsetinfo() and onlineinfo() do roster-specifics for makecalendar() and maketable()
function probsetinfo(date,datea,dateb,pretext){
  var s=""
  var swhat=Roster[date][probset]
  swhat=(Roster[date][probonline].length ? 
		href(probsite,swhat) 
		+ (Roster[date][probonline] == 'K'? " " + href(probsite,swhat.replace(/\.pdf/,"-key.pdf"), "key") : "") 
	: swhat)
  if(datea && DueList[datea]){
	s+=DueList[datea]
  }
  if(dateb!=datea && dateb && DueList[dateb] && s.indexOf(DueList[dateb])<0){
	s+=DueList[dateb]
  }
  if(swhat!="" && pretext)s+=pretext+swhat
  if (datea==0 && Roster[date][probdue].length){
	var d=Roster[date][probdue]
	datea=fixdate(d,1)
	s+="&nbsp;<font color=darkred>due "+ddmm(datea)+"</font>"
	DueList[datea]="<font color=darkred>PROBLEM SET "+swhat+" DUE "+(istable?ddmm(datea):"TODAY")+"</font><p>&nbsp;"
  }
  return s
}


function onlineinfo(date,pretext){
  var sdata=""
  if(pretext==null)pretext=""
  if (!Roster[date])return ""
  var s=Roster[date][onlinereading]
  var T = s.split(";")
  s = T[0]
  var S=s.split(",")
  if(s.length){
	sdata+="<br>&nbsp;"+pretext+"reading: "
	for(var i=0;i<S.length;i++){
		var C=S[i].split(":")
if (C[1] == "http") C[1] = C[1] + ":" + C[2]
		sdata+=href((stolafsite.indexOf(C[0])>=0?pracsite:booksite),C[0],C[1])
	}
   }
  if (T.length > 1) {
	for(var i = 1; i < T.length; i++) {
		var C = T[i].split(":")
		sdata += href(C[1] + ":" + C[2],"",C[0])
	}
  }
  if(ScrewyFlash[s])sdata=sdata.replace(/flash/g,ScrewyFlash[s])
  s=Roster[date][onlinereactions]
  if(doreactions && s.length){
		var havequiz = (s.indexOf("+quiz") >= 0)
		if (havequiz)s = s.split("+quiz")[0]
		sdata+="<br>&nbsp;online"+href(reacsite,s," reactions")
		if (havequiz)sdata+="&nbsp;"+href(reacsite,s,"quiz").replace(/\,0/,",1")
  }
  if(s.indexOf("-")==0)sdata=sdata.replace(/mode=1/,"mode=0").replace(/chall/,"all")
  s=Roster[date][onlinepractice]
  if(s.length){
    sdata+="<br>&nbsp;"+pretext+"practice: "
    var C=s.split(",")
    for(var i=0;i<C.length;i++){
	if(i>0 && i%3==0)sdata+="<br>&nbsp;&nbsp;&nbsp;"
	var S=C[i].split(":")
	if(S.length==1 && Resources[S[0]])S[1]=Resources[S[0]]
    	if(S.length==1)S[1]=S[0]
	if(S[1].indexOf("%") >= 0)S[1] = unescape(S[1])
    	if(S.length==3)S[1]=S[1]+":"+S[2]
	S[1]=S[1].replace(/TOOLKIT/,toolkit)
	if(S[1].indexOf("http:")<0 && S[1].indexOf(".")!=0)S[1]=pracsite+"/"+S[1]
        sdata+=href(S[1],S[0])+"&nbsp;&nbsp;"
    }
  }
//  if(s=="all")sdata=sdata.replace(/chall\/medialib\/flash\/practice.htm/,"").replace(/chall/,"all")
  sdata=sdata.substring(10,sdata.length)
  return sdata
}

// href() returns a ref for probsetinfo() and onlineinfo()

function href(site,ichaps,text){
 var s=""
 var sm=(site.indexOf(reacsiteX)==0 ? "abcdefghijk" : Math.random()+"")
 var sm=sm.substring(1,7)
 var j=0
 if(arguments.length<3)text=ichaps
 Resources[text]=site
 if(ichaps == "concept map" || text.indexOf("http") == 0) {
	s="<a target=_"+sm+" href="+text+">"+ichaps+"</a>&nbsp;"
	return s
 }

 if(ichaps.indexOf(".")>=0){
	var sroot=ichaps.split(".")[0]
	if (sroot.indexOf("-") >= 0)
	 sroot=sroot.split("-")[0]
	s="<a target=_"+sm+" href="+site.replace(/_root/,sroot).replace(/_file/,ichaps)+">"+text+"</a>&nbsp;"
	return s
 }
 var S=ichaps.split(",")
 if(S.length==0)return ""
 for(var i=0;i<S.length;i++){
	var schap="00"+S[i]
	schap=schap.substring(schap.length-2,schap.length)
	if(S[i].indexOf("-")==0){schap=schap.substring(1,schap.length);S[i]="all"}
	if(arguments.length<3)text=S[i]
	s+="<a target=_"+sm+" href="+site.replace(/_chxx/,schap).replace(/_ch/,S[i])+">"+(isNaN(parseInt(text))?"":"ch")+text+"</a>&nbsp;"
 }
 return s
}


document.write("<"+"title>"+title+"</"+"title>")

function whatever(){
 s="<center><table><tr><th>Calendar Format<th>List Format<tr><td><ul>"
 s+="<li><a href=schedule.htm?thiscalendar>just this unit</a>"
 s+="<li><a href=schedule.htm?fullcalendar>full semester</a>"
 s+="</ul></td><td><ul>"
 s+="<li><a href=schedule.htm?thistable>just this unit</a>"
 s+="<li><a href=schedule.htm?fulltable>full semester</a>"
 s+="</ul></td></tr></table></center>"
 document.write(s)

 var s=document.location.search


 if (s == "")s = "?thiscalendar"
 if(s.indexOf("?fullcalendar")==0)
    createcalendar("full",1)
 else if(s.indexOf("?thiscalendar")==0)
    createcalendar("unit",1)
 else if(s.indexOf("?endcalendar")==0)
    createcalendar("end",1)
 else if(s.indexOf("?fulltable")==0)
    maketable("full")
 else if(s=="?thistable")
    maketable("unit")
 else if(s=="?endtable")
    maketable("end")
 else //if(s=="?thiscalendar")
    createcalendar("this",1)


}


