sM = {
	addEvent: function(elm, evType, fn, useCapture) {
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},

	init: function() {
		var uls = document.getElementsByTagName('ul');
		
		for (var i=0; i<uls.length; i++) {
			if (uls[i].className.search(/\bslidingmenu\b/) < 0) {
				continue;
			}
			
			var lis = uls[i].getElementsByTagName('li');
			for (var j=0; j<lis.length; j++) {
				var node = lis[j];
				if (node.nodeName.toLowerCase() == 'li' && node.getElementsByTagName('ul').length > 0) {
					sM.addEvent(node, 'mouseover', sM.getMoverFor(node), false);
					sM.addEvent(node, 'mouseout', sM.getMoutFor(node), false);
					node.getElementsByTagName('a')[0].className += ' subheader';
					node.isIn = false;
				}
			}
		}
	},
	
	getMoutFor: function(node) {
		return function(e) { sM.mout(e, node) };
	},
	
	getMoverFor: function(node) {
		return function(e) { sM.mover(e, node) };
	},
	
	hideMenu: function(el) {
		try {
			el.clippingRectangle[2] -= 20;
			if (el.clippingRectangle[2] <= 4) {
				el.clippingRectangle[2] = 4;
				el.clippingRectangle[1] -= 20;
				if (el.clippingRectangle[1] <= 0) {
					clearInterval(el.intervalID);
					if (document.all && !window.opera) {
						el.style.clip = 'rect(auto)';
					} else {
						el.style.clip = '';
					}
					el.style.display = 'none';
					return;
				}
			}
			el.style.clip = 'rect(' + el.clippingRectangle.join('px ') + 'px)';
		}
		catch(e) {
		}
	},
	
	mout: function(e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) { return; }
		
		el.outTimeout = setTimeout(function() { sM.mout2(el); }, 300);
	},
	
	mout2: function(el) {
		for (var i=0; i<el.childNodes.length; i++) {
			var node = el.childNodes[i];
			if (node.nodeName.toLowerCase() == 'ul') {
				clearInterval(node.intervalID);
				node.intervalID = setInterval(function() { sM.hideMenu(node); }, 10);
				break;
			}
		}
		el.isIn = false;
	},		
	
	mover: function(e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) { return; }
		
		clearTimeout(el.outTimeout);
		
		if (!el.isIn) {
			for (var i=0; i<el.childNodes.length; i++) {
				var node = el.childNodes[i];
				if (node.nodeName.toLowerCase() == 'ul') {
					clearInterval(node.intervalID);
					node.clippingRectangle = [0, 0, 4, 0];
					node.style.display = 'block';
					node.savedOW = node.offsetWidth;
					node.savedOH = node.offsetHeight;
					node.style.display = 'none';
					node.intervalID = setInterval(function() { sM.showMenu(node); }, 10);
					break;
				}
			}
		}
		el.isIn = true;
	},
	
	showMenu: function (el) {
		el.clippingRectangle[1] += 20;
		if (el.clippingRectangle[1] >= el.savedOW) {
			el.clippingRectangle[1] = el.savedOW;
			el.clippingRectangle[2] += 20;
			if (el.clippingRectangle[2] > el.savedOH) {
				el.clippingRectangle[2] = el.savedOH;
				clearInterval(el.intervalID);
				if (document.all && !window.opera) {
					el.style.clip = 'rect(auto)';
				} else {
					el.style.clip = '';
				}
				return;
			}
		}
		el.style.clip = 'rect(' + el.clippingRectangle.join('px ') + 'px)';
		el.style.display = 'block';
	}
}

sM.addEvent(window, 'load', sM.init, false);
sM.addEvent(window, 'unload', EventCache.flush, false);