// Gets the mouse position (relative to the document window) at the time the event was fired
function getMousePos(e) {
        var pos = new Object();
        pos.x = 0;
        pos.y = 0;
        if (!e) var e = window.event;
        if (e.pageX || e.pageY)         {
                pos.x = e.pageX;
                pos.y = e.pageY;
        }
        else if (e.clientX || e.clientY)        {
                pos.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
                pos.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
        }
        return pos;
}

// Get the element's position relative to the document window!
function getElementPos(obj) {
        var pos = new Object();
        pos.x = pos.y = 0;
        if (obj.offsetParent) {
                pos.x = obj.offsetLeft;
                pos.y = obj.offsetTop;
                while (obj = obj.offsetParent) {
                        pos.x += obj.offsetLeft;
                        pos.y += obj.offsetTop;
                }
        }
        return pos;
}

function OpenMenu(element,dock,offsetX,offsetY,parent) {
	var o = document.getElementById(element.id + '_Menu');
	var p = document.getElementById(parent);
	if(p!=null) p.child_menu = o;
	o.parent_menu = p;	
		
	if(o.style.visibility != 'visible') {	// let's position it first, then make it visible
	
		var pos = getElementPos(element);
		
		if(dock == 'right') {
			o.style.top = parseInt(pos.y) + offsetY + "px";
			o.style.left = parseInt(pos.x)+ element.offsetWidth + offsetX + "px";				
		}
		else {
			o.style.top = parseInt(pos.y) + element.offsetHeight + offsetY +"px";
			o.style.left = parseInt(pos.x)+ offsetX + "px";
		}
		o.style.visibility = 'visible';
	}
}


function mouse_within_element(e,obj,enter) {
	var p = getMousePos(e);
	return within_bounds(obj,p.x,p.y,enter);	
}


function within_bounds(menu,posx,posy,enter) {
	if(menu==null) return false;

	if(enter==null) enter = true;
		
	var pos = getElementPos(menu);
	
	var offsetX = 0;
	var offsetY = 0;

	if(navigator.appName=="Microsoft Internet Explorer") {
		offsetX = 2;
		offsetY = 2;
	} 
	
	//alert(menu.id + ': mx:' + posx + ' my:' + posy + ' left:' + pos.x  + ' top:' + pos.y + ' right:' + (pos.x+menu.offsetWidth) + ' bottom:' + (pos.y+menu.offsetHeight) + ' offsetX:' + offsetX + ' offsetY:' + offsetY);
	 
 	if(enter) {	
		if( posx - offsetX >=pos.x && posx<=pos.x+menu.offsetWidth && posy - offsetY >=pos.y && posy<=pos.y+menu.offsetHeight) return true;
		else return false;
	}
	else {
		if( posx - offsetX >pos.x && posx<pos.x+menu.offsetWidth && posy - offsetY >pos.y && posy<pos.y+menu.offsetHeight) return true;
		else return false;
	}
}

function CloseMenu(menuName,e) {
	//alert('attempt closing:' + menuName);
	var pos = getMousePos(e);
	var o = document.getElementById(menuName);
	if(within_bounds(o,pos.x,pos.y)) return;
	
	/////////////////////////added on the 16th of April 2009
		if(pos.y > 62){
			if(pos.x > 345){
				o.style.visibility = 'hidden';
			}
		}	
	/////////////////////////////////////////////////////////
	
	var c = o.child_menu;
	if(within_bounds(c,pos.x,pos.y)) return;
	else {
		//alert('closing:' + menuName);
				
		o.style.visibility = 'hidden';
		var p = o.parent_menu;
		if(p!=null) {
			//alert('closing parent:' + p.id);
			CloseMenu(p.id,e);
 		}
	}
}
		