function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}


/*
 * Sub Nav Functions
 * -------------------------------------------
 *
 */
 /* CLOSED_IMAGE - the image to be displayed when the sublists are closed
 * OPEN_IMAGE   - the image to be displayed when the sublists are opened
 */
CLOSED_IMAGE = "/public/images/plus.gif";
OPEN_IMAGE   = "/public/images/minus.gif";
BLANK_IMAGE  = "/public/images/expander_blank.gif";



function processSubNavs()
{
	var subNavs = getElementsByClassName(document, 'div', 'subNavContainer');
	for (i = 0; i < subNavs.length; i++) {
		initSubNav(subNavs[i]);
	} // End loop
} // End fun



function getElementsByClassName(oElm, strTagName, strClassName)
{
  var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
	 var arrReturnElements = new Array();
	 strClassName = strClassName.replace(/\-/g, "\\-");
	 var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	 var oElement;
	 for(var i=0; i<arrElements.length; i++){
	   oElement = arrElements[i];
	   if(oRegExp.test(oElement.className)){
	     arrReturnElements.push(oElement);
	   }
	 }
	 return (arrReturnElements)
} // End func



function initSubNav(subNav)
{
	// Get the first UL element
	var children = subNav.childNodes;
	
	for (i = 0; i < children.length; i++) {
		child = children[i];
		if (child.tagName == 'UL') {
			makeCollapsible(child, true);
			break;
		}
	} // End loop	
} // End func



function makeCollapsible(listElement, isRootList)
{
	isRootList = isRootList ? true : false;
	
	
	var child = listElement.firstChild;
	// loop over all child elements of the list
	while (child != null) {
		
		// only process li elements (and not text elements)
		if (child.tagName == 'LI') {
		  var mustKeepOpen = false;
		  
		  // build a list of child ol and ul elements and hide them
		  var list = new Array();
		  var grandchild = child.firstChild;
		  while (grandchild != null) {
			if (grandchild.tagName == 'OL' || grandchild.tagName == 'UL') {
			  mustKeepOpen = listHasActiveElements(grandchild) ? true : false;
			  
			  if (!mustKeepOpen && !isRootList) {
			  	grandchild.style.display = 'none';
			  } else {
			  	grandchild.style.display = 'block';
			  }
			  list.push(grandchild);
			  makeCollapsible(grandchild);
			}
			grandchild = grandchild.nextSibling;
		  } // End loop
		  
		  // add toggle buttons
		  var node = document.createElement('img');
		  if ( hasChildLists(child) && !isRootList ) {
			  if (mustKeepOpen || isRootList) {
				node.setAttribute('src', OPEN_IMAGE);
				node.setAttribute('class','collapsibleOpen');
			  } else {
				node.setAttribute('src', CLOSED_IMAGE);
				node.setAttribute('class','collapsibleClosed');
			  }
			  node.onclick = createToggleFunction(node, list);
			  child.insertBefore(document.createTextNode(' '), child.firstChild);
			  child.insertBefore(node, child.firstChild);
		  } else if (!isRootList) {
		  	  node.setAttribute('src', BLANK_IMAGE);
			  node.setAttribute('class','collapsibleBlank');
			  child.insertBefore(document.createTextNode(' '), child.firstChild);
			  child.insertBefore(node, child.firstChild);
		  }

		  
		  
		} // End if
		
		child = child.nextSibling;
		
	} // End loop

} // End func



function listHasActiveElements(listEl)
{
	var hasActive = false;
	var child = listEl.firstChild;
	
	while (child != null) {
		if (child.tagName == 'LI') {
			var liChildren = child.childNodes;
			for (i = 0; i < liChildren.length; i++) {
				var tmpEl = liChildren[i];
				if (tmpEl.tagName == 'A' && tmpEl.className == 'active') {
					hasActive = true;
				}
			} // End loop
		}
		child = child.nextSibling;
	} // End loop
	
	return hasActive;
} // End func



function hasChildLists(element)
{
	var hasChildLists = false;
	var child = element.firstChild;
	
	while (child != null) {
		if (child.tagName == 'UL') {
			hasChildLists = true;
			break;
		}
		child = child.nextSibling;
	} // End loop
	
	return hasChildLists;
} // End func



/* createToggleFunction - returns a function that toggles the sublist display
 * 
 * toggleElement  - the element representing the toggle gadget
 * sublistElement - an array of elements representing the sublists that should
 *                  be opened or closed when the toggle gadget is clicked
 */
function createToggleFunction(toggleElement, sublistElements)
{

  return function()
  {

    // toggle status of toggle gadget
    if ( toggleElement.getAttribute('class') == 'collapsibleClosed'){
      toggleElement.setAttribute('class','collapsibleOpen');
      toggleElement.setAttribute('src', OPEN_IMAGE);
    } else {
      toggleElement.setAttribute('class','collapsibleClosed');
      toggleElement.setAttribute('src', CLOSED_IMAGE);
    }

    // toggle display of sublists
    for (var i=0; i < sublistElements.length; i++) {
      sublistElements[i].style.display = (sublistElements[i].style.display == 'block') ? 'none' : 'block';
    } // End loop

  } // End return func

} // End func