﻿var timeoutID = new Object();		// Holds the timeout id for clearing it if nessasary
var nextVisibility = new Object();	// Toggled to specified the next expected visibility state.

function nodelay_setVisibility(menu, submenu, visibility) {
	// Don't repeat this function unnecessarily
	if (nextVisibility[submenu.id] != null && visibility != nextVisibility[submenu.id])
		return true;
	else
		nextVisibility[submenu.id] = (visibility == "hidden") ? "visible" : "hidden";
		
	// Reposition the submenu under the menu item
	if (menu != null) {
		var menuRec = new element_rect(menu);
		var submenuRec = new element_rect(submenu);
		submenu.style.left = (menuRec.left + menuRec.width - submenuRec.width) + 'px';
		submenu.style.top = (menuRec.top + menuRec.height) + 'px';
	}

	// Show or delay hide the submenu
	if (visibility == "hidden") {
		timeoutID[submenu.id] = setTimeout("var smenu = document.all['" + submenu.id + "']; smenu.style.visibility = 'hidden'; showHideElements('SELECT', 'visible', document.all['" + submenu.id + "']); timeoutID['" + submenu.id + "'] = null; smenu.style.left = '0px'; smenu.style.top = '0px';", 100);
	} else {
		submenu.style.visibility = 'visible';
		showHideElements('SELECT', 'hidden', submenu);
		if (timeoutID[submenu.id] != null)
			clearTimeout(timeoutID[submenu.id]);
	}

	return true;
}

function showHideElements(tagName, visibility, menu)
{
	var els = document.getElementsByTagName(tagName);
	var i;
	var rect = new element_rect(menu);
	for (i=0; i < els.length; i++)
	{
		var el = els.item(i);
		if (elements_overlap(el, rect))
		{
			el.style.visibility = visibility;
		}
	}
}

function element_rect(el)
{
	var left = 0;
	var top = 0;
	this.width = el.offsetWidth;
	this.height = el.offsetHeight;
	while (el)
	{
		left += el.offsetLeft;
		top += el.offsetTop;
		el = el.offsetParent;
	}
	this.left = left;
	this.top = top;
}

function elements_overlap(el, rect)
{
	var r = new element_rect(el);
	return ((r.left < rect.left + rect.width) && (r.left + r.width > rect.left) && (r.top < rect.top + rect.height) && (r.top + r.height > rect.top));
}

