/* Script by Scott Penrose scottp@dd.com.au http://scott.dd.com.au/ */
var toggleMenu = function() {

	// Private config
	var sHiddenClass = 'hidden';
	var sTopClass = 'showhide';
	var oRegExp = new RegExp("(^|\\s)" + sHiddenClass + "(\\s|$)");

	// Private methods

	// addEvent - general function to add an event to an existing function (e.g. on load)
	var 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]);
		}
	};

	// getElementsByClassName - general function to get all elements matching a class
	var 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)
	};

	// toggle - do the toggle
	var toggle = function(el) {
		// Recursive back until showhide
		var parentRegExp = new RegExp("(^|\\s)"+sTopClass+"(\\s|$)");
		while (! parentRegExp.test(el.className) ) {
			el = el.parentNode;
		}

		// Add/Remove class
		el.className = (oRegExp.test(el.className)) ? el.className.replace(oRegExp, '') : el.className + ' ' + sHiddenClass;
		return false;
	};

	// init - find each element and add onclick handler
	var init = function() {
		if (!document.getElementById || !document.createTextNode) {return;} // Check for DOM support

		var arrMenus = getElementsByClassName(document, '*', sTopClass);
		for (var i = 0; i < arrMenus.length; i++) {
			var next = arrMenus[i].getElementsByTagName("*");
			var el = next[0];
			// Add to the main element
			el.onclick = function() { toggle(this); return false; };
			// Add to anchor - to prevent anchor executing
			next = el.getElementsByTagName("a");
			if (next && next[0]) {
				el.onclick = function() { toggle(this); return false; };
			}
			toggle(el);
		}
	};

	// add the init event
	addEvent(window, 'load', init);

	// init - match all elemnts
	return {

		// toggleall(true) - open all, else close all
		toggleall: function(open) {
			var arrMenus = getElementsByClassName(document, '*', sTopClass);
			for (var i = 0; i < arrMenus.length; i++) {
				var el = arrMenus[i];
				if (open && oRegExp.test(el.className)) {
					el.className = el.className.replace(oRegExp, '');
				}
				else if (!open && !oRegExp.test(el.className)) {
					el.className = el.className + ' ' + sHiddenClass;
				}
			}
			return false;
		}
	};

}();
