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;
	}
}

function showMenu(el) {
	if (el.clippingRectangle) {
		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, auto, auto, auto)';
			} else {
				el.style.clip = 'auto';
			}
			return;
		}
		el.style.clip = 'rect(' + el.clippingRectangle.join('px ') + 'px)';
		el.style.display = 'block';
	}
  }

function hideMenu(el, opt) {
	if (opt == 2) {	// just hide menu right away, don't slowly hide it
		clearInterval(el.intervalID);
		// reset the clip: browser-specific
		if (document.all && !window.opera) {
			el.style.clip = 'rect(auto, auto, auto, auto)';
		} else {
			el.style.clip = 'auto';
		}
		el.style.display = 'none';
		return;
	} else {
		if (el.clippingRectangle) {
			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, auto, auto, 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, opt) {
	var el = window.event ? targetElement : e ? e.currentTarget : null;
	if (!el) return;
	if (opt == 2)
		el.outTimeout = setTimeout(function() { mout2(el, opt); }, 0);
	else
		el.outTimeout = setTimeout(function() { mout2(el, opt); }, 300);
}

function mout2(el, opt) {
	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, opt);}, 10);
			break;
		}
	}
	el.isIn = false;
}

function getMoverFor(node) {
	return function(e) { mover(e, node); };
}

function getMoutFor(node, opt) {
	return function(e) { mout(e, node, opt); };
}

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) {
					if (node.className == 'FlyoutArrow') {
						addEvent(node, 'mouseover', getMoverFor(node), false);
						addEvent(node, 'mouseout', getMoutFor(node, 2), false);
						node.isIn = false;
					} else {
						addEvent(node, 'mouseover', getMoverFor(node), false);
						addEvent(node, 'mouseout', getMoutFor(node, 1), false);
						node.isIn = false;
					}
				}
			}
		}
	}
}

addEvent(window, 'load', create_nodes, false);