
if (!window.Node) var Node =
    {
      ELEMENT_NODE                :  1,
      ATTRIBUTE_NODE              :  2,
      TEXT_NODE                   :  3,
      CDATA_SECTION_NODE          :  4,
      ENTITY_REFERENCE_NODE       :  5,
      ENTITY_NODE                 :  6,
      PROCESSING_INSTRUCTION_NODE :  7,
      COMMENT_NODE                :  8,
      DOCUMENT_NODE               :  9,
      DOCUMENT_TYPE_NODE          : 10,
      DOCUMENT_FRAGMENT_NODE      : 11,
      NOTATION_NODE               : 12
    }

var toggleMenu = {
	init : function(sContainerClass, sHiddenClass) {
		if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support
		var arrMenus = this.getElementsByClassName(document, 'ul', sContainerClass);
		var arrSubMenus, oSubMenu, oLink;
		for (var i = 0; i < arrMenus.length; i++) {
			arrSubMenus = arrMenus[i].getElementsByTagName('ul');
			for (var j = 0; j < arrSubMenus.length; j++) {
				oSubMenu = arrSubMenus[j];
				oLink = oSubMenu.parentNode.getElementsByTagName('a')[0];
				oLink.onclick = function(){toggleMenu.toggle(this.parentNode.getElementsByTagName('ul')[0], sHiddenClass); return false;}
				this.toggle(oSubMenu, sHiddenClass);
			}
		}
	},
	init_v2 : function(sContainerClass, sHiddenClass) {
                // 1. Set class of subNavLIs so that all are hidden
                // 2. Set the onclick handler for the subNavULs to the toggle_v2 function
		if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support

                // Get the top level UL for the left nav
		var topLevelUL = this.getElementsByClassName(document, 'ul', sContainerClass);
                // Get the LIs below that
                var topLevelLIs = topLevelUL[0].childNodes;
		for (var i = 0; i < topLevelLIs.length; i++) {
                    topLevelLI = topLevelLIs[i] ;
                    if ( topLevelLI.nodeName == "LI" ) {
                        // set the onclick handler for top level LIs
                        topLevelLI.onclick = function(){toggleMenu.toggle_v2(this, sContainerClass, sHiddenClass); return false;}
                        //////alert( topLevelLI );
                        var subNavLIs = topLevelLI.getElementsByTagName('li');
		        for (var j = 0; j < subNavLIs.length; j++) {
                            subNavLI = subNavLIs[j] ;
                            this.hideElement( subNavLI, sHiddenClass );
                        }
                    }
                 }                    
	},
	get_topLevelLI_of_subnavLI : function(sContainerClass, subNavLI) {
            return subNavLI.parentNode.parentNode ;
	},
	get_body_subnav_class : function() {
            bodyNode = document.getElementsByTagName("body")[0];
            bodyClasses = bodyNode.className ;
            var classes = bodyClasses.split(" ") ;
            var regex = /^sn(.*)on$/;
            for(var j=0; j<classes.length; j+=1){
                var match = regex.exec( classes[j]);
                if ( match ) {
                    return match[1] ;
                }
            }
            return null ;
	},
	init_v3 : function(sContainerClass, sHiddenClass) {
                // 1. Set class of subNavLIs so that all are hidden except those
                //          in the section of this page
                //       A. Look at body classes to get the one of the form sn___on
                //       B. Find the matching subnav LI ( e.g. has id of sn___ )
                //       C. Find the top level LI for that subnav
                //       D. Do not hide those subnavs in that top level LI
                // 2. Set the onclick handler for the subNavULs to the toggle_v2 function
		if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support

                var bodySubNavClass = null, currentSubNavLI = null, currentTopLevelLI = null ;

                bodySubNavClass = this.get_body_subnav_class() ;
                if ( bodySubNavClass ) {
                    currentSubNavLI = document.getElementById( "sn" + bodySubNavClass ) ;
                }
                if ( currentSubNavLI ) {
                    currentTopLevelLI = this.get_topLevelLI_of_subnavLI(sContainerClass, currentSubNavLI) ;
                }

                // Get the top level UL for the left nav
		var topLevelUL = this.getElementsByClassName(document, 'ul', sContainerClass);
                // Get the LIs below that
                var topLevelLIs = topLevelUL[0].childNodes;
		for (var i = 0; i < topLevelLIs.length; i++) {
                    topLevelLI = topLevelLIs[i] ;
                    if ( topLevelLI.nodeName == "LI" ) {
                        // set the onclick handler for top level LIs
                        topLevelLI.onclick = function(){toggleMenu.toggle_v2(this, sContainerClass, sHiddenClass); return true;}
                        //////alert( topLevelLI );
                        var subNavLIs = topLevelLI.getElementsByTagName('li');
		        for (var j = 0; j < subNavLIs.length; j++) {
                            subNavLI = subNavLIs[j] ;
                            if ( currentTopLevelLI && ( topLevelLI == currentTopLevelLI ) ) {
                                this.showElement( subNavLI, sHiddenClass );
                            }
                            else {
                                this.hideElement( subNavLI, sHiddenClass );
                            }
                        }
                    }
                 }                    
	},
	toggle_v2 : function(topLevelLIClicked, sContainerClass, sHiddenClass) {

                // Toggle subNav LIs below this clicked on topLevelLI
                // Set others to hidden

		if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support

                // Get the top level UL for the left nav
		var topLevelUL = this.getElementsByClassName(document, 'ul', sContainerClass);
                // Get the LIs below that
                var topLevelLIs = topLevelUL[0].childNodes;
		for (var i = 0; i < topLevelLIs.length; i++) {
                    topLevelLI = topLevelLIs[i] ;
                    if ( topLevelLI.nodeName == "LI" ) {
                        var subNavLIs = topLevelLI.getElementsByTagName('li');
		        for (var j = 0; j < subNavLIs.length; j++) {
                           subNavLI = subNavLIs[j] ;
                           if ( topLevelLI == topLevelLIClicked ) {
                               this.toggle( subNavLI, sHiddenClass );
                           }
                           else { // hide all the other LIs
                               this.hideElement( subNavLI, sHiddenClass );
                           }
                        }
                    }
                 }

	},
	init_portal : function(sContainerClass, sHiddenClass) {
           //alert( "init portal" );
           if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support
	   var arrMenus = this.getElementsByClassName(document, 'ul', sContainerClass);
           // arrMenus should contain the top level ul in the left nav menu
           //   there really should be only one
           for (var i = 0; i < arrMenus.length; i++) {
               //alert( i ) ;
               // Get the list elements for the top level
               arrMenusListElements = arrMenus[i].getElementsByTagName('li');
	       for (var j = 0; j < arrMenusListElements.length; j++) {
                   oTopLevelListElement = arrMenusListElements[j];
                   oTopLevelListElement.onclick = function(){toggleMenu.toggle(this, sHiddenClass); return false;}
                   this.toggle(oTopLevelListElement, sHiddenClass);
               }
           }
	},
	hideElement : function(el, sHiddenClass) {
		var oRegExp = new RegExp("(^|\\s)" + sHiddenClass + "(\\s|$)");
                if (!oRegExp.test(el.className)) {
                    el.className = el.className + ' ' + sHiddenClass;
                }
	},
	showElement : function(el, sHiddenClass) {
		var oRegExp = new RegExp("(^|\\s)" + sHiddenClass + "(\\s|$)");
                if (oRegExp.test(el.className)) {
                     el.className = el.className.replace(oRegExp, '');
                }
	},
	toggle : function(el, sHiddenClass) {
		var oRegExp = new RegExp("(^|\\s)" + sHiddenClass + "(\\s|$)");
		el.className = (oRegExp.test(el.className)) ? el.className.replace(oRegExp, '') : el.className + ' ' + sHiddenClass; // Add or remove the class name that hides the element
	},
/* addEvent function from http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html */
	addEvent : function(obj, type, fn) {
		if (obj.addEventListener)
			obj.addEventListener(type, fn, false);
		else if (obj.attachEvent) {
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() {obj["e"+type+fn](window.event);}
			obj.attachEvent("on"+type, obj[type+fn]);
		}
	},
/*
Written by Jonathan Snook, http://www.snook.ca/jonathan
Add-ons by Robert Nyman, http://www.robertnyman.com
*/
	getElementsByClassName : function(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)
	}
};
toggleMenu.addEvent(window, 'load', function(){toggleMenu.init_v3('menu','hiddensubnav');}); 
/* toggleMenu.addEvent(window, 'load', function(){toggleMenu.init_v2('menu','hiddensubnav');});  */
/* toggleMenu.addEvent(window, 'load', function(){toggleMenu.init('menu','hiddensubnav');});  */
/* toggleMenu.addEvent(window, 'load', function(){toggleMenu.init_portal('menu','openleftnav');}); */
