function createXHR(){
    if (typeof XMLHttpRequest != "undefined"){
        return new XMLHttpRequest();
    }
    else if (window.ActiveXObject){
        var aVersions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0"];
        for(var i=0;i<Versions.length;i++){
            try{
                var oXHR=new ActiveXObject(aVersions[i]);
                return oXHR;
            } catch(oError){
                //Do nothing
            }
        }
    }
    throw new Error("XMLHttp object could not be created.");
}

Array.prototype.push = function() {
    var n = this.length >>> 0;
    for (var i = 0; i < arguments.length; i++) {
	this[n] = arguments[i];
	n = n + 1 >>> 0;
    }
    this.length = n;
    return n;
};

Array.prototype.pop = function() {
    var n = this.length >>> 0, value;
    if (n) {
	value = this[--n];
	delete this[n];
    }
    this.length = n;
    return value;
};

var courseInfo=[];
var courses=[];
var cireq;
var nupdates=0;
var ncolumns=14;
var pairings=[];
var includeonly=['MC','NDC','INT','OCC'];
var times=[];
var timecodes=[];
var timesplits=[];
var selections=[];
var exclude=null;
var timeencodes=[];
var nexclude=0;
var impossiblecourses;
var impossibles;
var excludes=[];
var possibles=[];
var fontsize=100;
var currentDate=new Date();
var adviser="";
var savebyid=0;
var userfilter="f";
var header;
var controls;
var headercss;

function init(){
    checkFirefox();
    $('premajors').selectedIndex=0;
    exclude=document.getElementById("excludetime");
    exclude.blur();
    cireq=createXHR();
    cireq.open('get','courseinfo.txt',false);
    cireq.send(null);
    splitInfo(cireq.responseText);
    setTimeout("getCourseInfo();",300000);
    getPairings();
    getImpossibles();
    getAllSections();
    setDate();
    document.addEventListener("keyup",setHeaderHeight,false);
    header=$("header");
    headercss=addCSSRule("#header").style;
    controls=$("controls");
    if(header){
        setHeaderHeight();
        //setInterval("setHeaderHeight()",1000);
    }
}

function setDate(){
    var x=document.getElementById("date");
    x.appendChild(document.createTextNode(currentDate.toLocaleDateString()));
}

function updateStudent(){
    var id=document.getElementById("stid");
    var k=id.value;
    k=k.trim();
    if(k.length){
        while(k.length<7) k="0"+k;
    }
    id.value=k;
    var ln=document.getElementById("stlname").value.trim();
    var fn=document.getElementById("stfname").value.trim();
    var mn=document.getElementById("stmname").value.trim();
    var t=ln.toUpperCase();
    if(fn) t+=" "+fn.charAt(0).toUpperCase();
    if(mn){
        if(!fn) t+=" ";
        t+=mn.charAt(0).toUpperCase();
    }
    if(id.value.trim()){
        if(!savebyid){
            t+=" "+id.value.trim();
        }
        else t=id.value.trim()+" "+t;
    }
    var d=new Date();
    t+=" "+d.toLocaleFormat("%m-%y");
    t=t.trim();
    if(t.length>12){
        document.title=t;
    }
    else document.title="DTCC Open Class List";
}

function getPairings(){
    pairings=[];
    var preq=createXHR();
    preq.open('get','pairings.txt',false);
    preq.setRequestHeader("Cache-Control", "no-cache");
    preq.send(null);
    var x=preq.responseText.split(/\n/);
    for(var i=0;i<x.length;i++){
        x[i]=x[i].split("|");
        pairings.push(x[i][0].trim());
        pairings.push(x[i][1].trim());
    }
}

function getImpossibles(){
    impossibles=[];
    impossiblecourses=[];
    var preq=createXHR();
    preq.open('get','generateimpossibles.php',false);
    preq.setRequestHeader("Cache-Control", "no-cache");
    preq.send(null);
    var x=preq.responseText.split(/\n/);
    for(var i=0;i<x.length;i++){
        x[i]=x[i].split("|");
        impossiblecourses.push(x[i][0].trim());
        impossibles.push(x[i][1].trim());
    }
}

function hideOverlap(x){
    var c=document.getElementById("courses");
    c.setAttribute(x.id,"1");
    var t=x.getAttribute("tc");
    if(!t) return;
    var tc=1*t;
    var h=timesplits[tc];
    var g;
    for(var i=0;i<h.length;i++){
        g=addCSSRule('body #bottom #courses['+x.id+'][a="1"][b="1"][c="1"][d="1"] .course span[hide*="('+h[i]+')"][loc]');
        g.style.display="none";
        //g.style.textDecoration="blink";
    }
}

function removeOverlap(x){
    var c=document.getElementById("courses");
    c.removeAttribute(x.id);
    var t=x.getAttribute("tc");
    if(!t) return;
    var tc=1*t;
    var h=timesplits[tc];
    for(var i=0;i<h.length;i++){
        killCSSRule('body #bottom #courses['+x.id+'][a="1"][b="1"][c="1"][d="1"] .course span[hide*="('+h[i]+')"][loc]');
    }
    
}

function getCourseInfo(){
    cireq=createXHR();
    cireq.open('get','courseinfo.php'+ '&ms=' + new Date().getTime(),true);
    cireq.onreadystatechange=updateCourseInfo;
    cireq.send(null);
}

function updateCourseInfo(){
    if(cireq.readyState!=4) return;
    splitInfo(cireq.responseText);
    setTimeout("getCourseInfo();",300000);
}

function splitInfo(x){
    var w=x.split(/\n/);
    var ci=[];
    var c=[];
    for(var i=0;i<w.length;i++){
        ci.push(w[i].split("|"));
        c.push(ci[i][0]);
    }
    courses=c;
    courseInfo=ci;
}

var sreq;

function getAllSections(){
    sreq=createXHR();
    sreq.open('get','generatesectionsnew.php',true);
    sreq.onreadystatechange=updateSections;
    sreq.send(null);
}

function updateSections(){
    if(sreq.readyState!=4) return;
    var t=sreq.responseText.split("*****");
    if(!t){
        getAllSections();
        return;
    }
    updatetimecodes(t[1]);
    var s=t[0].split("\n");
    nupdates++;
    setupdatetime(s[0]);
    for(var i=1;i<s.length;i++){
        updateSection(s[i]);
    }
    removeCancelled();
    countClosed();
    if(nupdates==1){
        reset();
    }
    calculateEnrollment();
    setTimeout("getAllSections();",60000);
}

function calculateEnrollment(){
	var x=$("courses");
	var y=x.firstChild;
	var w;
	var s;
	var tcap;
	var t;
	while(y){
		w=y.firstChild.firstChild.firstChild;
		s=w.firstChild.nextSibling;
		tcap=0;
		t=0;
		while(s){
			t+=1*s.getAttribute("avail2");
			tcap+=1*s.getAttribute("cap");
			s=s.nextSibling;
		}
		w=w.firstChild.firstChild.nextSibling;
		if(!w.firstChild) w.appendChild(document.createTextNode("0"));
		w=w.firstChild;
		w.data=t+"/"+tcap;
		y=y.nextSibling;
	}
}

function countClosed(){
    var x=$("courses");
    var y=x.firstChild;
    var n;
    while(y){
        n=y.firstChild.firstChild.firstChild.childNodes.length-1;
        n-=1*y.getAttribute("mc")+1*y.getAttribute("occ")+1*y.getAttribute("ndc")+1*y.getAttribute("int");
        y.setAttribute("closed",n);
        y=y.nextSibling;
    }
}

function setupdatetime(t){
    t=t.split(":");
    t[0]=t[0]*1;
    var k="AM";
    if(t[0]>11) k="PM";
    if(t[0]>12) t[0]-=12;
    var x=document.getElementById("lastupdated");
    x=x.firstChild;
    x.data=t[0]+":"+t[1]+k;
}

function updatetimecodes(t){
    var w=t.split("\n");
    var b=(w.length>times.length);
    for(var i=0;i<w.length;i++){
        w[i]=w[i].split("|");
        if(w[i].length<2) continue;
        if(i<times.length){
            if(timecodes[i]!=w[i][1]){
                timecodes[i]=w[i][1];
                timesplits[i]=timecodes[i].split(",");
            }
        }
        else{
            times.push(w[i][0]);
            timecodes.push(w[i][1]);
            timesplits.push(w[i][1].split(","));
            timeencodes.push([]);
        }
    }
    if(b) hideOverlaps();
}

function hideOverlaps(){
    for(var i=0;i<selections.length;i++){
        hideOverlap(selections[i]);
    }
}

function getTwin(n){
    var x=pairings.indexOf(n);
    if(x<0){
        //alert(n);
        return '';
    }
    var y=x%2;
    if(y) return pairings[x-1];
    return pairings[x+1];
}

function updateSection(xx){
    var x=xx.split("|");
    if(x.length<2) return;
    if(includeonly.indexOf(x[8])<0) return;
    var cap=x[9]*1;
    var taken=x[10]*1;
    var avail=cap-taken;
    var avail2=avail;
    //avail=Math.floor(8*Math.random()); //testing
    //avail=nupdates%2; //testing
    if(avail<0) avail=0;
    var s=x[1];
    s=s.split("-");
    var n=s[0]+s[1];
    var n2=s[0]+s[1]+s[2];
    var cindex=courses.indexOf(s[0]+" "+s[1]);
    var y=document.getElementById(n);
    var y2=document.getElementById(n2);
    var w=document.getElementById("courses");
    var u;
    var v;
    var twin;
    var newsection=false;
    if(!y){
        y=document.createElement("table");
        y.setAttribute("id",n);
        twin=getTwin(n);
        if(twin) y.setAttribute('twin',twin);
        setImpossibles(y);
        y.setAttribute("class", "course");
        y.appendChild(document.createElement("tbody"));
        y=y.firstChild;
        y.appendChild(document.createElement("tr"));
        y=y.firstChild;
        y.appendChild(document.createElement("td"));
        y=y.firstChild;
        u=document.createElement("b");
        setcourseinfo(u,cindex);
        u.appendChild(document.createTextNode(s[0]+" "+s[1]));
        u.appendChild(document.createElement("sub"));
        u.appendChild(document.createTextNode(": "));
        y.appendChild(u);
        u.onclick=function(e){
            possible(e);
        };
        u=w.lastChild;
        y=y.parentNode.parentNode.parentNode;
        v=null;
        while(u){
            if(u.getAttribute("id")>n){
                v=u;
                u=u.previousSibling;
            }
            else{
                u=0;
            }
        }
        u=v;
        if(u){
            w.insertBefore(y,u);
        }
        else w.appendChild(y);
        insertfilter(y,u);
        var info;
        if(cindex>-1){
            info=courseInfo[cindex];
            if(1*info[2]){
                y.setAttribute("asut","1");
                y.removeAttribute("nasut");
            }
            else{
                y.setAttribute("nasut","1");
                y.removeAttribute("asut");
            }
        }
        else{
            y.setAttribute("nasut","1");
            y.removeAttribute("asut");
        }
        if(s[1].substr(0,3)*1<100){
            y.setAttribute("asut","1");
            y.setAttribute("nasut","1");
        }
    }
    twin=y.getAttribute('twin');
    y=y.firstChild.firstChild.firstChild;
    if(!y2){
        newsection=true;
        y2=document.createElement("span");
        y2.setAttribute("loc",x[8]);
        y2.setAttribute("id",n2);
        if(twin){
            y2.setAttribute('twin',twin+s[2]);
        }
        y2.appendChild(document.createTextNode(s[2]));
        u=document.createElement("sub");
        u.appendChild(document.createTextNode(avail2));
        y2.appendChild(u);
        y2.appendChild(document.createTextNode(" "));
        u=y.lastChild;
        v=null;
        while(u!=y.firstChild){
            if(u.getAttribute("id")>n2){
                v=u;
                u=u.previousSibling;
            }
            else{
                u=y.firstChild;
            }
        }
        u=v;
        if(u!=y.firstChild){
            y.insertBefore(y2,u);
        }
        else{
            y.appendChild(y2);
        }
        y2.setAttribute("info", "0");
        y2.onclick=function(e){
            select(e);
        };
    }
    setTime(y2,xx,x);
    setSeats(y2,avail2,cap);
    y2.setAttribute("updated", nupdates);
    if(twin){
        var y2twin=document.getElementById(twin+s[2]);
        if(y2twin){
            if(y2twin.getAttribute("updated")==y2.getAttribute("updated")){
                if(y2.getAttribute("hide")!=y2twin.getAttribute("hide")){
                    y2.setAttribute("hide",y2.getAttribute("hide")+y2twin.getAttribute("hide"));
                    y2twin.setAttribute("hide",y2.getAttribute("hide"));
                    matchtwins(y2twin,y2);
                }
            }
        }
    }
    y=y.parentNode.parentNode.parentNode;
    var open=y.getAttribute(x[8]);
    if(open){
        open=1*open;
    }
    else{
        open=0;
    }
    var op;
    if(!newsection){
        op=1*y2.getAttribute('avail');
        if(op){
            if(!avail) open--;
        }
        else{
            if(avail) open++;
        }
    }
    else{
        if(avail){
            open++;
        }
    }
    if(open){
        y.setAttribute(x[8],open);
    }
    else y.removeAttribute(x[8]);
    y2.firstChild.nextSibling.firstChild.data=avail2;
    if(avail){
        y2.setAttribute("avail",avail);
    }
    else{
        y2.removeAttribute("avail");
//        if(!twin){
//		unselect(y2);
//	  }
//	  else{
//		var ty2=document.getElementById(twin+s[2]);
//            if(!ty2) return;
            //if(!ty2.getAttribute("avail")) unselect(y2);
//	  }
    }
    y2.setAttribute("avail2",avail2);
    y2.setAttribute("cap",cap);
}

function matchtwins(x,y){
    var id="twin"+x.id;
    w=document.getElementById(id);
    if(!w){
        w=document.createElement("table");
        w.setAttribute("id",id);
        w.appendChild(document.createElement("tbody"));
        document.getElementById("twins").appendChild(w);
    }
    w=w.firstChild;
    while(w.lastChild) w.removeChild(w.lastChild);
    var u=x.lastChild.firstChild.firstChild;
    while(u){
        w.appendChild(u.cloneNode(true));
        u=u.nextSibling;
    }
    u=y.lastChild.firstChild.firstChild;
    while(u){
        w.appendChild(u.cloneNode(true));
        u=u.nextSibling;
    }
    var xx=x.getAttribute("infox");
    xx=xx.split("|");
    var yy=y.getAttribute("infox");
    yy=yy.split("|");
    xx=xx[11].trim();
    yy=yy[11].trim();
    var inst=xx;
    if(yy){
        if(inst){
            inst+=";"+yy;
        }
        else inst=yy;
    }
    inst=removeRepeats(inst);
    if(!inst){
        y.setAttribute("onmouseover","TagToTip('"+id+"',JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,300)");
        x.setAttribute("onmouseover","TagToTip('"+id+"',JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,300)");
    }
    else{
        y.setAttribute("onmouseover","TagToTip('"+id+"',JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,300,TITLE,\""+inst+"\")");
        x.setAttribute("onmouseover","TagToTip('"+id+"',JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,300,TITLE,\""+inst+"\")");
    }
}

function removeRepeats(x){
    if(!x) return x;
    var y=x.split(";");
    var w=y[0];
    for(var i=1;i<y.length;i++){
        if(w.indexOf(y[i])<0) w+=";"+y[i];
    }
    return w;
}

function setcourseinfo(u,cindex){
    u.setAttribute("cname","???");
    u.setAttribute("cr","?");
    u.setAttribute("cn","?");
    if(cindex<0) return;
    var v=courseInfo[cindex];
    u.setAttribute("cname",v[1]);
    var t="CR:"+v[3];
    u.setAttribute('cr',v[3]);
    if(v[4]) t+="|Prereq: "+v[4];
    if(v[5]) t+="|Coreq: "+v[5];
    u.setAttribute("onmouseover","Tip(\""+t+"\",JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,-450,TITLE,\""+v[1]+"\");");
    u.setAttribute("onmouseout","UnTip();");
}

function select(e){
    var x=e;
    if(x.target) x=x.target;
    var xt=x.getAttribute('twin');
    if(xt) xt=document.getElementById(xt);
    var y=x.parentNode.parentNode.parentNode.parentNode;
    var yt=y.getAttribute('twin');
    if(yt) yt=document.getElementById(yt);
    if(x.hasAttribute("class")){
        x.removeAttribute("class");
        y.removeAttribute("selected");
        tableremove(x);
        removeOverlap(x);
        selections.splice(selections.indexOf(x),1);
        if(xt){
            xt.removeAttribute("class");
            yt.removeAttribute("selected");
            tableremove(xt);
            removeOverlap(xt);
            selections.splice(selections.indexOf(xt),1);
        }
        return;
    }
    x.setAttribute("class","selected");
    tableadd(x);
    y.setAttribute("selected","1");
    if(xt){
        xt.setAttribute("class","selected");
        tableadd(xt);
        yt.setAttribute("selected","1");
    }
    if(!y.hasAttribute('possible')) possible(x.parentNode.firstChild);
    hideOverlap(x);
    selections.push(x);
    if(xt){
        hideOverlap(xt);
        selections.push(xt);
    }
}

function tableremove(x){
    var id="sel"+x.id;
    var y=document.getElementById("selectionbody");
    var l=y.childNodes.length;
    var w=document.getElementById(id);
    y.removeChild(w);
    if(l==2){
        y.parentNode.setAttribute("hidden","1");
        var st=document.getElementById("student");
        st.setAttribute("hidden","1");
    }
}

function tableadd(x){
    var id="sel"+x.id;
    var info=x.getAttribute("infox").split("|");
    var u=x.parentNode.firstChild;
    var tb=document.getElementById("selectionbody");
    var tr=document.createElement("tr");
    tr.setAttribute("id",id);
    tb.appendChild(tr);
    var td=document.createElement("td");
    td.appendChild(document.createTextNode(info[0]));
    tr.appendChild(td);
    td=document.createElement("td");
    td.appendChild(document.createTextNode(info[1]));
    tr.appendChild(td);
    td=document.createElement("td");
    td.appendChild(document.createTextNode(u.getAttribute("cname")));
    tr.appendChild(td);
    td=document.createElement("td");
    td.appendChild(document.createTextNode(u.getAttribute("cr")));
    tr.appendChild(td);
    var w=x.lastChild.firstChild.childNodes;
    var t=[];
    for(var i=3;i<w.length;i++){
        t.push(w[i].firstChild.firstChild.data+"");
    }
    for(i=0;i<t.length;i++){
        t[i]=t[i].split(/\s/);
    }
    td=document.createElement("td");
    for(i=0;i<t.length;i++){
        if(i) td.appendChild(document.createElement("br"));
        td.appendChild(document.createTextNode(t[i][0]));
    }
    tr.appendChild(td);
    td=document.createElement("td");
    for(i=0;i<t.length;i++){
        if(i) td.appendChild(document.createElement("br"));
        td.appendChild(document.createTextNode(t[i][1]));
    }
    tr.appendChild(td);
    td=document.createElement("td");
    var s;
    for(i=0;i<t.length;i++){
        if(i) td.appendChild(document.createElement("br"));
        td.appendChild(document.createTextNode(t[i][2]+" "+t[i][3]));
    }
    tr.appendChild(td);
    t=info[7].split("-");
    for(i=0;i<2;i++){
        t[i]=t[i].split("/");
        for(var j=0;j<3;j++){
            t[i][j]=1*t[i][j];
        }
    }
    td=document.createElement("td");
    td.appendChild(document.createTextNode(t[0][0]+"/"+t[0][1]));
    tr.appendChild(td);
    td=document.createElement("td");
    td.appendChild(document.createTextNode(t[1][0]+"/"+t[1][1]));
    tr.appendChild(td);
    tb.parentNode.removeAttribute("hidden");
    var st=document.getElementById("student");
    st.removeAttribute("hidden");
}

function setColumns(n){
    ncolumns+=n;
    if(ncolumns<1) ncolumns=1;
    //if(ncolumns>10) ncolumns=10;
    var t=document.getElementById('courses');
    t.setAttribute("style","-moz-column-gap: 0px;-moz-column-count:"+ncolumns+";");
}

function toggle(x){
    var b=document.body;
    if(b.hasAttribute(x)){
        b.removeAttribute(x);
        return;
    }
    else b.setAttribute(x, "1");
}

function removeCancelled(){
    var x=document.getElementById("courses");
    var y=x.firstChild;
    var w;
    var n=nupdates+"";
    var td=y.firstChild.firstChild.firstChild;
    while(y){
        w=td.firstChild;
        while(w.nextSibling){
            if(n!=w.nextSibling.getAttribute("updated")){
                unselect(w.nextSibling);
                td.removeChild(w.nextSibling);
            }
            else w=w.nextSibling;
        }
        w=y.nextSibling;
        if(td.firstChild==td.lastChild){
            x.removeChild(y);
        }
        y=w;
    }
}

function getcode(d,t,c){
    var w=[];
    for(var i=0;i<d.length;i++){
        w.push(d[i]+" "+t[i]);
    }
    w.sort();
    var tc=c+" "+w.join(" ");
    var k=times.indexOf(tc);
    return k;
}

function setSeats(y,a,c){
    var tid="t"+y.id;
    var s=a+" seat";
    if(a!=1) s+="s";
    s+=" available out of "+c;
    var x=document.getElementById(tid).firstChild.firstChild.nextSibling.nextSibling.firstChild.firstChild;
    x.data=s;
}

function setTime(y,xx,x){
    y.setAttribute("infox",xx);
    if(y.getAttribute("info")==x[2]+x[3]+x[4]+x[5]+x[11]) return;
    unselect(y);
    y.setAttribute("info",x[2]+x[3]+x[4]+x[5]+x[11]);
    var a;
    var d;
    if(x[2]){
        a=x[2].split(" ");
        d=x[2].replace(/TH/g,"R").split(" ");
    }
    else{
        a=[];
        d=[];
    }
    var t;
    if(x[3]){
        t=x[3].split(" ");
    }
    else t=[];
    if(x[3]){
        var tc=getcode(d,t,x[7]);
        y.setAttribute("tc",tc);
        y.setAttribute("hide","("+tc+")");
    }
    var tid="t"+y.id;
    var sp;
    var inst=x[11].trim();
    var table=document.getElementById(tid);
    if(!table){
        table=document.createElement("table");
        table.setAttribute("id", tid);
        y.appendChild(table);  
        y.setAttribute("onmouseout","UnTip()");
    }
    if(!inst){
        y.setAttribute("onmouseover","TagToTip('"+tid+"',JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,300)");
    }
    else y.setAttribute("onmouseover","TagToTip('"+tid+"',JUMPHORZ,true,FONTSIZE,'16pt',WIDTH,300,TITLE,\""+inst+"\")");
    if(table.firstChild) table.removeChild(table.firstChild);
    table.appendChild(document.createElement("tbody"));
    var tb=table.firstChild;
    var b;
    if(x[4]){
        b=x[4].split(" ");
    }
    else b=[];
    var rn;
    if(x[5]){
        rn=x[5].split(" ");
    }
    else rn=[];
    var tr=document.createElement("tr");
    tb.appendChild(tr);
    var td=document.createElement("td");
    tr.appendChild(td);
    td.appendChild(document.createTextNode(x[1]+" ("+x[0]+")"));
    tr.setAttribute("class","availability");
    tr=document.createElement("tr");
    tr.setAttribute("class","availability");
    tb.appendChild(tr);
    td=document.createElement("td");
    tr.appendChild(td);
    td.appendChild(document.createTextNode(x[7]));
    tr=document.createElement("tr");
    tr.setAttribute("class","availability");
    tb.appendChild(tr);
    td=document.createElement("td");
    tr.appendChild(td);
    td.appendChild(document.createTextNode("Availability:"));
    for(var i=0;i<b.length;i++){
        sp="";
        tr=document.createElement("tr");
        tb.appendChild(tr);
        td=document.createElement("td");
        tr.appendChild(td);
        if(i<t.length){
            sp+=a[i]+"\u00a0"+t[i]+"\u00a0";
        }
        sp+=b[i]+"\u00a0"+rn[i];
        td.appendChild(document.createTextNode(sp));
    }
}

function getTime(t){
    var x=t.split("-");
    return [parsetime(x[0]),parsetime(x[1])];
}

function parsetime(t){
    var x=t.split(":");
    var a=x[0]*1;
    a=a%12;
    if(x[1].charAt(2)=="P") a+=12;
    a*=60;
    var b=x[1].substr(0,2)*1;
    a+=b;
    return a;
}

function unselect(x){
    if(!x.getAttribute("class")) return;
    select(x);
}

function getCSSRule(ruleName, deleteFlag) {               // Return requested style obejct
   ruleName=ruleName.toLowerCase();                       // Convert test string to lower case.
   if (document.styleSheets) {                            // If browser can play with stylesheets
      for (var i=0; i<document.styleSheets.length; i++) { // For each stylesheet
         var styleSheet=document.styleSheets[i];          // Get the current Stylesheet
         var ii=0;                                        // Initialize subCounter.
         var cssRule=false;                               // Initialize cssRule.
         do {                                             // For each rule in stylesheet
            if (styleSheet.cssRules) {                    // Browser uses cssRules?
               cssRule = styleSheet.cssRules[ii];         // Yes --Mozilla Style
            } else {                                      // Browser usses rules?
               cssRule = styleSheet.rules[ii];            // Yes IE style.
            }                                             // End IE check.
            if (cssRule)  {                               // If we found a rule...
               if (cssRule.selectorText.toLowerCase()==ruleName) { //  match ruleName?
                  if (deleteFlag=='delete') {             // Yes.  Are we deleteing?
                     if (styleSheet.cssRules) {           // Yes, deleting...
                        styleSheet.deleteRule(ii);        // Delete rule, Moz Style
                     } else {                             // Still deleting.
                        styleSheet.removeRule(ii);        // Delete rule IE style.
                     }                                    // End IE check.
                     return true;                         // return true, class deleted.
                  } else {                                // found and not deleting.
                     return cssRule;                      // return the style object.
                  }                                       // End delete Check
               }                                          // End found rule name
            }                                             // end found cssRule
            ii++;                                         // Increment sub-counter
         } while (cssRule)                                // end While loop
      }                                                   // end For loop
   }                                                      // end styleSheet ability check
   return false;                                          // we found NOTHING!
}                                                         // end getCSSRule

function killCSSRule(ruleName) {                          // Delete a CSS rule
   return getCSSRule(ruleName,'delete');                  // just call getCSSRule w/delete flag.
}                                                         // end killCSSRule

function addCSSRule(ruleName) {                           // Create a new css rule
   if (document.styleSheets) {                            // Can browser do styleSheets?
      if (!getCSSRule(ruleName)) {                        // if rule doesn't exist...
         if (document.styleSheets[0].addRule) {           // Browser is IE?
            document.styleSheets[0].addRule(ruleName, null,0);      // Yes, add IE style
         } else {                                         // Browser is IE?
            document.styleSheets[0].insertRule(ruleName+' { }', 0); // Yes, add Moz style.
         }                                                // End browser check
      }                                                   // End already exist check.
   }                                                      // End browser ability check.
   return getCSSRule(ruleName);                           // return rule we just created.
}

function possible(e){
    var x=e;
    if(x.target) x=x.target;
    x=x.parentNode.parentNode.parentNode.parentNode;
    var xt=x.getAttribute('twin');
    if(xt) xt=document.getElementById(xt);
    var c=document.getElementById("courses");
    if(x.getAttribute('possible')){
        if(x.getAttribute('selected')) return;
        c.removeAttribute(x.id);
        x.removeAttribute('possible');
        removeImpossibles(x);
        possibles.splice(possibles.indexOf(x.firstChild.firstChild.firstChild.firstChild),1);
        if(xt){
            xt.removeAttribute('possible');
            c.removeAttribute(xt.id);
            removeImpossibles(xt);
            possibles.splice(possibles.indexOf(xt.firstChild.firstChild.firstChild.firstChild),1);
        }
        return;
    }
    x.setAttribute('possible','1');
    c.setAttribute(x.id,"1");
    hideImpossibles(x);
    possibles.push(x.firstChild.firstChild.firstChild.firstChild);
    if(xt){
        xt.setAttribute('possible', '1');
        c.setAttribute(xt.id,"1");
        hideImpossibles(xt);
        possibles.push(xt.firstChild.firstChild.firstChild.firstChild);
    }
}

function checkFirefox(){
    var x=navigator.userAgent;
    var f="Firefox/";
    var k=x.indexOf(f);
    if(k==-1){
        alertFirefox();
        return;
    }
    x=x.substr(k+f.length);
    x=x.substr(0,3);
    x=1*x;
    if(x<3.0) alertFirefox();
}

function alertFirefox(){
    alert("You must use Firefox 3.0 or higher to view this page!"
        +" You're current browser will not run this page correctly."
        +" Firefox 3.0 supports CSS3 multicolumns. Internet Explorer does not."
        +" Tooltips work better under Firefox 3.5.");
}

var timeexp=/(\d{1,2}:\d{2}(A|P))?-(\d{1,2}:\d{2}(A|P))?/;
var dayexp=/M?T?W?R?F?S?/;

function excludeTime(){
    var e=exclude.value.toUpperCase().trim();
    exclude.blur();
    e=e.replace(/PM/g,"P");
    e=e.replace(/AM/g,"A");
    e=e.replace(/TH/g,"R");
    var d=e.match(dayexp);
    var t=e.match(timeexp);
    if(!d){
        d="";
    }
    else d=d[0];
    if(!t){
        t="";
    }
    else t=t[0];
    if(!(d+t)) return;
    addexclude(d,t);
}

function timeEncode(d,t){
    var a=[];
    var x="-";
    if(t) x=t;
    x=x.split("-");
    if(!x[0]) x[0]="6:00A";
    if(!x[1]) x[1]="11:00P";
    a.push(parsetime(x[0]));
    a.push(parsetime(x[1]));
    var y="MTWRFS";
    if(d) y=d;
    a.push(/M/.test(y));
    a.push(/T/.test(y));
    a.push(/W/.test(y));
    a.push(/R/.test(y));
    a.push(/F/.test(y));
    a.push(/S/.test(y));
    return a;
}

function timecodeintersect(k,a){
    var x=timeencodes[k];
    if(!x.length) gettimeencodes(x,k);
    for(var i=0;i<x.length;i++){
        if(timeintersect(x[i],a)) return true;
    }
    return false;
}

function timeintersect(a,b){
    if(a[0]>b[1]) return false;
    if(b[0]>a[1]) return false;
    for(var i=2;i<a.length;i++){
        if(a[i]&&b[i]) return true;
    }
    return false;
}

function gettimeencodes(x,k){
    var t=times[k].split(" ");
    for(var i=1;i<t.length;i=i+2){
        x.push(timeEncode(t[i],t[i+1]));
    }
}

function gettimeintersects(a){
    var x=[];
    for(var i=0;i<timeencodes.length;i++){
        if(timecodeintersect(i,a)) x.push(i);
    }
    return x;
}

function addexclude(d,t){
    var e=gettimeintersects(timeEncode(d,t));
    var x=document.createElement("span");
    x.setAttribute("class","exclude");
    t=t.replace(/P/g,"PM");
    t=t.replace(/A/g,"AM");
    d=d.replace(/R/g,"TH");
    var y=d;
    if(y) y+=" ";
    y+=t;
    x.appendChild(document.createTextNode(y.trim()));
    var id="ex"+nexclude;
    nexclude++;
    x.setAttribute("id",id);
    if(e.length) x.setAttribute("extc",e.join(","));
    hideExclude(id,e);
    x.onclick=function(e){removeExclude(e);};
    x.setAttribute("onmouseover","Tip('Click to remove this exclusion',FONTSIZE,'16pt');");
    x.setAttribute("onmouseout", "UnTip()");
    var c=document.getElementById("exclusions");
    var r;
    if(!c.firstChild){
        c.appendChild(document.createTextNode("Excluded: "));
        r=getCSSRule("#bottom");
        r.style.top="40px";
    }
    c.appendChild(x);
    c.appendChild(document.createTextNode(" "));
    excludes.push(x);
    setHeaderHeight();
}

function hideExclude(id,e){
    var c=document.getElementById("courses");
    c.setAttribute(id,"1");
    var h=e;
    var g;
    for(var i=0;i<h.length;i++){
        g=addCSSRule('#bottom #courses['+id+'] .course span[hide*="('+h[i]+')"][avail][loc]');
        g.style.display="none";
        //g.style.textDecoration="blink";
    }
}

function removeExclude(e){
    var x=e;
    if(x.target) x=x.target;
    var c=document.getElementById("courses");
    c.removeAttribute(x.id);
    var t=x.getAttribute("extc");
    if(!t) return;
    var h=t.split(",");
    for(var i=0;i<h.length;i++){
        killCSSRule('#courses['+x.id+'] .course span[hide*="('+h[i]+')"][avail][loc]');
    }
    var w=x.parentNode;
    x.parentNode.removeChild(x.nextSibling);
    x.parentNode.removeChild(x);
    var r;
    if(w.firstChild==w.lastChild){
        w.removeChild(w.firstChild);
        r=getCSSRule("#bottom");
        r.style.top="25px";
    }
    excludes.splice(excludes.indexOf(x),1);
    setHeaderHeight();
}

function setImpossibles(y){
    var id=y.id;
    var k=impossiblecourses.indexOf(id);
    var imp="";
    if(k>-1) imp+=impossibles[k];
    var t=y.getAttribute("twin");
    if(t){
        k=impossiblecourses.indexOf(t);
        if(k>-1) imp+=impossibles[k];
    }
    if(imp) y.setAttribute("impossible",imp);
}

function hideImpossibles(x){
    var g=addCSSRule('body #bottom #courses['+x.id+'] table.course[impossible*="'+x.id+'"]');
    //g.style.visibility="collapse";
    g.style.display="none";
    var imp=x.getAttribute("impossible");
    if(!imp) return;
    imp=imp.split(";");
    imp.pop();
    for(var i=0;i<imp.length;i++){
        g=addCSSRule('body #bottom #courses['+x.id+'] table#'+imp[i]);
        g.style.display="none";
    }
}

function removeImpossibles(x){
    killCSSRule('body #bottom #courses['+x.id+'] table.course[impossible*="'+x.id+'"]');
    var imp=x.getAttribute("impossible");
    if(!imp) return;
    imp=imp.split(";");
    imp.pop();
    for(var i=0;i<imp.length;i++){
        killCSSRule('body #bottom #courses['+x.id+'] table#'+imp[i]);
    }
}

function reset(){
    while(selections.length){
        select(selections[0]);
    }
    while(possibles.length){
        possible(possibles[0]);
    }
    while(excludes.length) removeExclude(excludes[0]);
    var id=document.getElementById("stid");
    var ln=document.getElementById("stlname");
    var fn=document.getElementById("stfname");
    var mn=document.getElementById("stmname");
    id.value="";
    fn.value="";
    ln.value="";
    mn.value="";
    updateStudent();
    getDefaults();
    $('premajors').selectedIndex=0;
    changepremajor();
}

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

if (/msie/i.test (navigator.userAgent)) //only override IE
{
	document.nativeGetElementById = document.getElementById;
	document.getElementById = function(id)
	{
		var elem = document.nativeGetElementById(id);
		if(elem)
		{
			//make sure that it is a valid match on id
			if(elem.id == id)
			{
				return elem;
			}
			else
			{
				//otherwise find the correct element
				for(var i=1;i<document.all[id].length;i++)
				{
					if(document.all[id][i].id == id)
					{
						return document.all[id][i];
					}
				}
			}
		}
		return null;
	};
}

Array.prototype.push = function() {
    var n = this.length >>> 0;
    for (var i = 0; i < arguments.length; i++) {
	this[n] = arguments[i];
	n = n + 1 >>> 0;
    }
    this.length = n;
    return n;
};

Array.prototype.pop = function() {
    var n = this.length >>> 0, value;
    if (n) {
	value = this[--n];
	delete this[n];
    }
    this.length = n;
    return value;
};

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
};

function fitToScreen(){
    var c=document.getElementById("courses");
    var b=document.body;
    var l=200;
    var p=50;
    var m;
    do{
        m=(l+p)/2;
        c.style.fontSize=m+"%";
        if(b.clientHeight<b.scrollHeight){
            l=m;
        }
        else{
            p=m;
        }
    }while(l-p>1);
}

function setSize(p){
    fontsize+=p;
    var b=document.getElementById("bottom");
    b.style.fontSize=fontsize+"%";
}

function showdim(){
    var b=document.body;
    var c=document.getElementById("courses");
    alert("bodyclient="+b.clientWidth+"x"+b.clientHeight+" bodyscroll="+b.scrollWidth+"x"+b.scrollHeight+
          " courseclient="+c.clientWidth+"x"+c.clientHeight+" coursescroll="+c.scrollWidth+"x"+c.scrollHeight);
}

function maximize(){
    var x=document.getElementById("courses");
    var a=document.getElementById("advise");
    var s=document.getElementById("showall");
    if(x.getAttribute("class")){
        x.removeAttribute("class");
        s.removeAttribute("class");
        a.setAttribute("class", "hidden");
    }
    else{
        x.setAttribute("class","maximize");
        a.removeAttribute("class");
        s.setAttribute("class", "hidden");
    }
}

function $(id) {return document.getElementById(id);}

function getDefaults(){
    fontsize2=1*readCookie('fontsize');
    if(!fontsize2) fontsize2=100;
    setSize(fontsize2-fontsize);
    ncolumns2=1*readCookie('ncolumns');
    if(!ncolumns2) ncolumns2=14;
    setColumns(ncolumns2-ncolumns);
    adviser=readCookie('adviser');
    var x=$('adviser');
    x.value=adviser;
    var y=['asut','nasut','ndc','int','occ','mc','fader','usr'];
    var k;
    x=document.body;
    for(var i=0;i<y.length;i++){
        k=1*readCookie(y[i]);
        if(!k) k=1;
        if(k%2){
            x.setAttribute(y[i],"1");
        }
        else x.removeAttribute(y[i]);
    }
    x=$('courses');
    k=1*readCookie('maximize');
    if(!k) k=1;
    k=k%2;
    k+=(1*readCookie('enrollment'))%2;
    setdisplaymode(k);
    k=1*readCookie('savestyle');
    setfilename(k);
    k=readCookie("filter");
    if(k){
        userfilter=k;
    }
    //alert('setuserfilter');
    setuserfilter();
    setDefaults();
}

function setDefaults(b){
    createCookie('fontsize',fontsize,365);
    createCookie('ncolumns',ncolumns,365);
    var x=$('adviser');
    adviser=x.value;
    createCookie('adviser',adviser,365);
    var y=['asut','nasut','ndc','int','occ','mc','fader','usr'];
    var k;
    x=document.body;
    for(var i=0;i<y.length;i++){
        k=1*x.getAttribute(y[i]);
        if(!k) k=2;
        createCookie(y[i],k,365);
    }
    x=$('courses');
    if(x.getAttribute("class")){
        k=1;
    }
    else k=2;
    createCookie('maximize',k,365);
    if(x.getAttribute("enrollment")){
        k=1;
    }
    else k=2;
    createCookie('enrollment',k,365);
    createCookie('savestyle',savebyid,365);
    getfilter();
    createCookie('filter',userfilter,365);
    if(b) alert('Your current settings have been saved as the default settings.');
}

function createCookie(name,value,days) {
        var expires;
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		expires = "; expires="+date.toGMTString();
	}
	else expires = "";
	document.cookie = name+"="+value+expires+"; path=/advising";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function setfilename(x){
    savebyid=x;
    updateStudent();
    var y=$("savebyid");
    y.selectedIndex=x;
}

function savechange(){
    setfilename(1-savebyid);
}

function insertfilter(y,u){
    var f=$("coursefilter");
    var w=document.createElement("div");
    w.setAttribute("on","1");
    w.setAttribute("id","f"+y.getAttribute("id"));
    var v=y.firstChild.firstChild.firstChild.firstChild.cloneNode(true);
    w.onclick=switchfilter;
    w.appendChild(v);
    var uf;
    if(u){
        uf=$("f"+u.getAttribute("id"));
        f.insertBefore(w,uf);
    }
    else f.appendChild(w);
}

function switchfilter(evt){
    var x=evt.target;
    while(!x.getAttribute("on")) x=x.parentNode;
    var y=1-1*x.getAttribute("on");
    x.setAttribute("on",y);
}

function changedisplay(evt){
    var x=$("displaymode");
    var k=x.selectedIndex;
    setdisplaymode(k);
}

function setdisplaymode(k){
    var x=$("displaymode");
    var j=x.selectedIndex;
    if(k!=j) x.selectedIndex=k;
    if(displaymode==4){
        setfilter();
    }
    displaymode=k;
    var c=$("courses");
    var b=$("bottom");
    switch(k){
        case 0:
            c.removeAttribute("enrollment");
            c.removeAttribute("class");
            b.removeAttribute("editfilter");
            c.removeAttribute("closed");
            break;
        case 1:
            c.removeAttribute("enrollment");
            c.setAttribute("class", "maximize");
            b.removeAttribute("editfilter");
            c.removeAttribute("closed");
            break;
        case 2:
            c.setAttribute("class", "maximize");
            c.setAttribute("enrollment", "1");
            b.removeAttribute("editfilter");
            c.removeAttribute("closed");
            break;
        case 3:
            c.setAttribute("class", "maximize");
            c.removeAttribute("enrollment");
            b.removeAttribute("editfilter");
            c.setAttribute("closed","1");
            break;
        default:
            b.setAttribute("editfilter","1");
            break;
    }
}

function setfilter(){
    var x=$("coursefilter");
    var w=x.firstChild;
    var id;
    while(w){
        id=w.getAttribute("id").substr(1);
        $(id).setAttribute("filter",w.getAttribute("on"));
        w=w.nextSibling;
    }
}

function setuserfilter(){
    if(userfilter.charAt(0)=="u"){
        setuserfilternew();
        return;
    }
    var x=$("coursefilter");
    var w=x.firstChild;
    var id;
    var f=userfilter;
    while(w){
        id=w.getAttribute("id").substr(1);
        if(f.indexOf(id)<0){
            w.setAttribute("on","1");
        }
        else w.setAttribute("on","0");
        w=w.nextSibling;
    }
    setfilter();
    userfilter="f";
    getfilter();
    createCookie('filter',userfilter,365);
}

function setuserfilternew(){
    var x=$("coursefilter");
    var w=x.firstChild;
    var id;
    var f=userfilter;
    while(w){
        id=w.getAttribute("id").substr(1)+"*";
        if(f.indexOf(id)<0){
            w.setAttribute("on","1");
        }
        else w.setAttribute("on","0");
        w=w.nextSibling;
    }
    setfilter();
}

function getfilter(){
    var x=$("coursefilter");
    var w=x.firstChild;
    var id;
    var f="u";
    var k;
    while(w){
        id=w.getAttribute("id").substr(1)+"*";
        k=userfilter.indexOf(id);
        if(1-1*w.getAttribute("on")){
            if(k<0) f+=id;
        }
        else{
            if(k>-1){
                userfilter=userfilter.substr(0,k)+userfilter.substr(k+id.length);
            }
        }
        w=w.nextSibling;
    }
    userfilter=f+userfilter.substr(1);
    //alert(userfilter);
}

function excludeFocus(){
    exclude.value="";
}

function excludeBlur(){
    exclude.value="Exclude";
}

function changepremajor(){
    var t='none';
    var y=$('premajors');
    var f;
    if(y.selectedIndex){
        f=y.options[y.selectedIndex].getAttribute('f');
        var x=createXHR();
        x.open('get','premajors/'+f+'.txt',false);
        x.send(null);
        t=x.responseText;
    }
    y=$('courses').childNodes;
    var k;
    for(var i=0;i<y.length;i++){
        f=y[i].getAttribute("id");
        k=t.indexOf(f);
        if(k>-1){
            y[i].setAttribute('premajor','1');
            if(k+f.length<t.length){
                if(t.charAt(k+f.length)=="("){
                    y[i].setAttribute('premajor',t.substr(k+f.length+1,3));
                }
            }
        }
        else y[i].removeAttribute('premajor');
    }
}

function setHeaderHeight(evt){
    if(evt){
        if(!evt.ctrlKey) return;
    }
    headercss.height=controls.clientHeight+"px";
}