sM1 = {
	init: function() {
		var uls = document.getElementsByTagName('ul');
		for (var u = 0; u < uls.length; u++) {
			if (uls[u].className != 'dropdown_menu')
			continue;
			var lis = uls[u].getElementsByTagName('li');
			for (var i = 0; i < lis.length; i++) {
				var node = lis[i];
				if (node.nodeName.toLowerCase() == 'li' &&
					node.getElementsByTagName('ul').length > 0) {
					sM1.addEvent(node, 'mouseover', sM1.getMoverFor(node), false);
					sM1.addEvent(node, 'mouseout', sM1.getMoutFor(node), false);
					node.isIn = false;
				}
			}
		}
	},

	getMoverFor: function(node) {
		return function(e) { sM1.mover(e, node); };
	},
	
	getMoutFor: function(node) {
		return function(e) { sM1.mout(e, node); };
	},

	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') {
					// Stop current animation
					clearInterval(node.intervalID);
					// Assign initial visible area

					// Save full width and height
					node.style.display = 'block';
					node.savedOW = node.offsetWidth + 20;
					node.savedOH = node.offsetHeight;
					node.clippingRectangle = [0, node.savedOW, 0, 0];
					node.style.display = 'none';
					// Start animation
					node.intervalID = setInterval(function() {sM1.showMenu(node); }, 10);
				break;
				}
			}
		}
		el.isIn = true;
	},

	showMenu: function(el) {
		el.clippingRectangle[2] += 5;
		if (el.clippingRectangle[2] >= el.savedOH) {
			el.clippingRectangle[2] = el.savedOH;
			clearInterval(el.intervalID);
			// reset the clip: browser-specific
			if (document.all && !window.opera) {
				el.style.clip = 'rect(auto)';
			} else {
				el.style.clip = 'auto';
			}
			return;
		}
		el.style.clip = 'rect(' + el.clippingRectangle.join('px ') + 'px)';
		el.style.display = 'block';
	},

	mout: function(e, targetElement) {
		var el = window.event ? targetElement : e ? e.currentTarget : null;
		if (!el) return;
		el.outTimeout = setTimeout(function() { sM1.mout2(el); }, 50);
	},

	mout2: function(el) {

			for (var i = 0; i < el.childNodes.length; i++) {
				var node = el.childNodes[i];
				if (node.nodeName.toLowerCase() == 'ul') {
					// Stop current animation
					clearInterval(node.intervalID);
					// Save full width and height
					//node.style.display = 'block';
					node.savedOW = node.offsetWidth + 20;
					node.savedOH = node.offsetHeight;
					// Assign initial visible area
					//node.clippingRectangle = [0, node.savedOW, node.offsetHeight, 0];
					//node.style.display = 'none';
					// Start animation
					node.intervalID = setInterval(function() {sM1.hideMenu(node); }, 10);
				break;
				}
			}
		el.isIn = false;
	},

	hideMenu: function(el) {
		el.clippingRectangle[2] -=5;
		if (el.clippingRectangle[2] <= 0){
			el.clippingRectangle[2] = 0;
			clearInterval(el.intervalID);
			el.style.display = 'none';
			el.clippingRectangle = [0,0,0,0];
			// reset the clip: browser-specific
		}
		el.style.clip = 'rect(' + el.clippingRectangle.join('px ') + 'px)';
		el.style.display = 'block';		
	},

	addEvent: function(elm, evType, fn, useCapture) {
		// cross-browser event handling for IE5+, NS6 and Mozilla
		// By Scott Andrew
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			EventCache.add(elm, evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	}
};
sM1.addEvent(window, 'load', sM1.init, false);
sM1.addEvent(window, 'unload', EventCache.flush, false);