    function addEvent(obj, strEvent, objFunction, bDetach)
    {
        var returnValue = false;
        if (obj.addEventListener) {
            if (bDetach) obj.removeEventListener(strEvent, objFunction, false); 
		    else obj.addEventListener(strEvent, objFunction, false);
		    returnValue = true;
		} else if (obj.attachEvent) {
		    returnValue = true;
	        if (bDetach) obj.detachEvent("on" + strEvent, objFunction);
	        else returnValue = obj.attachEvent("on" + strEvent, objFunction); 
		}
		return returnValue;
    }

	function getAbsPos(xObj){
		var lx = 0, ly = 0;
		while(xObj){
			lx += xObj.offsetLeft;
			ly += xObj.offsetTop;
			xObj = xObj.offsetParent;
		}
		return {x:lx, y:ly};
	}

	function PosObject(xObj, xRefObj, sPos){
		var lPos = getAbsPos(xRefObj);
		switch(sPos.substring(0, 2)){
			case 'LL': break;
			case 'LR': lPos.x -= xObj.clientWidth; break;
			case 'RL': lPos.x += xRefObj.clientWidth; break;
			case 'RR': lPos.x += (xRefObj.clientWidth - xObj.clientWidth); break;
		}
		switch(sPos.substring(2, 4)){
			case 'TT': break;
			case 'TB': lPos.y -= xObj.clientHeight; break;
			case 'BT': lPos.y += xRefObj.clientHeight; break;
			case 'BB': lPos.y += (xRefObj.clientHeight - xObj.clientHeight); break;
		}
		xObj.style.left = lPos.x + 'px'; xObj.style.top = lPos.y + 'px';
	}

	function isChildOf(nParentObj, nChildObj){
		while(nChildObj && (nChildObj != document.body)){
			if(nParentObj == nChildObj) return true;
			nChildObj = nChildObj.parentNode;
		}
		return false;
	}

	var G_MENU_STACK = null;
	function trackMenu(e){
		e = (e || window.event);
		showMenu(null, e.relatedTarget ? e.relatedTarget : e.toElement, null);
	}

	function showMenu(xObj, xParent, sPos){
	    while ((G_MENU_STACK && !isChildOf(G_MENU_STACK, xParent)) && (G_MENU_STACK._MenuParent && !isChildOf(G_MENU_STACK._MenuParent, xParent))) {
		    addEvent(G_MENU_STACK, 'mouseout', trackMenu, true);
		    addEvent(G_MENU_STACK._MenuParent, 'mouseout', trackMenu, true);
		    G_MENU_STACK._MenuParent.style.backgroundColor = '';
		    var xMenuItem = G_MENU_STACK;
		    //$(xMenuItem).show().fadeOut();
		    xMenuItem.style.visibility = 'hidden';
		    G_MENU_STACK = G_MENU_STACK._MenuPrev;
        }
        if (G_MENU_STACK == xObj || !xObj) return;
		xObj._MenuPrev = G_MENU_STACK;
		xObj._MenuParent = xParent;
		PosObject(xObj, xParent, sPos);
		addEvent(xObj, 'mouseout', trackMenu, false);
		addEvent(xParent, 'mouseout', trackMenu, false);
		xObj.style.visibility = '';
		$(xObj).hide().fadeIn();
		G_MENU_STACK = xObj;
		G_MENU_STACK._MenuParent.style.backgroundColor = 'white';
    }
