var mh_timeoutId = 0;

var mh_menu_displayed = new Array ();
var mh_menu_toBeCleared = new Array ();
var mh_item_displayed = new Array ();
var mh_item_toBeCleared = new Array ();

var mh_allowReRender = true;

function mh_display_item (itemId) {
	mh_items[itemId][1] = true;
	$("mh_item" + itemId).removeClassName (mh_items[itemId][2]);
	$("mh_item" + itemId).addClassName (mh_items[itemId][3]);
	mh_item_displayed[mh_item_displayed.length] = itemId;
}

function mh_hide_item (itemId) {
	$("mh_item" + itemId).removeClassName (mh_items[itemId][3]);
	$("mh_item" + itemId).addClassName (mh_items[itemId][2]);
}

function mh_display_menu (itemId, forceDisplay, forceAllowReRender, alertIt) {
	if (forceDisplay === undefined)
		forceDisplay = false;

	var menuId = mh_items[itemId][0];



	if ((!mh_allowReRender) && (!forceAllowReRender)) {
		if (mh_menus[menuId][0] == -1)
			mh_allowReRender = true;
		return;
	}
	if (mh_menus[menuId][0] != -1)
		mh_allowReRender = false;

	if ((forceDisplay) || (mh_menus[menuId][1] != false) || (mh_menus[menuId][2] != false)) {

		for (count = 0; count < mh_item_displayed.length; count++) {
			mh_items[mh_item_displayed[count]][1] = false;
			mh_item_toBeCleared[mh_item_toBeCleared.length] = mh_item_displayed[count];
		}
		for (count = 0; count < mh_menu_displayed.length; count++) {
			mh_menus[mh_menu_displayed[count]][1] = false;
			mh_menu_toBeCleared[mh_menu_toBeCleared.length] = mh_menu_displayed[count];
		}
		mh_menu_displayed.length = 0;
		mh_item_displayed.length = 0;
		mh_menus[menuId][1] = true;
		mh_menu_displayed[mh_menu_displayed.length] = menuId;
		var tempItemId = mh_menus[menuId][0];
		var level = 0;
		while (tempItemId != -1) {
			mh_display_item (tempItemId);
			tempItemId = mh_items[tempItemId][0];
			mh_menus[tempItemId][1] = true;
			mh_menu_displayed[mh_menu_displayed.length] = tempItemId;
			tempItemId = mh_menus[tempItemId][0];
			level++;
		}
		tempItemId = mh_items[itemId][0];
		mh_highlight_menu (tempItemId);
		mh_display_item (itemId);
		for (var count = 0; count < mh_menus.length; count++){
			if (mh_menus[count][0] == itemId) {
				mh_draw_menu (count);
				break;
			}
		}
		mh_clear_menus (false);
	}

	show_menu_backgrounds (itemId);
}

function mh_draw_menu (menuId) {
	if (mh_menus[menuId][4] == true) {
		$("mh_menu" + menuId).style.position = "absolute";
//		$("mh_menu" + menuId).style.left = mh_get_x_position (menuId, $("mh_item" + mh_menus[menuId][0])) + "px";
//		$("mh_menu" + menuId).style.top = mh_get_y_position (menuId, $("mh_item" + mh_menus[menuId][0])) + "px";
		$("mh_menu" + menuId).style.zIndex = 10;
//		var newPos = mh_position_pixel_position_neatly_on_screen ($("mh_menu" + menuId).style.left, $("mh_menu" + menuId).style.top, $("mh_menu" + menuId).getWidth (), $("mh_menu" + menuId).getHeight ());
		$("mh_menu" + menuId).show ();
/**/
		var childElements = $("mh_menu" + menuId).childElements ();
		var width = 0;
		for (var count = 0; count < childElements.length; count++) {
			var childElement = childElements[count];
			var isVisible = childElement.visible ();
			childElement.show ();
			width += childElement.getWidth ();
			if (!isVisible)
				childElement.hide ();
		}
//		$("mh_menu" + menuId).style.width = width + 'px';
/**/
		$("mh_menu" + menuId).style.left = mh_get_x_position (menuId, $("mh_item" + mh_menus[menuId][0])) + "px";
		$("mh_menu" + menuId).style.top = mh_get_y_position (menuId, $("mh_item" + mh_menus[menuId][0])) + "px";

		var newPos = mh_position_pixel_position_neatly_on_screen ($("mh_menu" + menuId).style.left, $("mh_menu" + menuId).style.top, $("mh_menu" + menuId).getWidth (), $("mh_menu" + menuId).getHeight ());
		$("mh_menu" + menuId).style.left = newPos.x + "px";
		$("mh_menu" + menuId).style.top = newPos.y + "px";

		mh_menus[menuId][2] = true;
		mh_menus[menuId][1] = true;
		mh_hide_select_inputs ();
	}
	mh_menu_displayed[mh_menu_displayed.length] = menuId;
}

function mh_highlight_menu (menuId) {
	if (mh_menus[menuId][1] == true)
		$("mh_menu" + menuId).addClassName (mh_menus[menuId][6]);
}

function mh_unhighlight_menu (menuId) {
	mh_set_menus_as_clear ();
	$("mh_menu" + menuId).addClassName (mh_menus[menuId][5]);
}

function mh_hide_menu (menuId) {
	if (mh_menus[menuId][3] == false) {
		$("mh_menu" + menuId).style.zIndex = 8;
		$("mh_menu" + menuId).hide ();
		mh_menus[menuId][2] = false;
	}
}

function mh_get_x_position (menuId, item) {
	parentItemId = mh_menus[menuId][0];
	if (mh_items[parentItemId][10] != -1)
		return mh_items[parentItemId][10];
	var temp = item.cumulativeOffset ();
	var xPos = temp[0];
	var parentElement = $(item);
	while (parentElement != null) {
		if ((parentElement.getStyle ("position") == "relative") || (parentElement.getStyle ("position") == "absolute")) {
			var temp = parentElement.cumulativeOffset ();
			xPos -= temp[0];
			parentElement = null;
		}
		else
			parentElement = $(parentElement.offsetParent);
	}
	var sourceElement = item;
	var destElement = $("mh_menu" + menuId);
	if (sourceElement.visible ())
		var sourceElementDimensions = sourceElement.getDimensions ();
	else {
		// force the sourceElement's width to be determined properly,
		// because prototype doesn't handle the width of divs with borders correctly when the object is hidden
		sourceElement.show ();
		var sourceElementDimensions = sourceElement.getDimensions ();
		sourceElement.hide ();
	}
	if (mh_items[parentItemId][4] == "middle")
		xPos += Math.round (sourceElementDimensions.width / 2);
	else if (mh_items[parentItemId][4] == "right")
		xPos += sourceElementDimensions.width;
	// adjust based on the destination element's dimensions
	if (destElement.visible ())
		destElementDimensions = destElement.getDimensions ();
	else {
		// force the destElement's width to be determined properly,
		// because prototype doesn't handle the width of divs with borders correctly when the object is hidden
		destElement.show ();
		destElementDimensions = destElement.getDimensions ();
		destElement.hide ();
	}
	if (mh_items[parentItemId][6] == "middle")
		xPos -= Math.round (destElementDimensions.width / 2);
	else if (mh_items[parentItemId][6] == "right")
		xPos -= destElementDimensions.width;
	// adjust the relative position via the given offsets
	if (mh_items[parentItemId][8] != undefined)
		xPos += mh_items[parentItemId][8];
	return xPos;
}

function mh_get_y_position (menuId, item) {
	parentItemId = mh_menus[menuId][0];
	if (mh_items[parentItemId][11] != -1)
		return mh_items[parentItemId][11];
	var temp = item.cumulativeOffset ();
	var yPos = temp[1];
	var parentElement = $(item);
	while (parentElement != null) {
		if ((parentElement.getStyle ("position") == "relative") || (parentElement.getStyle ("position") == "absolute")) {
			var temp = parentElement.cumulativeOffset ();
			yPos -= temp[1];
			parentElement = null;
		}
		else
			parentElement = $(parentElement.offsetParent);
	}
	var sourceElement = item;
	var destElement = $("mh_menu" + menuId);
	if (sourceElement.visible ())
		var sourceElementDimensions = sourceElement.getDimensions ();
	else {
		// force the sourceElement's height to be determined properly,
		// because prototype doesn't handle the height of divs with borders correctly when the object is hidden
		sourceElement.show ();
		var sourceElementDimensions = sourceElement.getDimensions ();
		sourceElement.hide ();
	}
	if (mh_items[parentItemId][5] == "middle")
		yPos += Math.round (sourceElementDimensions.height / 2);
	else if (mh_items[parentItemId][5] == "bottom")
		yPos += sourceElementDimensions.height;
	// adjust based on the destination element's dimensions
	if (destElement.visible ())
		destElementDimensions = destElement.getDimensions ();
	else {
		// force the destElement's height to be determined properly,
		// because prototype doesn't handle the height of divs with borders correctly when the object is hidden
		destElement.show ();
		destElementDimensions = destElement.getDimensions ();
		destElement.hide ();
	}
	if (mh_items[parentItemId][7] == "middle")
		yPos -= Math.round (destElementDimensions.height / 2);
	else if (mh_items[parentItemId][7] == "bottom")
		yPos -= destElementDimensions.height;
	// adjust the relative position via the given offsets
	if (mh_items[parentItemId][9] != undefined)
		yPos += mh_items[parentItemId][9];
	return yPos;
}

function mh_position_pixel_position_neatly_on_screen (newElementX, newElementY, newElementWidth, newElementHeight) {
	var destX = parseInt (newElementX);
	var destY = parseInt (newElementY);
	var viewportDimensions = document.viewport.getDimensions ();
	var viewportScrollOffsets = document.viewport.getScrollOffsets ();
	if (parseInt (destX) + newElementWidth > viewportScrollOffsets.left + viewportDimensions.width)
		destX = viewportScrollOffsets.left + viewportDimensions.width - newElementWidth;
	if (parseInt (destY) + newElementHeight > viewportScrollOffsets.top + viewportDimensions.height)
		destY = viewportScrollOffsets.top + viewportDimensions.height - newElementHeight;
//	if (destX < 0)
//		destX = 0;
//	if (destY < 0)
//		destY = 0;
	return {x: destX, y: destY};
}
function mh_set_menus_as_clear (menuId) {
	for (var count = 0; count < mh_item_displayed.length; count++)
		mh_items[mh_item_displayed[count]][1] = false;
	for (var count = 0; count < mh_menu_displayed.length; count++)
		mh_menus[mh_menu_displayed[count]][1] = false;
	clearTimeout (mh_timeoutId);
	mh_timeoutId = setTimeout ("mh_clear_menus (true)", 750);
}

function mh_clear_menus (clearVisible) {
	clearTimeout (mh_timeoutId);
	for (var count = 0; count < mh_item_toBeCleared.length; count++) {
		var count2 = mh_item_toBeCleared[count];
		if (mh_items[count2][1] == false)
			mh_hide_item (count2);
	}
	for (var count = 0; count < mh_menu_toBeCleared.length; count++) {
		var count2 = mh_menu_toBeCleared[count];
		if ((mh_menus[count2][3] == false) && (mh_menus[count2][1] == false) && (mh_menus[count2][2] == true))
			mh_hide_menu (count2);
	}
	if (clearVisible) {
		for (var count = 0; count < mh_item_displayed.length; count++) {
			var count2 = mh_item_displayed[count];
			if (mh_items[count2][1] == false)
				mh_hide_item (count2);
		}
		for (var count = 0; count < mh_menu_displayed.length; count++) {
			var count2 = mh_menu_displayed[count];
			if ((mh_menus[count2][3] == false) && (mh_menus[count2][1] == false) && (mh_menus[count2][2] == true)) {
				mh_hide_menu (count2);
			}
		}
		mh_show_select_inputs ();

		// hide the menu background
//		show_menu_backgrounds (currentMenuItemId);
		display_default_menu (currentMenuItemId);
	}
	mh_menu_toBeCleared.length = 0;
	mh_item_toBeCleared.length = 0;
}

function mh_hide_all_menus () {
	for (var count = 0; count < mh_item_displayed.length; count++)
		mh_hide_item (mh_item_displayed[count]);
	for (var count = 0; count < mh_menu_displayed.length; count++) {
		var count2 = mh_menu_displayed[count];
		if (mh_menus[count2][3] == false)
			mh_hide_menu (count2);
	}
	mh_show_select_inputs ();

	// hide the menu background
//	show_menu_backgrounds (currentMenuItemId);
	display_default_menu (currentMenuItemId);
}

function mh_show_select_inputs () {
	var elements = document.getElementsByTagName ("select");
	for (var i = 0; i < elements.length; i++){
		elements[i].style.visibility = "visible";
	}
}

function mh_hide_select_inputs () {
	var elements = document.getElementsByTagName ("select");
	for (var i = 0; i < elements.length; i++) {
		elements[i].style.visibility = "hidden";
	}
}


function show_menu_backgrounds (itemId) {



	var foundChildMenu = false;
	var level = 0;

	if (mh_items[itemId] !== undefined) {
		var menuId = mh_items[itemId][0];

		// find out how deep the given menu item is
//		if ((mh_menus[menuId][1] != false) || (mh_menus[menuId][2] != false)) {

			var tempItemId = mh_menus[menuId][0];
			while (tempItemId != -1) {
				tempItemId = mh_items[tempItemId][0];
				tempItemId = mh_menus[tempItemId][0];
				level++;
			}
			tempItemId = mh_items[itemId][0];
			for (var count = 0; count < mh_menus.length; count++){
				if (mh_menus[count][0] == itemId) {
					foundChildMenu = true;
					break;
				}
			}
//		}

		// show the child menu background if there is a child menu
		if (foundChildMenu)
			level++;
	}


	// hide unwanted menu backgrounds
	tempLevel = 5;
	while (tempLevel > level) {
		if ($('subMenuContainer' + (tempLevel)))
			$('subMenuContainer' + (tempLevel)).hide ();
		tempLevel--;
	}

	// show the desired menu backgrounds
	while (level > 0) {
		if ($('subMenuContainer' + (level))) {

			var temp = $('subMenuBase').cumulativeOffset ();
			var xPos = temp[0];
			var yPos = temp[1];

			var sourceElementDimensions = $('subMenuBase').getDimensions ();
			yPos += sourceElementDimensions.height;

			var sourceElementDimensions = $('subMenuContainer' + (level)).getDimensions ();
			yPos += (level - 1) * sourceElementDimensions.height;

			$('subMenuContainer' + (level)).setStyle ({'left': xPos + 'px', 'top': yPos + 'px' });
//			$('subMenuContainer' + (level)).style.left = xPos + 'px';
//			$('subMenuContainer' + (level)).style.top = yPos + 'px';
			$('subMenuContainer' + (level)).show ();
		}
		level--;
	}

	return true;
}

function display_default_menu (itemId) {

	var path = new Array ();

	if (mh_items[itemId] !== undefined) {

		path[path.length] = itemId;

		var menuId = mh_items[itemId][0];
		var tempItemId = mh_menus[menuId][0];
		while (tempItemId != -1) {
			path[path.length] = tempItemId;
			tempItemId = mh_items[tempItemId][0];
			tempItemId = mh_menus[tempItemId][0];
		}
	}

	path.shift ();	// don't worry about trying to display the last menuItem,  it isn't necessary because the item will be shown when it's parent menuItem's menu is shown
	while (path.length > 1)
		path.shift ();	// only show 2 levels of menu

	var count2 = 0;
	for (count = path.length - 1; count >= 0; count--)
		mh_display_menu (path[count], undefined, true, true);

	return true;
}

function highlight_selected_menu_items (itemId) {

	if (mh_items[itemId] !== undefined) {

		$("mh_item" + itemId).addClassName ('selected');

		var menuId = mh_items[itemId][0];
		var tempItemId = mh_menus[menuId][0];
		while (tempItemId != -1) {

			$("mh_item" + tempItemId).addClassName ('selected');
			tempItemId = mh_items[tempItemId][0];
			tempItemId = mh_menus[tempItemId][0];
		}
	}

	return true;
}
