var _HcmIDCount = 0;
var _HcmIDName = 'HcmSubMenuID';
var _HcmTimeOut = null;
var _HcmCurrentItem = null;
var _HcmNoAction = new Object ();
var _HcmNoClick = new Object ();
var _HcmSplit = new Object ();
var _HcmItemList = new Array ();
var _HcmNodeProperties =
{
  	mainFolderLeft: '',
  	mainFolderRight: '',
	mainItemLeft: '',
	mainItemRight: '',

	folderLeft: '',
	folderRight: '',
	itemLeft: '',
	itemRight: '',
	mainSpacing: 0,
	subSpacing: 0,
	delay: 500
};
function HcmNewID ()
{
	return _HcmIDName + (++_HcmIDCount);
}
function HcmActionItem (item, prefix, isMain, idSub, orient, nodeProperties)
{
	_HcmItemList[_HcmItemList.length] = item;
	var index = _HcmItemList.length - 1;
	idSub = (!idSub) ? 'null' : ('\'' + idSub + '\'');
	orient = '\'' + orient + '\'';
	prefix = '\'' + prefix + '\'';
	return ' onmouseover="HcmItemMouseOver (this,' + prefix + ',' + isMain + ',' + idSub + ',' + orient + ',' + index + ')" onmouseout="HcmItemMouseOut (this,' + nodeProperties.delay + ')" onmousedown="HcmItemMouseDown (this,' + index + ')" onmouseup="HcmItemMouseUp (this,' + index + ')"';
}

function HcmNoClickItem (item, prefix, isMain, idSub, orient, nodeProperties)
{
	// var index = _HcmItemList.push (item) - 1;
	_HcmItemList[_HcmItemList.length] = item;
	var index = _HcmItemList.length - 1;
	idSub = (!idSub) ? 'null' : ('\'' + idSub + '\'');
	orient = '\'' + orient + '\'';
	prefix = '\'' + prefix + '\'';
	return ' onmouseover="HcmItemMouseOver (this,' + prefix + ',' + isMain + ',' + idSub + ',' + orient + ',' + index + ')" onmouseout="HcmItemMouseOut (this,' + nodeProperties.delay + ')"';
}

function HcmNoActionItem (item, prefix)
{
	return item[1];
}

function HcmSplitItem (prefix, isMain, vertical)
{
	var classStr = 'Hcm' + prefix;
	if (isMain)
	{
		classStr += 'Main';
		if (vertical)
			classStr += 'HSplit';
		else
			classStr += 'VSplit';
	}
	else
		classStr += 'HSplit';
	var item = eval (classStr);
	return HcmNoActionItem (item, prefix);
}

function HcmDrawSubMenu (subMenu, prefix, id, orient, nodeProperties)
{
	var str = '<div class="' + prefix + 'SubMenu" id="' + id + '"><table summary="sub menu" cellspacing="' + nodeProperties.subSpacing + '" class="' + prefix + 'SubMenuTable">';
	var strSub = '';

	var item;
	var idSub;
	var hasChild;

	var i;

	var classStr;

	for (i = 5; i < subMenu.length; ++i)
	{
		item = subMenu[i];
		if (!item)
			continue;

		hasChild = (item.length > 5);
		idSub = hasChild ? HcmNewID () : null;

		str += '<tr class="' + prefix + 'MenuItem"';
		if (item[0] != _HcmNoClick)
			str += HcmActionItem (item, prefix, 0, idSub, orient, nodeProperties);
		else
			str += HcmNoClickItem (item, prefix, 0, idSub, orient, nodeProperties);
		str += '>'

		if (item == _HcmSplit)
		{
			str += HcmSplitItem (prefix, 0, true);
			str += '</tr>';
			continue;
		}

		if (item[0] == _HcmNoAction || item[0] == _HcmNoClick)
		{
			str += HcmNoActionItem (item, prefix);
			str += '</tr>';
			continue;
		}

		classStr = prefix + 'Menu';
		classStr += hasChild ? 'Folder' : 'Item';

		str += '<td class="' + classStr + 'Left">';

		if (item[0] != null)
			str += item[0];
		else
			str += hasChild ? nodeProperties.folderLeft : nodeProperties.itemLeft;

		str += '<td class="' + classStr + 'Text">' + item[1];

		str += '<td class="' + classStr + 'Right">';

		if (hasChild)
		{
			str += nodeProperties.folderRight;
			strSub += HcmDrawSubMenu (item, prefix, idSub, orient, nodeProperties);
		}
		else
			str += nodeProperties.itemRight;
		str += '</td></tr>';
	}

	str += '</table></div>' + strSub;
	return str;
}

function HcmDraw (id, menu, orient, nodeProperties, prefix)
{
	var obj = HcmGetObject (id);

	if (!nodeProperties)
		nodeProperties = _HcmNodeProperties;
	if (!prefix)
		prefix = '';

	var str = '<table summary="main menu" class="' + prefix + 'Menu" cellspacing="' + nodeProperties.mainSpacing + '">';
	var strSub = '';

	if (!orient)
		orient = 'hbr';

	var orientStr = String (orient);
	var orientSub;
	var vertical;

	if (orientStr.charAt (0) == 'h')
	{
		orientSub = 'v' + orientStr.substr (1, 2);
		str += '<tr>';
		vertical = false;
	}
	else
	{
		orientSub = 'v' + orientStr.substr (1, 2);
		vertical = true;
	}

	var i;
	var item;
	var idSub;
	var hasChild;

	var classStr;

	for (i = 0; i < menu.length; ++i)
	{
		item = menu[i];

		if (!item)
			continue;

		str += vertical ? '<tr' : '<td class='+prefix+'CornerLeft></td><td';
		str += ' class="' + prefix + 'MainItem"';

		hasChild = (item.length > 5);
		idSub = hasChild ? HcmNewID () : null;

		str += HcmActionItem (item, prefix, 1, idSub, orient, nodeProperties) + '>';

		if (item == _HcmSplit)
		{
			str += HcmSplitItem (prefix, 1, vertical);
			str += vertical? '</tr>' : '</td>';
			continue;
		}

		if (item[0] == _HcmNoAction || item[0] == _HcmNoClick)
		{
			str += HcmNoActionItem (item, prefix);
			str += vertical? '</tr>' : '</td>';
			continue;
		}

		classStr = prefix + 'Main' + (hasChild ? 'Folder' : 'Item');

		str += item[1];

		str += vertical ? '</tr>' : '</td><td class='+prefix+'CornerRight></td>';

		if (hasChild)
			strSub += HcmDrawSubMenu (item, prefix, idSub, orientSub, nodeProperties);
	}
	if (!vertical)
		str += '</tr>';
	str += '</table>' + strSub;
	obj.innerHTML = str;
	//document.write ("<xmp>" + str + "</xmp>");
}

function HcmItemMouseOver (obj, prefix, isMain, idSub, orient, index)
{
	clearTimeout (_HcmTimeOut);

	if (!obj.HcmPrefix)
	{
		obj.HcmPrefix = prefix;
		obj.HcmIsMain = isMain;
	}

	var thisMenu = HcmGetThisMenu (obj, prefix);

	if (!thisMenu.HcmItems)
		thisMenu.HcmItems = new Array ();
	var i;
	for (i = 0; i < thisMenu.HcmItems.length; ++i)
	{
		if (thisMenu.HcmItems[i] == obj)
			break;
	}
	if (i == thisMenu.HcmItems.length)
	{
		//thisMenu.HcmItems.push (obj);
		thisMenu.HcmItems[i] = obj;
	}

	if (_HcmCurrentItem)
	{
		if (_HcmCurrentItem == thisMenu)
			return;

		var thatPrefix = _HcmCurrentItem.HcmPrefix;
		var thatMenu = HcmGetThisMenu (_HcmCurrentItem, thatPrefix);
		if (thatMenu != thisMenu.HcmParentMenu)
		{
			if (_HcmCurrentItem.HcmIsMain)
				_HcmCurrentItem.className = thatPrefix + 'MainItem';
			else
				_HcmCurrentItem.className = thatPrefix + 'MenuItem';
			if (thatMenu.id != idSub)
				HcmHideMenu (thatMenu, thisMenu, thatPrefix);
		}
	}
	_HcmCurrentItem = obj;
	HcmResetMenu (thisMenu, prefix);

	var item = _HcmItemList[index];
	var isDefaultItem = HcmIsDefaultItem (item);

	if (isDefaultItem)
	{
		if (isMain)
			obj.className = prefix + 'MainItemHover';
		else
			obj.className = prefix + 'MenuItemHover';
	}

	if (idSub)
	{
		var subMenu = HcmGetObject (idSub);
		HcmShowSubMenu (obj, prefix, subMenu, orient);
	}

	var descript = '';
	if (item.length > 4)
		descript = (item[4] != null) ? item[4] : (item[2] ? item[2] : descript);
	else if (item.length > 2)
		descript = (item[2] ? item[2] : descript);

	window.defaultStatus = descript;
}

function HcmItemMouseOut (obj, delayTime)
{
	if (!delayTime)
		delayTime = _HcmNodeProperties.delay;
	_HcmTimeOut = window.setTimeout ('HcmHideMenuTime ()', delayTime);
	window.defaultStatus = '';
}

function HcmItemMouseDown (obj, index)
{
	if (HcmIsDefaultItem (_HcmItemList[index]))
	{
		if (obj.HcmIsMain)
			obj.className = obj.HcmPrefix + 'MainItemActive';
		else
			obj.className = obj.HcmPrefix + 'MenuItemActive';
	}
}

function HcmItemMouseUp (obj, index)
{
	var item = _HcmItemList[index];

	var link = null, target = '_self';

	if (item.length > 2)
		link = item[2];
	if (item.length > 3 && item[3])
		target = item[3];

	if (link != null)
	{
		window.open (link, target);
	}

	var prefix = obj.HcmPrefix;
	var thisMenu = HcmGetThisMenu (obj, prefix);

	var hasChild = (item.length > 5);
	if (!hasChild)
	{
		if (HcmIsDefaultItem (item))
		{
			if (obj.HcmIsMain)
				obj.className = prefix + 'MainItem';
			else
				obj.className = prefix + 'MenuItem';
		}
		HcmHideMenu (thisMenu, null, prefix);
	}
	else
	{
		if (HcmIsDefaultItem (item))
		{
			if (obj.HcmIsMain)
				obj.className = prefix + 'MainItemHover';
			else
				obj.className = prefix + 'MenuItemHover';
		}
	}
}

function HcmMoveSubMenu (obj, subMenu, orient)
{
	var mode = String (orient);
	var p = subMenu.offsetParent;
	var subMenuWidth = HcmGetWidth (subMenu);
	var horiz = HcmGetHorizontalAlign (obj, mode, p, subMenuWidth);
	if (mode.charAt (0) == 'h')
	{
		if (mode.charAt (1) == 'b')
			subMenu.style.top = (HcmGetYAt (obj, p) + HcmGetHeight (obj)) + 'px';
		else
			subMenu.style.top = (HcmGetYAt (obj, p) - HcmGetHeight (subMenu)) + 'px';
		if (horiz == 'r')
			subMenu.style.left = (HcmGetXAt (obj, p)) + 'px';
		else
			subMenu.style.left = (HcmGetXAt (obj, p) + HcmGetWidth (obj) - subMenuWidth) + 'px';
	}
	else
	{
		if (horiz == 'r')
			subMenu.style.left = (HcmGetXAt (obj, p) + HcmGetWidth (obj)) + 'px';
		else
			subMenu.style.left = (HcmGetXAt (obj, p) - subMenuWidth) + 'px';
		if (mode.charAt (1) == 'b')
			subMenu.style.top = (HcmGetYAt (obj, p)) + 'px';
		else
			subMenu.style.top = (HcmGetYAt (obj, p) + HcmGetHeight (obj) - HcmGetHeight (subMenu)) + 'px';
	}
}
function HcmGetHorizontalAlign (obj, mode, p, subMenuWidth)
{
	var horiz = mode.charAt (2);
	if (!(document.body))
		return horiz;
	var body = document.body;
	var browserLeft;
	var browserRight;
	if (window.innerWidth)
	{
		browserLeft = window.pageXOffset;
		browserRight = window.innerWidth + browserLeft;
	}
	else if (body.clientWidth)
	{
		browserLeft = body.clientLeft;
		browserRight = body.clientWidth + browserLeft;
	}
	else
		return horiz;
	if (mode.charAt (0) == 'h')
	{
		if (horiz == 'r' && (HcmGetXAt (obj) + subMenuWidth) > browserRight)
			horiz = 'l';
		if (horiz == 'l' && (HcmGetXAt (obj) + HcmGetWidth (obj) - subMenuWidth) < browserLeft)
			horiz = 'r';
		return horiz;
	}
	else
	{
		if (horiz == 'r' && (HcmGetXAt (obj, p) + HcmGetWidth (obj) + subMenuWidth) > browserRight)
			horiz = 'l';
		if (horiz == 'l' && (HcmGetXAt (obj, p) - subMenuWidth) < browserLeft)
			horiz = 'r';
		return horiz;
	}
}
function HcmShowSubMenu (obj, prefix, subMenu, orient)
{
	if (!subMenu.HcmParentMenu)
	{
		var thisMenu = HcmGetThisMenu (obj, prefix);
		subMenu.HcmParentMenu = thisMenu;
		if (!thisMenu.HcmSubMenu)
			thisMenu.HcmSubMenu = new Array ();
		thisMenu.HcmSubMenu[thisMenu.HcmSubMenu.length] = subMenu;
	}

	HcmMoveSubMenu (obj, subMenu, orient);
	subMenu.style.visibility = 'visible';

	if (document.all)	// it is IE
	{
		if (!subMenu.HcmOverlap)
			subMenu.HcmOverlap = new Array ();
		HcmHideControl ("IFRAME", subMenu);
		HcmHideControl ("SELECT", subMenu);
		HcmHideControl ("OBJECT", subMenu);
	}
}

function HcmResetMenu (thisMenu, prefix)
{
	if (thisMenu.HcmItems)
	{
		var i;
		var str;
		var items = thisMenu.HcmItems;
		for (i = 0; i < items.length; ++i)
		{
			if (items[i].HcmIsMain)
				str = prefix + 'MainItem';
			else
				str = prefix + 'MenuItem';
			if (items[i].className != str)
				items[i].className = str;
		}
	}
}

function HcmHideMenuTime ()
{
	if (_HcmCurrentItem)
	{
		var prefix = _HcmCurrentItem.HcmPrefix;
		HcmHideMenu (HcmGetThisMenu (_HcmCurrentItem, prefix), null, prefix);
	}
}

function HcmHideMenu (thisMenu, currentMenu, prefix)
{
	var str = prefix + 'SubMenu';

	if (thisMenu.HcmSubMenu)
	{
		var i;
		for (i = 0; i < thisMenu.HcmSubMenu.length; ++i)
		{
			HcmHideSubMenu (thisMenu.HcmSubMenu[i], prefix);
		}
	}
	while (thisMenu && thisMenu != currentMenu)
	{
		HcmResetMenu (thisMenu, prefix);
		if (thisMenu.className == str)
		{
			thisMenu.style.visibility = 'hidden';
			HcmShowControl (thisMenu);
		}
		else
			break;
		thisMenu = HcmGetThisMenu (thisMenu.HcmParentMenu, prefix);
	}
}

function HcmHideSubMenu (thisMenu, prefix)
{
	if (thisMenu.style.visibility == 'hidden')
		return;
	if (thisMenu.HcmSubMenu)
	{
		var i;
		for (i = 0; i < thisMenu.HcmSubMenu.length; ++i)
		{
			HcmHideSubMenu (thisMenu.HcmSubMenu[i], prefix);
		}
	}
	HcmResetMenu (thisMenu, prefix);
	thisMenu.style.visibility = 'hidden';
	HcmShowControl (thisMenu);
}

function HcmHideControl (tagName, subMenu)
{
	var x = HcmGetX (subMenu);
	var y = HcmGetY (subMenu);
	var w = subMenu.offsetWidth;
	var h = subMenu.offsetHeight;

	var i;
	for (i = 0; i < document.all.tags(tagName).length; ++i)
	{
		var obj = document.all.tags(tagName)[i];
		if (!obj || !obj.offsetParent)
			continue;

		var ox = HcmGetX (obj);
		var oy = HcmGetY (obj);
		var ow = obj.offsetWidth;
		var oh = obj.offsetHeight;

		if (ox > (x + w) || (ox + ow) < x)
			continue;
		if (oy > (y + h) || (oy + oh) < y)
			continue;

		if(obj.style.visibility == "hidden")
			continue;

		subMenu.HcmOverlap[subMenu.HcmOverlap.length] = obj;
		obj.style.visibility = "hidden";
	}
}

function HcmShowControl (subMenu)
{
	if (subMenu.HcmOverlap)
	{
		var i;
		for (i = 0; i < subMenu.HcmOverlap.length; ++i)
			subMenu.HcmOverlap[i].style.visibility = "";
	}
	subMenu.HcmOverlap = null;
}

function HcmGetThisMenu (obj, prefix)
{
	var str1 = prefix + 'SubMenu';
	var str2 = prefix + 'Menu';
	while (obj)
	{
		if (obj.className == str1 || obj.className == str2)
			return obj;
		obj = obj.parentNode;
	}
	return null;
}

function HcmIsDefaultItem (item)
{
	if (item == _HcmSplit || item[0] == _HcmNoAction || item[0] == _HcmNoClick)
		return false;
	return true;
}

function HcmGetObject (id)
{
	if (document.all)
		return document.all[id];
	return document.getElementById (id);
}

function HcmGetWidth (obj)
{
	var width = obj.offsetWidth;
	if (width > 0 || !HcmIsTRNode (obj))
		return width;
	if (!obj.firstChild)
		return 0;
	return obj.lastChild.offsetLeft - obj.firstChild.offsetLeft + HcmGetWidth (obj.lastChild);
}
function HcmGetHeight (obj)
{
	var height = obj.offsetHeight;
	if (height > 0 || !HcmIsTRNode (obj))
		return height;
	if (!obj.firstChild)
		return 0;
	// use the first child's height
	return obj.firstChild.offsetHeight;
}

function HcmGetX (obj)
{
	var x = 0;

	do
	{
		x += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	while (obj);
	return x;
}

function HcmGetXAt (obj, elm)
{
	var x = 0;

	while (obj && obj != elm)
	{
		x += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	if (obj == elm)
		return x;
	return x - HcmGetX (elm);
}

function HcmGetY (obj)
{
	var y = 0;
	do
	{
		y += obj.offsetTop;
		obj = obj.offsetParent;
	}
	while (obj);
	return y;
}

function HcmIsTRNode (obj)
{
	var tagName = obj.tagName;
	return tagName == "TR" || tagName == "tr" || tagName == "Tr" || tagName == "tR";
}

function HcmGetYAt (obj, elm)
{
	var y = 0;

	if (!obj.offsetHeight && HcmIsTRNode (obj))
	{
		var firstTR = obj.parentNode.firstChild;
		obj = obj.firstChild;
		y -= firstTR.firstChild.offsetTop;
	}

	while (obj && obj != elm)
	{
		y += obj.offsetTop;
		obj = obj.offsetParent;
	}

	if (obj == elm)
		return y;
	return y - HcmGetY (elm);
}

function HcmGetProperties (obj)
{
	if (obj == undefined)
		return 'undefined';
	if (obj == null)
		return 'null';

	var msg = obj + ':\n';
	var i;
	for (i in obj)
		msg += i + ' = ' + obj[i] + '; ';
	return msg;
}

