/* ------------------------------------------------
Philip's library of commonly used JS functions
UCSF Medical Center Learning Services, February 2007
NOTE: This file does not contain any course-specific code.
---------------------------------------------------*/


/* -------------------------------------------
For controlling page onload and unload events.
addLoadEvent fires in sequential order.
addEvent fires in random non-sequential order in IE.
useage: addLoadEvent(nameOfFunctionToRun);

addLoadEvent function by Jeremy Keith
http://www.domscripting.com
---------------------------------------------- */

function addLoadEvent(func) { 
	  var oldonload = window.onload; 
	  if (typeof window.onload != 'function') { 
	    window.onload = func; 
	  } else { 
	    window.onload = function() { 
	      oldonload(); 
	      func(); 
	    } 
	  } 
	} 
	 
function addUnloadEvent(func) { 
	  var oldonunload = window.onunload; 
	  if (typeof window.onunload != 'function') { 
	    window.onunload = func; 
	  } else { 
	    window.onunload = function() { 
	      oldonunload(); 
	      func(); 
	    } 
	  } 
	} 

/* ------------------------------------------

For easily accessing elements by class name
Written by Dustin Diaz
Copied from http://www.dustindiaz.com/getelementsbyclass/

Sample useage: getElementsByClass('foo', '*', document);
'node' and 'tag' are optinal parameters

var x = getElementsByClass('myClassName');
var x = getElementsByClass('myClassName', 'li');


var myEls = getElementsByClass('myClass');
for ( i=0;i<myEls.length;i++ ) {
	// do stuff here with myEls[i]
}

------------------------------------------ */

function getElementsByClass(searchClass,tag,node) {
	
	if(!document.getElementsByTagName) return false;
	
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


/* ---------------------------------------------------
For toggling an element's visibility via css 'display'
------------------------------------------------------ */

function toggleVisibility(id) {
	
	if(!document.getElementById) return false;
	
	var x = document.getElementById(id);
	
	if ( x.style.display != "none" ) {
		x.style.display = "none";
	}
	
	else {
		x.style.display = "";
	}
}


/* ----------------------------------------------
For inserting a new element after an existing one
Written by Jeremy Keith
http://www.domscripting.com/
------------------------------------------------- */

function insertAfter(newElement, targetElement){
	var parent = targetElement.parentNode;
	if(parent.lastChild == targetElement){
		parent.appendChild(newElement);
	} else {
		parent.insertBefore(newElement, targetElement.nextSibling);
	}
}


/* ----------------------------------------------
For searching values stored in an array (returns boolean)

Copied from 
http://andrew.hedges.name/experiments/javascript_optimization/in_array.html

Useage: 
myArray[1] = "hello";
myArray.inArray("hello")  //Returns true
------------------------------------------------- */

Array.prototype.inArray = function(search_term) {
  var i = this.length;
  if (i > 0) {
	 do {
		if (this[i] === search_term) {
		   return true;
		}
	 } while (i--);
  }
  return false;
}


/* -----------------------------------------------------------
For controlling display values of alternating table rows and
optionally highlighting rows with mouseover.

Written by Jeremy Keith
http://www.domscripting.com/

Add following code to <head> of document containing table
addLoadEvent(stripeTables);
addLoadEvent(highlightRows);
-----------------------------------------------------*/

function addClass(element,value) {
  if (!element.className) {
    element.className = value;
  } else {
    newClassName = element.className;
    newClassName+= " ";
    newClassName+= value;
    element.className = newClassName;
  }
}

// Requires CSS class "tr.odd"
function stripeTables() {
	var tbodies = document.getElementsByTagName("tbody");
	for (var i=0; i<tbodies.length; i++) {
		var odd = true;
		var rows = tbodies[i].getElementsByTagName("tr");
		for (var j=0; j<rows.length; j++) {
			if (odd == false) {
				odd = true;
			} else {
				addClass(rows[j],"odd");
				odd = false;
			}
		}
	}
}

// Requires CSS class "tr.highlight"
function highlightRows() {
  if(!document.getElementsByTagName) return false;
  var tbodies = document.getElementsByTagName("tbody");
  for (var j=0; j<tbodies.length; j++) {
		  var rows = tbodies[j].getElementsByTagName("tr");
		  for (var i=0; i<rows.length; i++) {
				rows[i].oldClassName = rows[i].className
				rows[i].onmouseover = function() {
				  addClass(this,"highlight");
				}
				rows[i].onmouseout = function() {
				  this.className = this.oldClassName
				}
		}
	}
}

//------------------------------------------

/* -----------------------------------------------------------
For controlling :hover pseudo-class on elements in IE
(suckerfish method)

Written by Patrick Griffiths and Dan Webb
http://www.htmldog.com/articles/suckerfish/dropdowns/

Renamed "ieHover" for clarity in CSS file

Add following code to <head> of document containing table
addEvent(window,'load',ieHover);

-----------------------------------------------------*/

ieHover = function() {

	if(parent.navMenuId){
		var navMenuId = parent.navMenuId;
	}
	else {
		var navMenuId = "nav";
	}

	var sfEls = document.getElementById(navMenuId).getElementsByTagName("LI");
	for (var i=0; i<sfEls.length; i++) {
		sfEls[i].onmouseover=function() {
			this.className+=" ieHover";
		}
		sfEls[i].onmouseout=function() {
			this.className=this.className.replace(new RegExp(" ieHover\\b"), "");
		}
	}
	
}