/******************************************************************************
 File Name: coursecatalog.js
 *****************************************************************************/

/******************************************************************************
 Gobal AJAX request variables
******************************************************************************/
var xhr_getColleges;
var xhr_getDepts;
var xhr_getSections;

/******************************************************************************
 Global variables
******************************************************************************/
var g_page = 1;
var g_navigation = 0;

/******************************************************************************
 Global ready state and HTTP variables for checking AJAX status
******************************************************************************/
var READY_STATE_UNITIALIZED = 0;
var READY_STATE_LOADING = 1;
var READY_STATE_LOADED = 2;
var READY_STATE_INTERACTIVE = 3;
var READY_STATE_COMPLETE = 4;
var HTTP_OK = 200;

/******************************************************************************
 Change element visibility functions
******************************************************************************/
function hide(elementId) { 
  document.getElementById(elementId).style.visibility = "hidden";
}

function show(elementId) {
  document.getElementById(elementId).style.visibility = "visible";
}

/******************************************************************************
 Validate the page number edit box
******************************************************************************/
var target;
function event_checkPage() 
{   
  var totalPage = document.getElementById("totalPages").innerHTML;  
  if (!target) target = document.getElementById("pageText");    
  var page = new String(target.value); 
  var myRegExp = / /g;
  page = page.replace(myRegExp, ""); //remove spaces 
  var nTotalPage = Number(totalPage); 
  var nPage = Number(page);  
  if (isNaN(nPage) == true) 
  {
  	alert("The page number you input is not a valid number! Please input again.");
  	target.focus();
    return;
  } 
  if ( (nTotalPage < nPage) || (nPage < 0) ) 
  { 
     alert("The page number you input is wrong! Please input a correct page.");
     target.focus();
     return;
  }
  if (isNaN(nPage) != true && nPage > 0) target.value = parseInt(nPage);
}

/******************************************************************************
 Navigation buttons
******************************************************************************/
function event_firstBtn()
{
	scroll(0,0);
	g_page = 1;
	document.getElementById("pageText").value = 1;
	g_navigation = 1;	
	event_setSections();
	g_navigation = 0;	
}

function event_nextBtn()
{
	scroll(0,0);
	g_page++;
	document.getElementById("pageText").value = ++document.getElementById("pageText").value;
	g_navigation = 1;	
	event_setSections();
	g_navigation = 0;
}

function event_prevBtn()
{
	scroll(0,0);
	g_page--;	
	document.getElementById("pageText").value = --document.getElementById("pageText").value;
	g_navigation = 1;	
	event_setSections();
	g_navigation = 0;
}

function event_lastBtn()
{
	scroll(0,0);
    var totalPage = document.getElementById("totalPages").innerHTML;
	g_page = totalPage;
	document.getElementById("pageText").value = g_page;
	g_navigation = 1;	
	event_setSections();
	g_navigation = 0;
}

function event_goBtn()
{
	scroll(0,0);
	if (!target) target = document.getElementById("pageText");    
	g_page = target.value; 
	g_navigation = 1;
	event_setSections();
	g_navigation = 0;	
}

/******************************************************************************
 Change the status of the navigation buttons
******************************************************************************/
function changeBtnsStatus()
{
	var totalPage = document.getElementById("totalPages").innerHTML;
	
	if (Number(g_page) <= 1)
	{
		document.getElementById("firstBtn").disabled = true;
		document.getElementById("prevBtn").disabled = true;
		document.getElementById("nextBtn").disabled = false;
		document.getElementById("lastBtn").disabled = false;
	}
	else if (Number(g_page) >= Number(totalPage))
	{	
		document.getElementById("firstBtn").disabled = false;
		document.getElementById("prevBtn").disabled = false;
		document.getElementById("nextBtn").disabled = true;
		document.getElementById("lastBtn").disabled = true;
	}
	else
	{	
		document.getElementById("firstBtn").disabled = false;
		document.getElementById("prevBtn").disabled = false;
		document.getElementById("nextBtn").disabled = false;
		document.getElementById("lastBtn").disabled = false;
	}
}

/******************************************************************************
 tool tip 
******************************************************************************/
var dom = (document.getElementById) ? true : false;
var ns5 = ((navigator.userAgent.indexOf("Gecko")>-1) && dom) ? true: false;
var ie5 = ((navigator.userAgent.indexOf("MSIE")>-1) && dom) ? true : false;
var ns4 = (document.layers && !dom) ? true : false;
var ie4 = (document.all && !dom) ? true : false;
var nodyn = (!ns5 && !ns4 && !ie4 && !ie5) ? true : false;

// resize fix for ns4
var origWidth, origHeight;
if (ns4) {
	origWidth = window.innerWidth; origHeight = window.innerHeight;
	window.onresize = function() { if (window.innerWidth != origWidth || window.innerHeight != origHeight) history.go(0); }
}

// avoid error of passing event object in older browsers
if (nodyn) { event = "nope" }

///////////////////////  CUSTOMIZE HERE   ////////////////////
// settings for tooltip 
// Do you want tip to move when mouse moves over link?
var tipFollowMouse= true;	
// Be sure to set tipWidth wide enough for widest image
var tipWidth= 160;
var offX= 20;	// how far from mouse to show tip
var offY= 12; 
var tipFontFamily= "Verdana, arial, helvetica, sans-serif";
var tipFontSize= "8pt";
// set default text color and background color for tooltip here
// individual tooltips can have their own (set in messages arrays)
// but don't have to
var tipFontColor= "#000000";
var tipBgColor= "#DDECFF"; 
var tipBorderColor= "#000000";
var tipBorderWidth= 1;
var tipBorderStyle= "ridge";
var tipPadding= 4;

// tooltip content goes here (image, description, optional bgColor, optional textcolor)
var messages = new Array();

// multi-dimensional arrays containing: 
// image and text for tooltip
// optional: bgColor and color to be sent to tooltip
messages[0] = new Array('http://online.fiu.edu/images/sharing_block_1.gif','',"#FFFFFF");
messages[1] = new Array('http://online.fiu.edu/images/sharing_block_2.gif','',"#FFFFFF");


////////////////////  END OF CUSTOMIZATION AREA  ///////////////////

// preload images that are to appear in tooltip
// from arrays above
if (document.images) {
	var theImgs = new Array();
	for (var i=0; i<messages.length; i++) {
  	theImgs[i] = new Image();
		theImgs[i].src = messages[i][0];
  }
}

// to layout image and text, 2-row table, image centered in top cell
// these go in var tip in doTooltip function
// startStr goes before image, midStr goes between image and text
var startStr = '<table width="' + tipWidth + '"><tr><td align="center" width="100%"><img src="';
var midStr = '" border="0"></td></tr><tr><td valign="top">';
var endStr = '</td></tr></table>';

////////////////////////////////////////////////////////////
//  initTip	- initialization for tooltip.
//		Global variables for tooltip. 
//		Set styles for all but ns4. 
//		Set up mousemove capture if tipFollowMouse set true.
////////////////////////////////////////////////////////////
var tooltip, tipcss;
function initTip() {
	if (nodyn) return;
	tooltip = (ns4)? document.tipDiv.document: (ie4)? document.all['tipDiv']: (ie5||ns5)? document.getElementById('tipDiv'): null;
	tipcss = (ns4)? document.tipDiv: tooltip.style;
	if (ie4||ie5||ns5) {	// ns4 would lose all this on rewrites
		tipcss.width = tipWidth+"px";
		tipcss.fontFamily = tipFontFamily;
		tipcss.fontSize = tipFontSize;
		tipcss.color = tipFontColor;
		tipcss.backgroundColor = tipBgColor;
		tipcss.borderColor = tipBorderColor;
		tipcss.borderWidth = tipBorderWidth+"px";
		tipcss.padding = tipPadding+"px";
		tipcss.borderStyle = tipBorderStyle;
	}
	if (tooltip&&tipFollowMouse) {
		if (ns4) document.captureEvents(Event.MOUSEMOVE);
		document.onmousemove = trackMouse;
	}
}

//window.onload = initTip;

/////////////////////////////////////////////////
//  doTooltip function
//			Assembles content for tooltip and writes 
//			it to tipDiv

/////////////////////////////////////////////////
var t1,t2;	// for setTimeouts
var tipOn = false;	// check if over tooltip link
var block_header = "http://online.fiu.edu/images/general_sharing_blocks_";
var year;
var semester;
function doTooltip(evt, num) {
	if (!tooltip) return;
	if (t1) clearTimeout(t1);	
	if (t2) clearTimeout(t2);
	tipOn = true;	
	//set messages
	var num = num -1 ;
	
	messages[num][0] = block_header + (num+1) + "_" + semester + "-" + year + ".gif";
	//alert(messages[num][0]);
	// set colors if included in messages array
	if (messages[num][2])	var curBgColor = messages[num][2];
	else curBgColor = tipBgColor;
	if (messages[num][3])	var curFontColor = messages[num][3];
	else curFontColor = tipFontColor;
	if (ns4) {
		var tip = '<table bgcolor="' + tipBorderColor + '" width="' + 
			tipWidth + '" cellspacing="0" cellpadding="' + tipBorderWidth + 
			'" border="0"><tr><td><table bgcolor="' + curBgColor + 
			'" width="100%" cellspacing="0" cellpadding="' + tipPadding + 
			'" border="0"><tr><td>'+ startStr + messages[num][0] + midStr + 
			'<span style="font-family:' + tipFontFamily + '; font-size:' + 
			tipFontSize + '; color:' + curFontColor + ';">' + messages[num][1] + 
			'</span>' + endStr + '</td></tr></table></td></tr></table>';
		tooltip.write(tip);		
		tooltip.close();
	} else if (ie4||ie5||ns5) {
		var tip = startStr + messages[num][0] + midStr + '<span style="font-family:' + 
			tipFontFamily + '; font-size:' + tipFontSize + '; color:' + curFontColor + 
			';">' + messages[num][1] + '</span>' + endStr;
		tipcss.backgroundColor = curBgColor;
	 	tooltip.innerHTML = tip;	 	
	}
	if (!tipFollowMouse) positionTip(evt);
	else t1=setTimeout("tipcss.visibility='visible'",100);
}

var mouseX, mouseY;
function trackMouse(evt) {
	mouseX = (ns4||ns5)? evt.pageX: window.event.clientX + document.body.scrollLeft;
	mouseY = (ns4||ns5)? evt.pageY: window.event.clientY + document.body.scrollTop;
	if (tipOn) positionTip(evt);
}

/////////////////////////////////////////////////////////////
//  positionTip function
//		If tipFollowMouse set false, so trackMouse function
//		not being used, get position of mouseover event.
//		Calculations use mouseover event position, 
//		offset amounts and tooltip width to position
//		tooltip within window.
/////////////////////////////////////////////////////////////
function positionTip(evt) {
	if (!tipFollowMouse) {
		mouseX = (ns4||ns5)? evt.pageX: window.event.clientX + document.body.scrollLeft;
		mouseY = (ns4||ns5)? evt.pageY: window.event.clientY + document.body.scrollTop;
	}
	// tooltip width and height
	var tpWd = (ns4)? tooltip.width: (ie4||ie5)? tooltip.clientWidth: tooltip.offsetWidth;
	var tpHt = (ns4)? tooltip.height: (ie4||ie5)? tooltip.clientHeight: tooltip.offsetHeight;
	// document area in view (subtract scrollbar width for ns)
	var winWd = (ns4||ns5)? window.innerWidth-20+window.pageXOffset: document.body.clientWidth+document.body.scrollLeft;
	var winHt = (ns4||ns5)? window.innerHeight-20+window.pageYOffset: document.body.clientHeight+document.body.scrollTop;
	// check mouse position against tip and window dimensions
	// and position the tooltip 
	if ((mouseX+offX+tpWd)>winWd) 
		tipcss.left = (ns4)? mouseX-(tpWd+offX): mouseX-(tpWd+offX)+"px";
	else tipcss.left = (ns4)? mouseX+offX: mouseX+offX+"px";
	if ((mouseY+offY+tpHt)>winHt) 
		tipcss.top = (ns4)? winHt-(tpHt+offY): winHt-(tpHt+offY)+"px";
	else tipcss.top = (ns4)? mouseY+offY: mouseY+offY+"px";
	if (!tipFollowMouse) t1=setTimeout("tipcss.visibility='visible'",100);
}

function hideTip() {
	if (!tooltip) return;
	t2=setTimeout("tipcss.visibility='hidden'",100);
	tipOn = false;
}


/******************************************************************************
 Function to get a browser independent XMLHttpRequest object
******************************************************************************/
function getXMLHttpRequest() {
    var xhr = null;
	if (window.XMLHttpRequest) {
		// Mozilla/Safari
		xhr = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		// IE
		xhr = new ActiveXObject("MicroSoft.XMLHTTP");
	}
    return xhr;
}


/******************************************************************************
 Beginning of AJAX event handlers
******************************************************************************/

/******************************************************************************
 Fuction called when application is started
******************************************************************************/
function event_setColleges() {  
  formLockField("collegeMenu");
  clearSelect("collegeMenu");
  formLockField("deptMenu");
  clearSelect("deptMenu");
  clearDiv("results_metadata"); 
  clearDiv("table_data");
  hide("navigation");
  
  // XHR for colleges  
  xhr_getColleges = getXMLHttpRequest();
  xhr_getColleges.onreadystatechange = callback_getColleges;
  xhr_getColleges.open("POST",AJAX_SERVLET,true);
  xhr_getColleges.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
  xhr_getColleges.send("LIST=COLLEGES&" + getFormDataParams());
  
  event_setDepts();
}

/******************************************************************************
 Fuction called when a college is selected from the college dropdown menu
******************************************************************************/
function event_setDepts() { 
  clearDiv("results_metadata"); 
  clearDiv("table_data");  
  hide("navigation");
  
  // XHR for departments  
  xhr_getDepts = getXMLHttpRequest();
  xhr_getDepts.onreadystatechange = callback_getDepts;
  xhr_getDepts.open("POST",AJAX_SERVLET,true);
  xhr_getDepts.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
  xhr_getDepts.send("LIST=DEPTS&" + getFormDataParams() );
}

/******************************************************************************
 Fuction called when the search button is clicked from the form
******************************************************************************/
function event_setSections() { 
  clearDiv("results_metadata"); 
  clearDiv("table_data");  
  if (Number(g_navigation) != 1)
  {
     g_page = 1;
     document.getElementById("pageText").value = 1;
  }
  
  // XHR for sections  
  xhr_getSections = getXMLHttpRequest();
  xhr_getSections.onreadystatechange = callback_getSections;
  xhr_getSections.open("POST",AJAX_SERVLET,true);
  xhr_getSections.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
  xhr_getSections.send("LIST=SECTIONS&" + getFormDataParams() + "&PAGE=" + g_page);
}

/******************************************************************************
 Function called when the number of results per page combo box is changed 
******************************************************************************/
function event_changeNum()
{
	g_page = 1;
	formLockField("searchBtn");
	event_setSections();
	if (!target) target = document.getElementById("pageText");      	
	if (target)
	{
		target.value = 1;	
		changeBtnsStatus();
	}
}

/******************************************************************************
 Beginning of AJAX call-back state handlers
/******************************************************************************/

/******************************************************************************
 Function for updating college dropdown menu 
 after receiving data from AJAX servlet
******************************************************************************/
function callback_getColleges()  {  
  // Show object is updating if the ready state is loading
  if (xhr_getColleges.readyState == READY_STATE_LOADING) {
    showSelectUpdating("collegeMenu");
  }
  // Handle results if the ready state is complete
  if (xhr_getColleges.readyState == READY_STATE_COMPLETE) {
    if (xhr_getColleges.status == HTTP_OK) {
      fillSelect("collegeMenu", xhr_getColleges.responseXML, true);
      formUnlockField("collegeMenu");
    } else {
      error("Failed to retrieve college list:" + xhr_getColleges.status);
    }
  }
}

/******************************************************************************
 Function for updating department dropdown menu after 
 receiving data from AJAX servlet
******************************************************************************/
function callback_getDepts()  {  
  // Show object is updating if the ready state is loading
  if (xhr_getDepts.readyState == READY_STATE_LOADING) {
    showSelectUpdating("deptMenu");
  }
  // Handle results if the ready state is complete
  if (xhr_getDepts.readyState == READY_STATE_COMPLETE) {
    if (xhr_getDepts.status == HTTP_OK) {
      fillSelect("deptMenu", xhr_getDepts.responseXML, true);
      formUnlockField("deptMenu");	      
    } else {
      error("Failed to retrieve department list:" + xhr_getDepts.status);
    }
  }
}

/******************************************************************************
 Function for updating section table data after 
 receiving data from AJAX servlet
******************************************************************************/
function callback_getSections()  {  
  // Show object is updating if the ready state is loading
  if (xhr_getSections.readyState == READY_STATE_LOADING) {
    showDivUpdating("table_data");
  }
 // Handle results if the ready state is complete
  if (xhr_getSections.readyState == READY_STATE_COMPLETE) { 
    if (xhr_getSections.status == HTTP_OK) {      
      createTableData( xhr_getSections.responseXML );        
      changeBtnsStatus();
      formUnlockField("searchBtn");
    } else { 
      error("Failed to retrieve setion data:" + xhr_getSections.status);
    }
  }
}

/******************************************************************************
 Beginning of DHTML functions
******************************************************************************/

/******************************************************************************
 Function to show specific select list as updating
******************************************************************************/
function showSelectUpdating(id) {
  var list = document.getElementById( id )
  list.options.length = 0
  list.options[0] = new Option("Updating list ...", "UPDATE");
}

/******************************************************************************
 Function to show specific element as updating
******************************************************************************/
function showDivUpdating(divName) {
  var list = document.getElementById(divName);
  list.innerHTML="Updating data ... please wait";
}

/******************************************************************************
 Function to show how many results found
******************************************************************************/
function showDivResults(divName, total) {
  var list = document.getElementById(divName);
  if (Number(total) < 1)
  {
     list.style.color = "red";
     list.innerHTML = "Sorry, no result found."
  } 
  else
  {
     list.style.color = "black";
     list.innerHTML = total + " results found";
  }
}

/******************************************************************************
 Function to create the table data from the XML document
******************************************************************************/
function createTableData(xmlDoc) {//results table
   var divHtml = "<table class='dataTable' cellpadding='2' cellspacing='2'><tr>";
   var xmlRoot = xmlDoc.getElementsByTagName("resultset")[0];
   var location = new Array();
   
   if (xmlRoot) 
   {
   	  var hasResults = 0;
   	  for(var i=0;i<xmlRoot.childNodes.length;i++) 
   	  {
         row = xmlRoot.childNodes[i];    
         if (row.nodeName=="row") {
            hasResults = 1;
            break;
         }
      }
      
      if (hasResults == 1) { //has results 
         for(var i=0;i<xmlRoot.childNodes.length;i++) {
		    var header = xmlRoot.childNodes[i];	    
		    if (header.nodeName=="header") {		    	
		       for (var a=0; a<header.childNodes.length;a++) {		    	
		          column = header.childNodes[a];		          
		          if (column.nodeName=="column") {
		             if (column.firstChild.nodeValue == 'COURSE TITLE') {		            		            	
			            location["COURSE TITLE"] = a;			           
		             }
		             if (column.firstChild.nodeValue == 'CREDIT') {		            		            	
			            location["CREDIT"] = a;			           
		             }		            
		             if (column.firstChild.nodeValue == 'RELEASE') {	
		                location["RELEASE"] = a;	            	
			            continue;
		             }
		             if (column.firstChild.nodeValue == 'WELCOME PAGE') {
			            location["WELCOME PAGE"] = a;		            	
			            continue;
		             }
		             if (column.firstChild.nodeValue == 'BLOCK') {
			            location["BLOCK"] = a;
		             }
		             if (column.firstChild.nodeValue == 'TIME') {
			            location["TIME"] = a;
		             }
		             if (column.firstChild.nodeValue == 'REGISTER') {
			            location["REGISTER"] = a;
		             }		           
		            
		             if (column.firstChild) {	                
	                    divHtml += "<th class='blue_background' nowrap style='padding: 2px'>";
	                	divHtml += column.firstChild.nodeValue;
		             } else {
		             	divHtml += "<th class='blue_background' style='padding: 2px'>";
		                divHtml += "";//"null";
		             }
		             divHtml += "</th>";
		          } //if
		       } //for (var a)
        	   
        	   divHtml += "</tr>"
        	   break;
        	} //if (header)
        	
         } //for (var i)
      } //if (hasResults)    
     
      var parity = 0;
      for(var i=0;i<xmlRoot.childNodes.length;i++) {
         row = xmlRoot.childNodes[i];    
         if (row.nodeName=="row") {                      
            divHtml += "<tr>";
            for (var a=0; a<row.childNodes.length;a++) {
               column = row.childNodes[a];
               if (column.nodeName=="column") { 
                  if (a ==  location["COURSE TITLE"]) {
                      if (parity % 2 == 0) divHtml += "<td class='list-row-even' align='left'>";
	                  else divHtml += "<td class='list-row-odd' align='left'>";
                  } else if (a ==  location["TIME"]) {
                  	  if (parity % 2 == 0) divHtml += "<td class='list-row-even' align='center' width='30px'>";
	                  else divHtml += "<td class='list-row-odd' align='center' width='30px'>"; 
                  } else {                            
	                  if (parity % 2 == 0) divHtml += "<td class='list-row-even' align='center'>";
	                  else divHtml += "<td class='list-row-odd' align='center'>";
                  }
                  if (column.firstChild) 
                  {   
	                 if (a ==  location["CREDIT"]) {
	                 	var credit = column.firstChild.nodeValue;
	                 	var temp = new Array();
						temp = credit.split(' ');
						if (temp[0] == temp[2]) {
							divHtml += temp[0];
						} else {
							divHtml += temp[0];
							divHtml += '-';
							divHtml += temp[2];
						}
	                 }
	                         	             	          
                     else if (a ==  location["COURSE TITLE"]) 
                     { //course title, add welcome page link on it
              	        while (true) {
              	           if (a ==  location["RELEASE"]) 		
              		          break;              		
              		       a++;
              	        }
              	        var release = row.childNodes[a];
              	        while (true) 
              	        {
				           if (a == location["WELCOME PAGE"]) 				
					          break;					
					        a++;
				        }               	             
              	        if (release.firstChild && Number(release.firstChild.nodeValue) == 1) 
              	        { //released   
	              	        if (row.childNodes[a].firstChild) { 				      	
		                       divHtml += "<a href='";              		              
		              	       divHtml += row.childNodes[a].firstChild.nodeValue;
		              	       divHtml += "' target='_blank' class='content_link'> <span>";		              
		              	       divHtml += column.firstChild.nodeValue; 
		              	       divHtml += "</span></a>";
		              	    }
              	        } else divHtml += column.firstChild.nodeValue;               	     
                     } 
                     else if (a == location["BLOCK"]) 
                     {                     	                	
                     	year = getSelectedOption("yearMenu"); //yearObj.getAttribute("value");
                     	semester = getSelectedOption("semesterMenu"); //semesterObj.getAttribute("value");                     		
                     	                    	
                     	var block = column.firstChild.nodeValue;
                        var url = "http://online.fiu.edu/general_sharing_blocks_" + block + "_" + semester + "-" + year +".html";
                     	divHtml += "<a href='";
                     	divHtml += url;
                     	divHtml += "' ";                      
                     	divHtml += "onmouseover='doTooltip(event, ";
                     	divHtml += block;
                     	divHtml += ");'";                     	
                     	divHtml += " onmouseout='hideTip();'";                     	
                     	divHtml += " target='_blank' class='content_link'>";
                     	divHtml += block; 
                     	divHtml += "</a>";                     	
                     }
                     else if (a == location["REGISTER"]) 
                     {
                     	if (row.childNodes[a].firstChild) {
	                     	divHtml += "<a href='"; 
	                     	divHtml += row.childNodes[a].firstChild.nodeValue;
	                     	divHtml += "' target='_blank' class='content_link'> <span>Register Now !</span>";
                     	}
                     }
                     else 
                     {
              	        divHtml += column.firstChild.nodeValue; 
                     }
                  } 
	              else 
	              {
	                 divHtml += "";//"null";
	              } // if (column.firstChild)
	              
                  divHtml += "</td>";
                  
               } //if (column)
            } //for (var a)
            
            divHtml += "</tr>";
            parity = parity==0?1:0; 
         } // if (row)
      }//for (var i)    
   } //if (xmlRoot)
   
   divHtml += "</table>";
   var total = 0;
   if (hasResults == 1) { //has results 
     for(var i=0;i<xmlRoot.childNodes.length;i++) {
	    var totalColumn = xmlRoot.childNodes[i];	    
	    if (totalColumn.nodeName=="total") {		    	
	       for (var a=0; a<totalColumn.childNodes.length;a++) {		    	
	          column = totalColumn.childNodes[a];		          
	          if (column.nodeName=="column") 
	              total = column.firstChild.nodeValue;
	       } //for       	  
    	} //if (total)
     } //for (var i)
   } //if (xmlRoot.childNodes.length)
   
   showDivResults("results_metadata", total);
   
   var num = getSelectedOption("numMenu");
   if (Number(total) > Number(num)) {   
  	 show("navigation"); 
  	 var numPerPage = getSelectedOption("numMenu");  	   	 
	 document.getElementById("totalPages").innerHTML = Math.ceil(total / numPerPage);
   } 
   else 
   {    
     hide("navigation");
    }
   document.getElementById("table_data").innerHTML = divHtml;
}

/******************************************************************************
 Function to fill a specific select object 
 from a properly formatted XML document
******************************************************************************/
function fillSelect(id, xmlResults, addAny) {
  clearSelect(id);
  var selectObj = document.getElementById(id);
  if ( selectObj ) {
    if (addAny) {
      selectObj.options[0] = new Option("All", "any"); 
    }
    var xmlRoot = xmlResults.getElementsByTagName("htmlselect")[0];
    if (xmlRoot) {
      for(var i=0; i < xmlRoot.childNodes.length; i++) {
        child = xmlRoot.childNodes[i];
        if (child.nodeName == "select") {
          attrs = child.attributes;
          selectObj.options[selectObj.length] = 
          	new Option(child.firstChild.nodeValue, attrs.getNamedItem("value").value);
        }
      } //for
    }
    if (selectObj.length==0) {
      selectObj.options[0] = new Option("Not Available", "None");
      selectObj.disabled = true;
    }
    if (selectObj.options[0]) {
      selectObj.options[0].selected = true;
    }
  } // if obj
}

/******************************************************************************
 Function to fill the year select object
******************************************************************************/
function fillYearSelect() {
   clearSelect("yearMenu");  
   var selectObj = document.getElementById("yearMenu");
   if ( selectObj ) {   
   	  var theDate = new Date();
   	  var year = theDate.getUTCFullYear();
   	  for (var i=-1; i<3; i++)
   	  {
      	selectObj.options[selectObj.length] = new Option(year-i, year-i);      
      }        
   }
   if (selectObj.length==0) {
     selectObj.options[0] = new Option("Not Available", "None");
     selectObj.disabled = true;
   }
   if (selectObj.options[0]) {
   	 var month = theDate.getMonth();   	
   	 if (month > 9) //after October
	    selectObj.options[0].selected = true;
	 else 
	 	selectObj.options[1].selected = true;
	 ///in addition, select default semester
	 var monthObj = document.getElementById("semesterMenu");
     if ( monthObj ) {
     	if (month > 9 || month < 3)
     		monthObj.options[0].selected = true;
     	else if (month >= 3 && month < 7) 
     	    monthObj.options[1].selected = true;
     	else if (month >= 7 && month <= 9) 
     	    monthObj.options[2].selected = true;
     }
   }
   selectObj.disabled = false;
}

/******************************************************************************
 Function that returns the selected option from a select object
******************************************************************************/
function getSelectedOption(objectId) {
  var obj = document.getElementById(objectId);
  var selected = "";
  for (var i = 0; i < obj.length; i++) {
    if (obj.options[i].selected == true) {
      selected = obj.options[i].value;
    }
  }
  return encodeURIComponent(selected);
}

/******************************************************************************
 Function that sets the selected option from a select object to the value
******************************************************************************/
function setSelectedOption(objectId, option) {
  var obj = document.getElementById(objectId); 
  for (var i = 0; i < obj.length; i++) {
    if (obj.options[i].value == option) {           
      obj.options[i].selected = true; 
      break;
    } else
      obj.options[i].selected = false;
  }
}

/******************************************************************************
 Function to retrieve all of the form data to send to the AJAX servlet as parameters
******************************************************************************/
function getFormDataParams() {
  var params = "COLLEGE=" + encodeURIComponent(getSelectedOption("collegeMenu")) 
    + "&DEPT=" + encodeURIComponent(getSelectedOption("deptMenu"))
    + "&MODE=" + encodeURIComponent(getSelectedOption("modeMenu"))
    + "&YEAR=" + encodeURIComponent(getSelectedOption("yearMenu"))
    + "&SEMESTER=" + encodeURIComponent(getSelectedOption("semesterMenu"))
    + "&LEVEL=" + encodeURIComponent(getSelectedOption("levelMenu"))
    + "&NUMPERPAGE=" + encodeURIComponent(getSelectedOption("numMenu"));    
  return params;
}

/******************************************************************************
 Functions to lock/unlock form objects.  Used when processing
 requests so the user doesn't try to update the field when the
 requests are not finished processing.
******************************************************************************/
function formLockField( id ) {
   document.getElementById( id ).disabled = true;
}
function formUnlockField( id ) {
   document.getElementById( id ).disabled = false;
}

/******************************************************************************
 Function to completely clear a DIV object	
******************************************************************************/
function clearDiv( id ) {
   document.getElementById( id ).innerHTML = "";
}

/******************************************************************************
 Function to completely clear a select object
******************************************************************************/
function clearSelect( id ) {
  document.getElementById( id ).options.length = 0;
  formLockField(id);
}

/******************************************************************************
 Event to completely clear a DIV object	
******************************************************************************/
function event_clearDiv() {
    clearDiv("results_metadata"); 
	clearDiv("table_data");
	hide("navigation");
}

/******************************************************************************
 Show error msg to the user
******************************************************************************/
function error(msg) {
  var logger = document.getElementById("errorMsg");  
  if (logger) {
    logger.innerHTML = "<span style='color:red'>"
      + msg + "</span><br />";
  } else {
    alert("No error showing area found! Error message is:\n" + msg);
  } 
}

/******************************************************************************
 function when the window opens
******************************************************************************/
var externCall = 0;
var g_college;
var g_dept;
var g_mode;
var g_year;
var g_semester;
var g_level;
function load(college, dept, mode, year, semester, level)
{ 
   externCall = 0;   
   event_setColleges();
   if (college != 'null') // for external call which has parameters
   {           
       externCall = 1;  
       g_college = (college=="All"?"any":college);
       g_dept = (dept=="All"?"any":dept);
       g_mode = (mode=="All"?"any":mode);
       g_year = year;
       g_semester = semester;
       g_level = (level=="All"?"any":level);     
       event_externCall();      
   }
   fillYearSelect();
   initTip();   
}

/******************************************************************************
 Event to call the catalog with parameters
******************************************************************************/
function event_externCall()
{
  clearDiv("results_metadata"); 
  clearDiv("table_data");  
  g_page = 1;
  document.getElementById("pageText").value = 1;
  
  // XHR for sections  
  xhr_getSections = getXMLHttpRequest();
  xhr_getSections.onreadystatechange = callback_externCall;
  xhr_getSections.open("POST",AJAX_SERVLET,true);
  xhr_getSections.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
  var paras = "COLLEGE="+g_college+"&DEPT="+g_dept+"&MODE="+g_mode+"&YEAR="+g_year+
  	"&SEMESTER="+g_semester+"&LEVEL="+g_level+"&NUMPERPAGE=25";
  xhr_getSections.send("LIST=SECTIONS&" + paras + "&PAGE=" + g_page);
}

/******************************************************************************
 Call back function when the call has parameters
******************************************************************************/
function callback_externCall()
{
  // Show object is updating if the ready state is loading
  if (xhr_getSections.readyState == READY_STATE_LOADING) {
    showDivUpdating("table_data");
  }
 // Handle results if the ready state is complete
  if (xhr_getSections.readyState == READY_STATE_COMPLETE) { 
    if (xhr_getSections.status == HTTP_OK) { 
      createTableData( xhr_getSections.responseXML );
      changeBtnsStatus();      
      setSelectedOption("collegeMenu", g_college);
      setSelectedOption("deptMenu", g_dept);
      setSelectedOption("modeMenu", g_mode);
      setSelectedOption("yearMenu", g_year);
      setSelectedOption("semesterMenu", g_semester);
      setSelectedOption("levelMenu", g_level);      
    } else { 
      error("Failed to retrieve setion data:" + xhr_getSections.status);
    }
  }
}

/******************************************************************************
 Init function to add event listeners to form elements
******************************************************************************/
function init() {
	document.getElementById("collegeMenu").onchange = event_setDepts;
	formLockField("deptMenu");
    document.getElementById("deptMenu").onchange = event_clearDiv;
	document.getElementById("modeMenu").onchange = event_clearDiv;
	document.getElementById("yearMenu").onchange = event_clearDiv;
	document.getElementById("semesterMenu").onchange = event_clearDiv;
	document.getElementById("levelMenu").onchange = event_clearDiv;
	document.getElementById("numMenu").onchange = event_changeNum;
	
	document.getElementById("searchBtn").onclick = event_setSections;
	document.getElementById("firstBtn").onclick = event_firstBtn;
	document.getElementById("nextBtn").onclick = event_nextBtn;
	document.getElementById("prevBtn").onclick = event_prevBtn;
	document.getElementById("lastBtn").onclick = event_lastBtn;
	document.getElementById("goBtn").onclick = event_goBtn;
	document.getElementById("pageText").onkeyup = event_checkPage;
	document.getElementById("firstBtn").disabled = true;
	document.getElementById("prevBtn").disabled = true;

	hide("navigation");
}