function addEvent(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);
		EventCache.add(elm, evType, fn);
		return r;
	} else {
		elm['on' + evType] = fn;
	}
}

// menu code
function showMenu(el) {
	el.clippingRectangle[2] += 10;
	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';
  }

function hideMenu(el) {
	el.clippingRectangle[2] -= 10;
	if (el.clippingRectangle[2] <= 0) {
		el.clippingRectangle[2] = 0;
		clearInterval(el.intervalID);
		// reset the clip: browser-specific
		if (document.all && !window.opera) {
			el.style.clip = 'rect(auto)';
		} else {
			el.style.clip = 'auto';
		}
		el.style.display = 'none';
		return;
	}
	el.style.clip = 'rect(' + el.clippingRectangle.join('px ') + 'px)';
}

function mover(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.style.display = 'block';
				node.clippingRectangle = [0, node.offsetWidth, 0, 0];
				node.savedOW = node.offsetWidth;
				node.savedOH = node.offsetHeight;
				node.style.display = 'none';
				node.intervalID = setInterval(function() {showMenu(node);}, 10);
				break;
			}
		}
	}
	el.isIn = true;
}

function mout(e, targetElement) {
	var el = window.event ? targetElement : e ? e.currentTarget : null;
	if (!el) return;
	el.outTimeout = setTimeout(function() { mout2(el); }, 300);
}

function mout2(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() {hideMenu(node);}, 10);
			break;
		}
	}
	el.isIn = false;
}

function getMoverFor(node) {
	return function(e) { mover(e, node); };
}

function getMoutFor(node) {
	return function(e) { mout(e, node); };
}

function create_nodes() {
	var ULs = document.getElementsByTagName('ul');
	for (var t=0; t<ULs.length; t++) {
		if (ULs[t].className == 'TopMenu') {
			var LIs = ULs[t].getElementsByTagName('li');
			for (var i=0; i<LIs.length; i++) {
				var node = LIs[i];
				if (node.nodeName.toLowerCase() == 'li' && node.getElementsByTagName('ul').length > 0) {
					addEvent(node, 'mouseover', getMoverFor(node), false);
					addEvent(node, 'mouseout', getMoutFor(node), false);
					node.isIn = false;
				}
			}
		}
	}
}

addEvent(window, 'load', create_nodes, false);
addEvent(window, 'unload', EventCache.flush, false);
