/**
 * Função para fazer menus popup em árvore que rode nos principais navegadores.
 *
 * @author 	André Mendonça
 * @version 0.7
 *
 * @param string	id		Id do elemento <UL> pai da lista.
 * @param int		delay	Tempo para fechar o menu após retirar o mouse de
 * 							cima (em milesegundos).
 * @param string	showEvent	O evento que será utilizado para mostrar o menu
 * @param string	hideEvent	O evento que será utilizado para ocultar o menu
 * @return bool
 */

var openedMenu = null;

function aMenu(id, delay, showEvent, hideEvent) {

	if (!showEvent) {
		showEvent = 'mouseover';
	}
	if (!hideEvent) {
		hideEvent = 'mouseout';
	}
	var menu = document.getElementById(id);
	if (!menu) return false;
	var uls = menu.getElementsByTagName('ul');

	/* closes the menu */
	var closeMenu = function(menu) {
		openedMenu = null;
		var submenu = menu.getElementsByTagName('ul');
    	if (submenu[0]) {
			submenu[0].style.visibility = 'hidden';
		}
	}

	/* função on mouse over para os <LI>'s */
	var fhover = function (e) {
		if (openedMenu) {
			var Pthis = openedMenu;
			closeMenu(Pthis);
		}
		openedMenu = this;
		openedMenu.on = true;
		var submenu = this.getElementsByTagName('ul');
		if (submenu[0]) {
			submenu[0].style.visibility = 'visible';
		}
	}

	/* função on mouse out para os <LI>'s */
	var fout = function (e) {
		if (openedMenu) {
			var srcElement = Event.element(e);
			if (!srcElement.descendantOf(openedMenu) && srcElement!=openedMenu) {
				openedMenu.on = false;
				var Pthis = openedMenu;
				var tout = function(e) {
					if (Pthis.on == false) {
					 	closeMenu(Pthis);
					}
				}
				window.setTimeout(tout, openedMenu.delay);
			}
		}
	}

	/* Seta a configuração para cada LI com submenu */
	for (var ulkey in uls) {
		var li = $(uls[ulkey].parentNode);
		if (!li) continue;
		li.on 			= false;
		li.delay 		= delay;

		var childElement = li.firstDescendant();
		if (childElement.tagName == 'A' && showEvent=='click') {
			childElement.onclick = function() {return false;}
		}
		Event.observe(li, showEvent, fhover);
		Event.observe(document, hideEvent, fout);

	}
	return true;
}
