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).className = mh_items[itemId][3];
	mh_item_displayed[mh_item_displayed.length] = itemId;
}

function mh_hide_item (itemId) {
	$("mh_item" + itemId).className = mh_items[itemId][2];
}

function mh_display_menu (itemId) {
	var menuId = mh_items[itemId][0];
	if (!mh_allowReRender) {
		if (mh_menus[menuId][0] == -1)
			mh_allowReRender = true;
		return;
	}
	if (mh_menus[menuId][0] != -1)
		mh_allowReRender = false;
	if ((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];
		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];
		}
		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);
	}
}

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;
		$("mh_menu" + menuId).show ();
		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).className = mh_menus[menuId][6];
}

function mh_unhighlight_menu (menuId) {
	mh_set_menus_as_clear ();
	$("mh_menu" + menuId).className = 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 xPos = item.offsetLeft;
	var originalXPos = item.offsetLeft;
	var parentItem = item.offsetParent;
	while (parentItem != null) {
		if (parentItem.style.position == "absolute") {
			xPos = originalXPos;
			parentItem = null;
		}
		else {
			xPos += parentItem.offsetLeft;
			parentItem = parentItem.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 yPos = item.offsetTop;
	var originalYPos = item.offsetTop;
	var parentItem = item.offsetParent;
	while (parentItem != null) {
		if (parentItem.style.position == "absolute") {
			yPos = originalYPos;
			parentItem = null;
		}
		else {
			yPos += parentItem.offsetTop;
			parentItem = parentItem.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_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 ();
	}
	mh_menu_toBeCleared.length = 0;
	mh_item_toBeCleared.length = 0;
}

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