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);
		
// Set up style defaults
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)
{
//alert(e);// Oh dear, someones stolen the iframe
}
}
	
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;
}