
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; xObj.style.top = lPos.y;
}

function isChildOf(nParentObj, nChildObj){
	while(nChildObj){
		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.toElement, null);
}

function showMenu(xObj, xParent, sPos){
	while(G_MENU_STACK && !isChildOf(G_MENU_STACK, xParent)){
		G_MENU_STACK.style.visibility = 'hidden';
		G_MENU_STACK = G_MENU_STACK._MenuPrev;
	}
	if(!xObj) return;
	xObj._MenuPrev = G_MENU_STACK; G_MENU_STACK = xObj;
	xObj._MenuParent = xParent;
	PosObject(xObj, xParent, sPos);
	xObj.onmouseout = trackMenu;
	xObj.style.visibility = '';
}
