var comenu_usepopups = true;
var comenu_registered = new Array();
var comenu_initialized = new Array();
var comenu_activemenus = new Array();
var comenu_currentactive = false;
var slidetimer = false;
var comenu_opensteps = 20;
var comenu_doslide = true;
var comenu_dofade = false; // can be very slow

var comenu_datefields = new Array();

// #############################################################################
// another function to handle the different event models of different browsers
// and prevent event bubbling in a lesser way
function e_by_gum(eventobj)
{
	if (!eventobj || is_ie)
	{
		window.event.cancelBubble = true;
		return window.event;
	}
	else
	{
		if (eventobj.target.type == 'submit')
		{
			// naughty safari
			eventobj.target.form.submit();
		}
		eventobj.stopPropagation();
		return eventobj;
	}
}

// #############################################################################
// get left position of elm
function fetch_object_posleft(elm)
{
	var left = elm.offsetLeft;
	while((elm = elm.offsetParent) != null)
	{
		left += elm.offsetLeft;
	}
	return left;
}

// #############################################################################
// get top position of elm
function fetch_object_postop(elm) {
	var top = elm.offsetTop;
	while((elm = elm.offsetParent) != null)	{
		top += elm.offsetTop;
	}
	return top;
}

// #############################################################################
function comenu_doregister(controlid, nowrite, datefield){
	if (document.getElementsByTagName){
		controlobj = fetch_object(controlid);
		if (controlobj)	{			
			if (datefield) {
				comenu_datefields[controlid] = datefield;
			}
			comenu_registered[comenu_registered.length] = controlid;
			return true;
		}
	}
	return false;
}

// #############################################################################
// function to get the menu basename - 'menu.104' returns 'menu', 'x.menu' returns 'x'
function comenu_getmenuid(controlid) {
	dotpos = controlid.indexOf(".");
	if (dotpos != -1) {
		return controlid.substr(0, dotpos);
	}
	else {
		return controlid;
	}
}

// #############################################################################
// handle menu control mouseover events
function comenu_eventhandler_mouseover(e)
{
	e = do_an_e(e);
	comenu_hover(this);
}

// #############################################################################
// handle menu control click events
function comenu_eventhandler_click(e)
{
	e = do_an_e(e);
	comenu_open(this);
}

// #############################################################################
// close all open menus
function comenu_close() {
	if (comenu_currentactive) {
		for (key in comenu_activemenus)	{
			fetch_object("navbar_help_menu").style.display = "none";
			comenu_activemenus[key] = false;
		}
	}
	comenu_currentactive = false;
	
	if (slidetimer) {
		clearTimeout(slidetimer);
		slidetimer = false;
	}
	
	if (is_ie)
	{
		selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++)
		{
			selects[i].style.visibility = "visible";
		}
	}
}

function vbmenu_overlap(selectobj, m)
{
	s = new Array();
	s['L'] = fetch_object_posleft(selectobj);
	s['T'] = fetch_object_postop(selectobj);	
	s['R'] = s['L'] + selectobj.offsetWidth;
	s['B'] = s['T'] + selectobj.offsetHeight;
	
	if (s['L'] >= m['L'] && s['L'] <= m['R'] && ((s['T'] >= m['T'] && s['T'] <= m['B']) || (s['B'] >= m['T'] && s['B'] <= m['B']))) { return true; }
	else if (s['R'] >= m['L'] && s['R'] <= m['R'] && ((s['T'] >= m['T'] && s['T'] <= m['B']) || (s['B'] >= m['T'] && s['B'] <= m['B']))) { return true; }
	else if (s['B'] >= m['T'] && s['T'] <= m['B'] && ((s['L'] >= m['L'] && s['L'] <= m['R']) || (s['R'] >= m['R'] && s['R'] <= m['R']))) { return true; }
	else if (m['B'] >= s['T'] && m['T'] <= s['B'] && ((m['L'] >= s['L'] && m['L'] <= s['R']) || (m['R'] >= s['R'] && m['R'] <= s['R']))) { return true; }
	else { return false; }
}


// #############################################################################
// open menu under pointer if another menu is active
function comenu_hover(elm)
{
	for (key in comenu_activemenus)
	{
		if (comenu_activemenus[key] == true && key != elm.id)
		{
			comenu_open(elm);
			return;
		}
	}
}
// #############################################################################
// open the clicked menu
function comenu_open(elm) {

	openmenu = comenu_currentactive;
	
	comenu_close();
	
	if (openmenu == elm.id)
	{
		// clicked element was the control for the currently open menu - exit
		return false;
	}
	
	// get the id of the menu to be opened
	menuid = 'navbar_help_menu';
//	menuid = comenu_getmenuid(elm.id) + "_menu";	
	menuobj = fetch_object(menuid);
	
	//if there are bugs, just revert to always use loop. - not sure if ie5.5- is compatible with this feature.
	if (is_ie){
		var textToUse = elm.text
	}
	else{
		//for netscape, must be done in loop
		for (var x = 0; x < elm.attributes.length; x++){
			if (elm.attributes[x].name == 'text'){
				var textToUse = elm.attributes[x].value
			}
		}
	}
	document.getElementById("navbar_help_content").innerHTML = textToUse;
	
	comenu_activemenus[elm.id] = true;
	comenu_currentactive = elm.id;
	
	// get menu position
	leftpx = fetch_object_posleft(elm);
	toppx = fetch_object_postop(elm) + elm.offsetHeight;
	
	// un-hide menu	
	menuobj.style.display = "";
	
	slidedir = "left";

	// shuffle the IE menus a bit
	if (is_ie)
	{
		leftpx += -2;
	}
	
	// set menu position
	menuobj.style.left = leftpx + "px";
	menuobj.style.top = toppx + "px";

	if (is_ie)
	{	
		menuarea = {
			"L" : leftpx,
			"T" : toppx,
			"R" : leftpx + menuobj.offsetWidth,
			"B" : toppx + menuobj.offsetHeight
		};		
		selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++)
		{
			if (vbmenu_overlap(selects[i], menuarea))
			{
				selects[i].style.visibility = "hidden";
			}
		}
	}
	
	// slide menus open (internet explorer only)
	if (comenu_doslide && !is_opera && !is_ie4)
	{
		intervalX = Math.ceil(menuobj.offsetWidth / comenu_opensteps);
		intervalY = Math.ceil(menuobj.offsetHeight / comenu_opensteps);
		
		if (slidedir == "left")
		{
			menuobj.style.clip = "rect(auto, auto, 0px, auto)";
			comenu_slide_left(menuid, intervalX, intervalY, 0, 0, 0);
		}
		else
		{
			menuobj.style.clip = "rect(auto, auto, 0px, auto)";
			comenu_slide_right(menuid, intervalX, intervalY, menuobj.offsetWidth, 0, 0);
		}
	}
	
	return false;
}

// #############################################################################
// internet explorer slide menu open left
function comenu_slide_left(menuid, intervalX, intervalY, clipX, clipY, opacity)
{
	menuobj = fetch_object(menuid);
	
	if (clipX < menuobj.offsetWidth || clipY < menuobj.offsetHeight)
	{
		clipX += intervalX;
		clipY += intervalY;
		  menuobj.style.clip = "rect(auto, " + clipX + "px, " + clipY + "px, auto)";
		slidetimer = setTimeout("comenu_slide_left('" + menuid + "', " + intervalX + ", " + intervalY + ", " + clipX + ", " + clipY + ");", 0);
	}
	else
	{
		clearTimeout(slidetimer);
	}
}

// #############################################################################
// internet explorer slide menu open right
function comenu_slide_right(menuid, intervalX, intervalY, clipX, clipY, opacity)
{
	menuobj = fetch_object(menuid);
	
	if (clipX > 0 || clipY < menuobj.offsetHeight)
	{
		clipX -= intervalX;
		clipY += intervalY;
		menuobj.style.clip = "rect(auto, " + menuobj.offsetWidth + "px, " + clipY + "px, " + clipX + "px)";
		slidetimer = setTimeout("comenu_slide_right('" + menuid + "', " + intervalX + ", " + intervalY + ", " + clipX + ", " + clipY + ", " + opacity + ");", 0);
	}
	else
	{
		clearTimeout(slidetimer);
	}
}

// #############################################################################
// function to navigate to the href of the first found <a> tag
function comenu_navtolink(e)
{
	childLinks = this.getElementsByTagName("a");
	if (childLinks[0])
	{
		if (is_ie)
		{
			// use this in IE to send HTTP_REFERER
			childLinks[0].click();
			window.event.cancelBubble = true;
		}
		else
		{
			// other browsers can use this
			if (e.shiftKey)
			{
				window.open(childLinks[0].href);
				e.stopPropagation();
				e.preventDefault();
				return false;
			}
			else
			{
				window.location = childLinks[0].href;
				e.stopPropagation();
				e.preventDefault();
				return false;
			}
		}
	}
}

// #############################################################################
// function to toggle the background class of a menu option
function comenu_switch_option_bg(e)
{
	if (is_moz)
	{
		moz_rclick(e);
	}
	comenu_hand_pointer(this);
}

// #############################################################################
// function to set the cursor to be pointer/hand
function comenu_hand_pointer(obj)
{
return 
	try
	{
		obj.style.cursor = "pointer";
	}
	catch(e)
	{
		obj.style.cursor = "hand";
	}
}

// #############################################################################
// function to initialize a single menu entry
function comenu_init(controlid) {
	//use global menu
//	menuid = comenu_getmenuid(controlid) + "_menu";
	menuid = comenu_getmenuid(controlid);
	menuobj = fetch_object(menuid);
	
	if (document.getElementsByTagName && menuobj)
	{
		// do control object
		controlobj = fetch_object(controlid);
		comenu_hand_pointer(controlobj);
		controlobj.unselectable = true;
		controlobj.onclick = comenu_eventhandler_click;
		controlobj.onmouseover = comenu_eventhandler_mouseover;
		
		// don't initialize the same popup menu twice
		if (comenu_initialized[menuid])
		{
			return;
		}
		
		// do popup menu object
		popupobj = fetch_object('navbar_help_menu');
		popupobj.style.display = "none";
		popupobj.style.position = "absolute";
		popupobj.style.left = "0px";
		popupobj.style.top = "0px";
		popupobj.onclick = e_by_gum;
		
		// reset inner table width
		tables = popupobj.getElementsByTagName("table");
		if (tables.length > 0)
		{
			tables[0].width = "";
		}
		
		// do menu options
		tds = popupobj.getElementsByTagName("td");
		for (var i = 0; i < tds.length; i++)
		{			
			try
			{
				links = tds[i].getElementsByTagName("a");
				for (var j = 0; j < links.length; j++)
				{
					if (!links[j].onclick)
					{
						links[j].onclick = e_by_gum;
					}
				}
			}
			catch(e)
			{
				// hmm
			}
		}
		
		comenu_initialized[menuid] = true;
	}
}

function returnfalse()
{
	return false;
}

function moz_rclick(e)
{
	if (e.type == 'mouseover')
	{
		document.onclick = '';
	}
	else
	{
		document.onclick = comenu_close;
	}
}