new function() {
	var b = navigator.userAgent.toLowerCase();

	// Figure out what browser is being used
	browser = {
		safari: /webkit/.test(b),
		opera: /opera/.test(b),
		msie: /msie/.test(b) && !/opera/.test(b),
		mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
	};

};
	
function curCSS (elem, prop, force) {
	var ret;

	// read opacity always from style directly
	if (prop == "opacity" && browser.msie)
		return jQuery.attr(elem.style, "opacity");

	// normalize float for different browsers		
	if (prop == "float" || prop == "cssFloat")
	    prop = browser.msie ? "styleFloat" : "cssFloat";

	// is style property defined
	if (!force && elem.style[prop])
		ret = elem.style[prop];
	
	// the explorer way
	else if (document.defaultView && document.defaultView.getComputedStyle) {

		// get back to default view property
		if (prop == "cssFloat" || prop == "styleFloat")
			prop = "float";

		prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
		var cur = document.defaultView.getComputedStyle(elem, null);

		if ( cur ) ret = cur.getPropertyValue(prop);
		else if ( prop == "display" ) ret = "none";

	} else if (elem.currentStyle) {

		var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
		ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
	}

	return ret;
}

function getPosition (e)
{
	var x = 0;
	var y = 0;
	var es = e.style;
	
	if (curCSS(e, 'display') == 'none') {
		var oldVisibility = es.visibility;
		var oldPosition = es.position;
		es.visibility = 'hidden';
		es.display = 'block';
		es.position = 'absolute';
	}
	var el = e;
	while (el){
		x += el.offsetLeft + (x && !browser.opera ? parseInt(curCSS(el, "borderLeftWidth"))||0:0);
		y += el.offsetTop + (y && !browser.opera ? parseInt(curCSS(el, "borderTopWidth"))||0:0);
		el = el.offsetParent;
	}
	el = e;
	while (el && el.tagName  && el.tagName.toLowerCase() != 'body')
	{
		x -= el.scrollLeft||0;
		y -= el.scrollTop||0;
		el = el.parentNode;
	}
	if (oldVisibility) {
		es.display = 'none';
		es.position = oldPosition;
		es.visibility = oldVisibility;
	}
	return {x:x, y:y};
}

if(!document.getElementById && document.all)
	document.getElementById = function (id)
		{ return document.all[id] }

var closer = new Object();

function CloserReset(id) { if(!closer[id]) return;
	window.clearTimeout(closer[id]);
	closer[id] = false;
	delete closer[id];
}

function MenuClose(id) { 
	id = id.replace(/\//g, '_'); CloserReset(id);
	var elem = document.getElementById("menu_"+id);
	if(elem && elem.style) elem.style.display = "none";
}

function MenuOut(id) { 
	id = id.replace(/\//g, '_'); CloserReset(id);
	closer[id] = window.setTimeout("MenuClose('" + id + "');", 250);
}

function MenuOver(id) {
	id = id.replace(/\//g, '_'); CloserReset(id);
	var elem = document.getElementById("menu_"+id);
	if(elem && elem.style) {
		if(elem.style.display == "block") return;
	elem.style.display = "block" }

	for(var i in closer) if(closer[i]) // close waiting menus
	{ if(id.substring(0, i.length) != i) MenuClose(i) }
	
	if(elem && !elem.getAttribute("_menu_placed")) {
		var attach = document.getElementById("attach_menu_"+id);
		if(attach) { var position = getPosition(attach);
			if(position) elem.style.marginTop = position.y + "px";
		}
	elem.setAttribute("_menu_placed", "true"); }
}
