/*-------------------------------------------------------------------------*/
// IPS BASIC MENU CLASS
// (c) 2005 Invision Power Services, Inc
// ASSUMES "ips_global.js" has been loaded
/*-------------------------------------------------------------------------*/

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;

/*-------------------------------------------------------------------------*/
// menu_do_global_init: Initiate all registered menus in HTML
/*-------------------------------------------------------------------------*/

function menu_do_global_init()
{
	if ( menu_registered.length > 0 )
	{
		for( var i in menu_registered )
		{
			menu_init( menu_registered[i] );
		}

		//----------------------------------
		// Close all menus on click
		//----------------------------------

		document.onclick = menu_action_close;
	}
}

/*-------------------------------------------------------------------------*/
// menu_init: Initiate a single menu
/*-------------------------------------------------------------------------*/

function menu_init(cid)
{
	var mid  = _menu_get_base_name(cid) + "_menu";
	var mobj = my_getbyid(mid);

	if ( document.getElementsByTagName && mobj )
	{
		//----------------------------------
		// Control object (link / img, etc)
		//----------------------------------

		var cobj = my_getbyid(cid);

		// Change cursor to show link
		try
		{
			cobj.style.cursor = "pointer";
		}
		catch(e)
		{
			cobj.style.cursor = "hand";
		}

		cobj.unselectable = true;
		cobj.onclick      = _event_menu_click;
		cobj.onmouseover  = _event_menu_mouseover;

		//----------------------------------
		// Save CPU - already init?
		//----------------------------------

		if ( typeof( menu_built[mid]) != "undefined" )
		{
			return;
		}

		//----------------------------------
		// Pop-up menu obj (hidden div)
		//----------------------------------

		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;
	}
}

/*-------------------------------------------------------------------------*/
// Register menu control ID (add to array)
/*-------------------------------------------------------------------------*/

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;
}

/*-------------------------------------------------------------------------*/
// ACTION: If registered control ID clicked, open menu
/*-------------------------------------------------------------------------*/

function menu_action_open(e)
{
	var openmenu = menu_cur_open;
	var negpad   = true;

	//----------------------------------
	// Close current menu(s)
	//----------------------------------

	menu_action_close();

	//----------------------------------
	// Save CPU - cur open clicked?
	//----------------------------------

	if ( openmenu == e.id )
	{
		return false;
	}

	//----------------------------------
	// Get ID of menu DIV to show
	//----------------------------------

	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;

	//----------------------------------
	// Show menu DIV
	//----------------------------------

	mobj.style.display = "";

	//----------------------------------
	// Try and keep it on screen
	//----------------------------------

	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;
	}

	//----------------------------------
	// IE needs a tweak...
	//----------------------------------

	if ( is_ie )
	{
		left_px += ( negpad ) ? -2 : 2;
	}

	//----------------------------------
	// Finalize menu position
	//----------------------------------

	mobj.style.left   = left_px + "px";
	mobj.style.top    = top_px  + "px";
	mobj.style.zIndex = 100;

	//----------------------------------
	// Run a custom function?
	//----------------------------------

	if ( menu_openfuncs[ callbackobj ] )
	{
		eval( menu_openfuncs[ callbackobj ] );
	}

	//----------------------------------
	// Workaround for IE bug which shows
	// select boxes and other windows GUI
	// over divs. SHOW IFRAME
	//----------------------------------

	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
    	}
	}

	//----------------------------------
	// Work around for safari which doesnt
	// allow a hrefs top be clickable in
	// a pop up div
	//----------------------------------

	if ( is_safari )
	{
		try
		{
			mlinks = mobj.getElementsByTagName('a');

			for ( var i = 0 ; i <= mlinks.length ; i++ )
			{
				//----------------------------------
				// Ignore non links and links that end with #
				// As safari likes to do that with href='#' links
				//----------------------------------

				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;
}

/*-------------------------------------------------------------------------*/
// Safari: bug fix
/*-------------------------------------------------------------------------*/

function _safari_onclick_handler()
{
	if ( this.id )
	{
		window.location = document.getElementById( this.id ).href;
	}
}


/*-------------------------------------------------------------------------*/
// ACTION: Close all open menus
/*-------------------------------------------------------------------------*/

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";

			//----------------------------------
			// Workaround for IE bug which shows
			// select boxes and other windows GUI
			// over divs. Hide IFRAME
			//----------------------------------

			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;
}

/*-------------------------------------------------------------------------*/
// ACTION: If menu open and hover over another cid, close cur open new
/*-------------------------------------------------------------------------*/

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;
		}
	}
}

/*-------------------------------------------------------------------------*/
// Prevent browser bubblin'
/*-------------------------------------------------------------------------*/

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;
	}
}

/*-------------------------------------------------------------------------*/
// EVENT : Mouse over menu
/*-------------------------------------------------------------------------*/

function _event_menu_mouseover(e)
{
	e = _cancel_bubble(e, true);
	menu_action_hover(this);
}

/*-------------------------------------------------------------------------*/
// EVENT: Menu click
/*-------------------------------------------------------------------------*/

function _event_menu_click(e)
{
	e = _cancel_bubble(e, true);
	menu_action_open(this);
}

/*-------------------------------------------------------------------------*/
// Get menu basename
/*-------------------------------------------------------------------------*/

function _menu_get_base_name(cid)
{
	var endpos = cid.indexOf(".");

	if (endpos != -1)
	{
		return cid.substr(0, endpos);
	}
	else
	{
		return cid;
	}
}

/*-------------------------------------------------------------------------*/
// Get left posititon of object
/*-------------------------------------------------------------------------*/

function _get_obj_leftpos(obj)
{
	var left = obj.offsetLeft;

	while( (obj = obj.offsetParent) != null )
	{
		left += obj.offsetLeft;
	}

	return left;
}

/*-------------------------------------------------------------------------*/
// Get top position of object
/*-------------------------------------------------------------------------*/

function _get_obj_toppos(obj)
{
	var top = obj.offsetTop;

	while( (obj = obj.offsetParent) != null )
	{
		top += obj.offsetTop;
	}

	return top;
}
