
var menuIdCount = 1001;
var menuDelay = 350;
var menuOverElements = new Object();
var menuOutElements = new Object();

function MouseLeaveOrEnter(e, element) {
	var parent = e.relatedTarget;
	while (parent && parent != element) {
		try {
			parent = parent.parentNode;
		} catch (ex) {
			parent = null;
		}
	}
	return (parent != element);
}

function MenuItemOver(element, e) {
	if (MouseLeaveOrEnter(e, element)) {
		if (menuOutElements[element.id]) {
			clearTimeout(menuOutElements[element.id]);
			delete menuOutElements[element.id];
		}
		if (!menuOverElements[element.id]) {
			menuOverElements[element.id] = setTimeout(function() {MenuShow(element)}, menuDelay);
		}
	}
}

function MenuItemOut(element,e) {
	if (MouseLeaveOrEnter(e, element)) {
		if (menuOverElements[element.id]) {
			clearTimeout(menuOverElements[element.id]);
			delete menuOverElements[element.id];
		}
		if (!menuOutElements[element.id]) {
			menuOutElements[element.id] = setTimeout(function() {MenuHide(element)}, menuDelay);
		}
	}
}

function MenuShow(element) {
	var submenu = element.getElementsByTagName("ul")[0];
	var page_bottom = window.innerHeight + window.pageYOffset;
	var offset = 10;
	if (submenu.parentNode != submenu.offsetParent) {
		offset += MenuGetOffset(submenu.parentNode) - MenuGetOffset(submenu.offsetParent);
	}
	
	if (offset + MenuGetOffset(submenu.offsetParent) + submenu.offsetHeight > page_bottom) {
		offset -= (offset + MenuGetOffset(submenu.offsetParent) + submenu.offsetHeight) - page_bottom;
	}

	submenu.style.top = offset + "px";
	submenu.style.visibility = "visible";
	delete menuOverElements[element.id];
}

function MenuHide(element) {
	delete menuOutElements[element.id];
	element.getElementsByTagName("ul")[0].style.visibility = "hidden";
}

function MenuGetOffset(element) {
    var valueT = 0;
	do {
		valueT += element.offsetTop  || 0;
		if (element.offsetParent == document.body) {
			break;
		}
		element = element.offsetParent;
	} while (element);

	return valueT;
}
