var menu_registered = new Array();
var menu_openfuncs  = new Array();
var menu_built      = new Array();
var menu_open_menus = new Array();
var menu_cur_open   = false;
function menu_do_global_init()
{
	if ( menu_registered.length > 0 )
	{
		for( var i in menu_registered )
		{
			menu_init( menu_registered[i] );
		}
		document.onclick = menu_action_close;
	}
}

function menu_init(cid)
{	var mid  = _menu_get_base_name(cid) + "_menu";
	var mobj = my_getbyid(mid);
	if ( document.getElementsByTagName && mobj )
	{
		var cobj = my_getbyid(cid);
		try
		{
			cobj.style.cursor = "pointer";
		}
		catch(e)
		{
			cobj.style.cursor = "hand";
		}
		cobj.unselectable = true;
		cobj.onclick      = _event_menu_click;
		cobj.onmouseover  = _event_menu_mouseover;
		if ( typeof( menu_built[mid]) != "undefined" )
		{
			return;
		}
		var pobj = my_getbyid(mid);
		pobj.style.display  = "none";
		pobj.style.position = "absolute";
		pobj.style.left     = "0px";
		pobj.style.top      = "0px";
		pobj.onclick        = _cancel_bubble;
		pobj.zIndex         = 1000;
		
		menu_built[mid] = true;
	}
}
function menu_register(cid, callback)
{
	if ( document.getElementsByTagName )
	{
		var cobj = my_getbyid(cid);
		
		if (cobj)
		{			
			menu_registered[menu_registered.length] = cid;
			if ( callback )
			{
				menu_openfuncs[ cobj ] = callback;
			}
			return true;
		}
	}	return false;
}
function menu_action_open(e)
{
	var openmenu = menu_cur_open;
	var negpad   = true;
	menu_action_close();
	if ( openmenu == e.id )
	{		return false;	}
	var mid         = _menu_get_base_name(e.id) + "_menu";	
	var mobj        = my_getbyid(mid);
	var left_px     = _get_obj_leftpos(e);
	var top_px      = _get_obj_toppos(e) + e.offsetHeight;
	var callbackobj = my_getbyid( e.id );
	var ifid        = e.id;
	menu_open_menus[e.id] = true;
	menu_cur_open         = e.id;
	mobj.style.display = "";
	var width = parseInt( mobj.style.width ) ? parseInt( mobj.style.width ) : mobj.offsetWidth;
	
	if ( (left_px + width) >= document.body.clientWidth )
	{		left_px = left_px + e.offsetWidth - width;
		negpad  = false;	}
	if ( is_ie )
	{		left_px += ( negpad ) ? -2 : 2;	}
	mobj.style.left   = left_px + "px";
	mobj.style.top    = top_px  + "px";
	mobj.style.zIndex = 100;
	if ( menu_openfuncs[ callbackobj ] )
	{ 		eval( menu_openfuncs[ callbackobj ] );	}
	if ( is_ie )
	{
		try
		{
			if ( ! document.getElementById( 'if_' + e.id ) )
			{ 
				var iframeobj = document.createElement('iframe');
				iframeobj.src = 'javascript;';
				iframeobj.id  = 'if_' + e.id;
				document.getElementsByTagName('body').appendChild( iframeobj );
			}
			else
			{
				var iframeobj = document.getElementById( 'if_' + e.id );
			}
			iframeobj.scrolling      = 'no';
			iframeobj.frameborder    = 'no';
			iframeobj.className      = 'iframeshim';
			iframeobj.style.position = 'absolute';
			iframeobj.style.width   = parseInt(mobj.offsetWidth)  + 'px';
			iframeobj.style.height  = parseInt(mobj.offsetHeight) + 'px';
			iframeobj.style.top     = mobj.style.top;
			iframeobj.style.left    = mobj.style.left;
			iframeobj.style.zIndex  = 99;
			iframeobj.style.display = "block";
    	}
    	catch(e)
    	{
    		//alert(e); // Oh dear, someones stolen the iframe
    	}
	}
		if ( is_safari )
	{
		try
		{
			mlinks = mobj.getElementsByTagName('a');
			
			for ( var i = 0 ; i <= mlinks.length ; i++ )
			{
				if ( mlinks[i].href && ( mlinks[i].href.indexOf( '#', 0 ) != (mlinks[i].href.length - 1) ) )
				{
					mlinks[i].onmousedown = _safari_onclick_handler;
					mlinks[i].id          = 'saf-link-' + mid + i;
				}
			}
		}
		catch( e )
		{
			//alert( e );
		}
	}
	return false;
}
function _safari_onclick_handler(){	if ( this.id )	{		window.location = document.getElementById( this.id ).href;	}}
function menu_action_close()
{
	if ( menu_cur_open )
	{
		for ( i in menu_open_menus )
		{
			my_getbyid(_menu_get_base_name(i) + "_menu").style.display = "none";
			if ( is_ie )
			{
				try
				{					document.getElementById( 'if_' + i ).style.display = "none";				}
				catch(e)
				{	}
			}
	
			menu_open_menus[i] = false;
		}
	}
	menu_cur_open = false;
}
function menu_action_hover(e)
{
	for ( i in menu_open_menus )
	{		if (menu_open_menus[i] == true && i != e.id)		{			menu_action_open(e);			return;		}	}
}
function _cancel_bubble(obj, extra)
{
	if ( ! obj || is_ie)
	{
		if ( extra )
		{
			window.event.returnValue = false;
		}
		window.event.cancelBubble = true;		return window.event;
	}
	else
	{
		if (obj.target.type == 'submit')
		{			obj.target.form.submit();		}
		obj.stopPropagation();
		if ( extra )
		{			obj.preventDefault();		}
		return obj;	}
}
function _event_menu_mouseover(e){	e = _cancel_bubble(e, true);	menu_action_hover(this);}
function _event_menu_click(e){e = _cancel_bubble(e, true);	menu_action_open(this);}
function _menu_get_base_name(cid){	var endpos = cid.indexOf(".");	if (endpos != -1)	{		return cid.substr(0, endpos);}	else	{		return cid;	}}
function _get_obj_leftpos(obj)
{	var left = obj.offsetLeft;
	while( (obj = obj.offsetParent) != null )
	{
		left += obj.offsetLeft;
	}
	return left;
}
function _get_obj_toppos(obj)
{
	var top = obj.offsetTop;
	while( (obj = obj.offsetParent) != null )
	{
		top += obj.offsetTop;
	}
	return top;
}
