// based on http://www.alistapart.com/articles/dropdowns and http://www.htmldog.com/articles/suckerfish/dropdowns/

if ((document.all) && (document.getElementById)) {	
	function MenuListElementHoverFix() {		
	var _this	= this;	
			
			if (typeof(Array.prototype.push) == 'undefined') {			// IE < 5.5 does not support push/pop			
			
				function push() {				
				var j = this.length;				
				for (var i = 0; i < push.arguments.length; ++i) {		
				this[j] = push.arguments[i];				
				j++;			
				}		
		}			
		
		function pop() {
			var i = this[this.length - 1];
			this.length--;	
			return i;
		}			
		
		Array.prototype.push	= push;		
		Array.prototype.pop		= pop;		
	}		
	this.className				= 'hover';	// change the class name to use here if you are not happy with it		
	this.classNameSuffix		= ' ' + this.className;		
	this.removeClassNameRegExp	= new RegExp("\\b ?" + this.className + "\\b");		
	this.hoverElementStack		= new Array();				
	this.onmouseover	= function() {		
		if (!_this.isHover(this)) {				
			if (this.getAttribute('is_hover_class_removing') != 'true') {					
				this.className	+= _this.classNameSuffix;				
			}				
		this.setAttribute('is_hover', 'true');			
		}		
	}		
	this.isHover	= function(element) {			
		return (element.getAttribute('is_hover') == 'true');		
	}		
	this.checkNonHoverState	= function(element) {			
		if (!_this.isHover(element)) {				
			element.className	= element.className.replace(_this.removeClassNameRegExp, '');			
		}			
		element.removeAttribute('is_hover_class_removing');	
	}		
	this.checkLastNonHoverState	= function() {			
		var hoverElement	= null;	
			if (_this.hoverElementStack.length > 0) {				
				hoverElement	= _this.hoverElementStack.pop();	
			}			
			for (var i = _this.hoverElementStack.length - 1; i >= 0; i--) {				// we need to apply the "non-hover" class to the children first - else the result is mixed in the IE		
			var o = _this.hoverElementStack[i];		
				while (o != null) {			
					o	= o.offsetParent;		
					if (o == hoverElement) {	
					_this.checkNonHoverState(_this.hoverElementStack[i]);	
					break;				
				}				
			}			
		}
		if (hoverElement != null) {				
			_this.checkNonHoverState(hoverElement);			
		}		
	}		
	this.onmouseout		= function() {			// all this mess to not change the class immediately (which would cause flickering in the IE)			
		this.setAttribute('is_hover', 'false');			
		if (this.getAttribute('is_hover_class_removing') != 'true') {		
			this.setAttribute('is_hover_class_removing', 'true');				
			_this.hoverElementStack.push(this);				
			window.setTimeout(_this.checkLastNonHoverState, 100);			
		}
	}		
	this.fixElement		= function(elementRoot) {			
		for (var i=0; i < elementRoot.childNodes.length; i++) {				
			var node = elementRoot.childNodes[i];				
				if (node.nodeName == "LI") {					
					node.onmouseover	= this.onmouseover;					
					node.onmouseout		= this.onmouseout;				
				}
				this.fixElement(node);			
			}		
		};		
		this.findElement	= function(elementRoot) {
			for (var i=0; i< elementRoot.childNodes.length; i++) {
				var node = elementRoot.childNodes[i];
					if (node.nodeName == "UL") {
						if ((node.id != '') && ((node.id.indexOf("menu") >= 0) || (node.id.indexOf("nav") >= 0))) {
							this.fixElement(node);						continue;	// do not iterate through children of already fixed element
						}
					}				
					this.findElement(node);			
				}
			};		
			this.fix			= function() {			
				var node = document.body;			
					if (node) {				
						_this.findElement(node);			
					}		
				}		
				this.addOnLoad		= function() {			
					if (window.attachEvent) {
						window.attachEvent("onload", this.fix);			
					} else {
						window.onload	= this.fix;			
					}
				}	
			}	
			(new MenuListElementHoverFix()).addOnLoad();
			}