/*

	PointAsia.com

	Project:
		MCS - Mobile Convergence Solutions

	File name:
		menu_engine.js

	Description:
		DHTML menu engine script file.

	Limitation:
		for Internet Explorer 5+ only.

*/

/*
	__INTRN_MenuPopup internal class
*/

function __INTRN_MENU_showMenuPopup(menuId)
{
	var layer = document.all[menuId];
	layer.menuPopup.menuEngine.showMenuPopup(menuId);
}

function __INTRN_MENU_hideMenuPopup(menuId)
{
	var layer = document.all[menuId];
	layer.menuPopup.menuEngine.hideMenuPopup(menuId);
}

function __INTRN_MENU_showSubMenuPopup(menuId, itemIndex)
{
	var parentLayer;
	var menuItem, menuItemElement, menuItemRect;
	var subMenuId, subMenuLayer;
	parentLayer = document.all[menuId];
	menuItem = parentLayer.menuPopup.itemList[itemIndex];
	menuItemElement = document.all[menuItem.itemId];
	menuItemRect = menuItemElement.getBoundingClientRect();
	subMenuId = menuItem.subMenuPopup.menuId;
	subMenuLayer = document.all[subMenuId];
	subMenuLayer.style.pixelLeft = window.document.body.scrollLeft + menuItemRect.right - 8;
	subMenuLayer.style.pixelTop = window.document.body.scrollTop + menuItemRect.top;
	__INTRN_MENU_showMenuPopup(subMenuId);
}

function __INTRN_MENU_setMenuItemHilite(menuId, itemId, isHilite)
{
	var parentLayer;
	var menuItemElement;
	var menuEngine;
	parentLayer = document.all[menuId];
	menuEngine = parentLayer.menuPopup.menuEngine;
	menuItemElement = document.all[itemId];
	if (isHilite) {
		menuItemElement.style.backgroundColor = menuEngine.bgColorHilite;
		menuItemElement.style.color = menuEngine.fgColorHilite;
	} else {
		menuItemElement.style.backgroundColor = menuEngine.bgColor;
		menuItemElement.style.color = menuEngine.fgColor;
	}
}

function __INTRN_MenuPopup_traceMouseOverEvent()
{
	var content = "";
	if (this.menuParent) content += this.menuParent.traceMouseOverEvent();
	content += "__INTRN_MENU_showMenuPopup('" + this.menuId + "');";
	return content;
}

function __INTRN_MenuPopup_traceMouseOutEvent()
{
	var content = "";
	content += "__INTRN_MENU_hideMenuPopup('" + this.menuId + "');";
	if (this.menuParent) content += this.menuParent.traceMouseOutEvent();
	return content;
}

function __INTRN_MenuPopup_composeMenuItem(itemIndex)
{
	var content = "";
	var menuItem = this.itemList[itemIndex];
	var menuEngine = this.menuEngine;
	var mouseOverEvent = "", mouseOutEvent = "";
	var baseStyle = menuEngine.fontStyle + "background-color:" + menuEngine.bgColor + ";color:" + menuEngine.fgColor + ";width:100%;";
	switch (menuItem.itemStyle) {
		default:
		case -1: // separator
			content += "<SPAN STYLE=\"" + baseStyle + menuEngine.menuSeparatorStyle + "\">" + menuEngine.menuSeparator + "</SPAN>";
			break;
		case 0: // static content
			content += "<SPAN STYLE=\"" + baseStyle + menuEngine.menuContentStyle + "\">" + menuItem.itemCaption + "</SPAN>";
			break;
		case 1: // menu item
			mouseOverEvent = "__INTRN_MENU_setMenuItemHilite('" + this.menuId + "', '" + menuItem.itemId + "', true);";
			mouseOutEvent = "__INTRN_MENU_setMenuItemHilite('" + this.menuId + "', '" + menuItem.itemId + "', false);";
			if (this.itemList[itemIndex].subMenuPopup) {
				mouseOverEvent += "__INTRN_MENU_showSubMenuPopup('" + this.menuId + "', " + itemIndex + ");";
				mouseOutEvent += "__INTRN_MENU_hideMenuPopup('" + this.itemList[itemIndex].subMenuPopup.menuId + "');";
			}
			content += "<A HREF=\"" + menuItem.itemAction + "\" STYLE=\"text-decoration:none;\">";
			content += "<SPAN ID=\"" + menuItem.itemId + "\" STYLE=\"" + baseStyle + menuEngine.menuItemStyle + "\" onMouseOver=\"" + mouseOverEvent + "\" onMouseOut=\"" + mouseOutEvent + "\">";
			content += this.itemList[itemIndex].itemCaption;
			if (menuItem.subMenuPopup) content += menuEngine.subMenuIndicator;
			content += "</SPAN>";
			content += "</A>";
			break;
	}
	return content;
}

function __INTRN_MenuPopup_composeMenuPopup()
{
	var content = "";
	var menuEngine = this.menuEngine;
	var mouseOverEvent = "", mouseOutEvent = "";
	var baseStyle;
	var i;
	mouseOverEvent = this.traceMouseOverEvent();
	mouseOutEvent = this.traceMouseOutEvent();
	baseStyle = "position:absolute;visibility:hidden;background-color:" + menuEngine.bgColor + ";color:" + menuEngine.fgColor + ";filter:alpha(opacity=100);";
	content += "<SPAN ID=\"" + this.menuId + "\" STYLE=\"" + baseStyle + menuEngine.menuPopupStyle + "\" onMouseOver=\"" + mouseOverEvent + "\" onMouseOut=\"" + mouseOutEvent + "\">\n";
	content += "<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR=\"" + menuEngine.bgColor + "\">\n";
	for (i = 0; i < this.itemList.length; i++) content += "<TR><TD>" + this.composeMenuItem(i) + "</TD></TR>\n";
	content += "</TABLE>\n";
	content += "</SPAN>\n";
	for (i = 0; i < this.itemList.length; i++) {
		if (this.itemList[i].subMenuPopup) content += this.itemList[i].subMenuPopup.composeMenuPopup();
	}
	return content;
}

function __INTRN_MenuPopup_activate()
{
	var i, layer, rect;
	layer = document.all[this.menuId];
	layer.menuPopup = this;
	rect = layer.getBoundingClientRect();
	layer.realWidth = rect.right - rect.left;
	layer.realHeight = rect.bottom - rect.top;
	layer.deltaWidth = Math.max(Math.floor(layer.realWidth * 0.16), 2);
	layer.deltaHeight = Math.max(Math.floor(layer.realHeight * 0.16), 2);
	switch (this.menuEffect) {
		case 1:
			layer.clipWidth = layer.realWidth;
			layer.clipHeight = 0;
			break;
		case 2:
			layer.clipWidth = 0;
			layer.clipHeight = layer.realHeight;
			break;
		case 3:
			layer.clipWidth = 0;
			layer.clipHeight = 0;
			break;
		case 4:
			layer.filters.alpha.opacity = 0;
			break;
	}
	for (i = 0; i < this.itemList.length; i++) {
		if (this.itemList[i].subMenuPopup) this.itemList[i].subMenuPopup.activate();
	}
}

function __INTRN_MenuPopup_addItem(itemStyle, itemAction, itemCaption, isSubMenuPopup, menuEffect)
{
	var itemIndex = this.itemList.length;
	var menuItem = new Object();
	menuItem.itemId = this.menuId + "item" + itemIndex;
	menuItem.itemStyle = itemStyle;
	menuItem.itemAction = itemAction;
	menuItem.itemCaption = itemCaption;
	menuItem.subMenuPopup = isSubMenuPopup ? new __INTRN_MenuPopup(this.menuId + "sub" + itemIndex, this, menuEffect) : null;
	this.itemList[itemIndex] = menuItem;
	return menuItem.subMenuPopup;
}

function __INTRN_MenuPopup(menuId, menuParent, menuEffect, menuEngine)
{
	this.traceMouseOverEvent = __INTRN_MenuPopup_traceMouseOverEvent;
	this.traceMouseOutEvent = __INTRN_MenuPopup_traceMouseOutEvent;
	this.composeMenuItem = __INTRN_MenuPopup_composeMenuItem;
	this.composeMenuPopup = __INTRN_MenuPopup_composeMenuPopup;
	this.activate = __INTRN_MenuPopup_activate;
	this.addItem = __INTRN_MenuPopup_addItem;
	this.itemList = new Array();
	this.itemList.length = 0;
	this.menuId = menuId;
	this.menuParent = menuParent;
	this.menuEffect = menuEffect >= 0 && menuEffect <= 4 ? menuEffect : 0;
	this.menuEngine = menuParent ? menuParent.menuEngine : menuEngine;
	return this;
}

/*
	MenuEngine class
*/

function MenuEngine_getTimer(timerType, menuId)
{
	var timerName = timerType + "_" + menuId;
	return this.timerList[timerName];
}

function MenuEngine_setTimer(timerType, menuId, timerId)
{
	var timerName = timerType + "_" + menuId;
	if (this.timerList[timerName]) window.clearInterval(this.timerList[timerName]);
	this.timerList[timerName] = timerId;
}

function MenuEngine_getDelayedTimer(timerType, menuId)
{
	var timerName = timerType + "_" + menuId;
	return this.delayedTimerList[timerName];
}

function MenuEngine_setDelayedTimer(timerType, menuId, timerId)
{
	var timerName = timerType + "_" + menuId;
	if (this.delayedTimerList[timerName]) window.clearTimeout(this.delayedTimerList[timerName]);
	this.delayedTimerList[timerName] = timerId;
}

function MenuEngine_cancelShow(menuId)
{
	this.setTimer("show", menuId, null);
	this.setDelayedTimer("show", menuId, null);
}

function MenuEngine_cancelHide(menuId)
{
	this.setTimer("hide", menuId, null);
	this.setDelayedTimer("hide", menuId, null);
}

function MenuEngine_showMenuPopup(menuId)
{
	var layer = document.all[menuId];
	var timerId;
	var effect;
	var code;
	var isHiding;
	var isVisible;
	isHiding = (this.getTimer("hide", menuId) ? true : false) || (this.getDelayedTimer("hide", menuId) ? true : false);
	this.cancelHide(menuId);
	isVisible = (this.getTimer("show", menuId) ? true : false) || (this.getDelayedTimer("show", menuId) ? true : false);
	if (!isVisible) isVisible = isVisible || layer.style.visibility == "visible";
	if (!isVisible || isHiding) {
		effect = layer.menuPopup.menuEffect;
		code = "__MENU_showMenuPopup_" + effect + "(\"" + menuId + "\");";
		timerId = window.setTimeout(code, isHiding ? 0 : this.showDelay);
		this.setDelayedTimer("show", menuId, timerId);
	}
}

function MenuEngine_hideMenuPopup(menuId)
{
	var layer = document.all[menuId];
	var timerId;
	var effect;
	var code
	var isShowing;
	var isHidden;
	isShowing = (this.getTimer("show", menuId) ? true : false) || (this.getDelayedTimer("show", menuId) ? true : false);
	this.cancelShow(menuId);
	isHidden = (this.getTimer("hide", menuId) ? true : false) || (this.getDelayedTimer("hide", menuId) ? true : false);
	if (!isHidden) isHidden = isHidden || layer.style.visibility == "hidden";
	if (!isHidden || isShowing) {
		effect = layer.menuPopup.menuEffect;
		code = "__MENU_hideMenuPopup_" + effect + "(\"" + menuId + "\");";
		timerId = window.setTimeout(code, isShowing ? 50 : this.hideDelay);
		this.setDelayedTimer("hide", menuId, timerId);
	}
}

function MenuEngine_composeHTML()
{
	var i;
	var content;
	if (document.all) {
		for (i = 0; i < this.menuList.length; i++) {
			content = this.menuList[i].composeMenuPopup();
			document.writeln(content);
		}
		for (i = 0; i < this.menuList.length; i++) this.menuList[i].activate();
	}
}

function MenuEngine_addMenu(menuName, menuEffect)
{
	var menuIndex = this.menuList.length;
	var menuId = menuName;
	var menuPopup = new __INTRN_MenuPopup(menuId, null, menuEffect, this);
	this.menuList[menuIndex] = menuPopup;
	return menuPopup;
}

function MenuEngine_showMenu(menuName, left, top)
{
	var menuId = menuName;
	var layer;
	if (document.all) {
		layer = document.all[menuId];
		layer.style.pixelLeft = left;
		layer.style.pixelTop = top;
		this.showMenuPopup(menuId);
	}
}

function MenuEngine_hideMenu(menuName)
{
	var menuId = menuName;
	if (document.all) this.hideMenuPopup(menuId);
}

function MenuEngine()
{
	this.getTimer = MenuEngine_getTimer;
	this.setTimer = MenuEngine_setTimer;
	this.getDelayedTimer = MenuEngine_getDelayedTimer;
	this.setDelayedTimer = MenuEngine_setDelayedTimer;
	this.cancelShow = MenuEngine_cancelShow;
	this.cancelHide = MenuEngine_cancelHide;
	this.showMenuPopup = MenuEngine_showMenuPopup;
	this.hideMenuPopup = MenuEngine_hideMenuPopup;
	this.composeHTML = MenuEngine_composeHTML;
	this.addMenu = MenuEngine_addMenu;
	this.showMenu = MenuEngine_showMenu;
	this.hideMenu = MenuEngine_hideMenu;
	this.menuList = new Array();
	this.menuList.length = 0;
	this.timerList = new Object();
	this.delayedTimerList = new Object();
	this.showDelay = 30;
	this.hideDelay = 160;
	this.showInterval = 20;
	this.hideInterval = 20;
	this.bgColor = "#E0E0E0";
	this.fgColor = "#000000";
	this.bgColorHilite = "#A0A0A0";
	this.fgColorHilite = "#000000";
	this.fontStyle = "font-face:Microsoft Sans Serif, MS Sans Serif;font-size:x-small;font-weight:normal;";
	this.menuPopupStyle = "border:2px outset;";
	this.menuItemStyle = "padding:4px 8px;cursor:hand;";
	this.menuContentStyle = "padding:4px 8px;";
	this.menuSeparatorStyle = "padding:4px 8px;";
	this.menuSeparator = "<HR WIDTH=90%>";
	this.subMenuIndicator = "&nbsp;...";
	return this;
}

/*
	Menu effect support functions
*/

/* effect 0: no effect */

function __MENU_showMenuPopup_0(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	layer.style.visibility = "visible";
	menuEngine.cancelShow(menuId);
}

function __MENU_hideMenuPopup_0(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	layer.style.visibility = "hidden";
	menuEngine.cancelHide(menuId);
}

/* effect 1: down sliding */

function __MENU_showMenuPopup_1(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	if (layer.clipHeight <= 0) layer.clipHeight = layer.deltaHeight;
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	layer.style.visibility = "visible";
	timerId = window.setInterval("__MENU_showMenuPopup_1_step(\"" + menuId + "\");", menuEngine.showInterval);
	menuEngine.setDelayedTimer("show", menuId, null);
	menuEngine.setTimer("show", menuId, timerId);
}

function __MENU_showMenuPopup_1_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	layer.clipHeight <<= 1;
	if (layer.clipHeight >= layer.realHeight) {
		layer.clipHeight = layer.realHeight;
		finished = true;
	}
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	if (finished) {
		menuEngine.cancelShow(menuId);
	}
}

function __MENU_hideMenuPopup_1(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	timerId = window.setInterval("__MENU_hideMenuPopup_1_step(\"" + menuId + "\");", menuEngine.hideInterval);
	menuEngine.setDelayedTimer("hide", menuId, null);
	menuEngine.setTimer("hide", menuId, timerId);
}

function __MENU_hideMenuPopup_1_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	if (layer.clipHeight > layer.deltaHeight)
		layer.clipHeight >>= 1;
	else
		layer.clipHeight = 0;
	if (layer.clipHeight <= 0) {
		layer.clipHeight = 0;
		finished = true;
	}
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	if (finished) {
		layer.clipHeight = 0;
		layer.style.visibility = "hidden";
		menuEngine.cancelHide(menuId);
	}
}

/* effect 2: right sliding */

function __MENU_showMenuPopup_2(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	if (layer.clipWidth <= 0) layer.clipWidth = layer.deltaWidth;
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	layer.style.visibility = "visible";
	timerId = window.setInterval("__MENU_showMenuPopup_2_step(\"" + menuId + "\");", menuEngine.showInterval);
	menuEngine.setDelayedTimer("show", menuId, null);
	menuEngine.setTimer("show", menuId, timerId);
}

function __MENU_showMenuPopup_2_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	layer.clipWidth <<= 1;
	if (layer.clipWidth >= layer.realWidth) {
		layer.clipWidth = layer.realWidth;
		finished = true;
	}
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	if (finished) {
		menuEngine.cancelShow(menuId);
	}
}

function __MENU_hideMenuPopup_2(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	timerId = window.setInterval("__MENU_hideMenuPopup_2_step(\"" + menuId + "\");", menuEngine.hideInterval);
	menuEngine.setDelayedTimer("hide", menuId, null);
	menuEngine.setTimer("hide", menuId, timerId);
}

function __MENU_hideMenuPopup_2_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	if (layer.clipWidth > layer.deltaWidth)
		layer.clipWidth >>= 1;
	else
		layer.clipWidth = 0;
	if (layer.clipWidth <= 0) {
		layer.clipWidth = 0;
		finished = true;
	}
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	if (finished) {
		layer.clipWidth = 0;
		layer.style.visibility = "hidden";
		menuEngine.cancelHide(menuId);
	}
}

/* effect 3: right and down unfolding */

function __MENU_showMenuPopup_3(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	if (layer.clipWidth <= 0) layer.clipWidth = layer.deltaWidth;
	if (layer.clipHeight <= 0) layer.clipHeight = layer.deltaHeight;
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	layer.style.visibility = "visible";
	timerId = window.setInterval("__MENU_showMenuPopup_3_step(\"" + menuId + "\");", menuEngine.showInterval);
	menuEngine.setDelayedTimer("show", menuId, null);
	menuEngine.setTimer("show", menuId, timerId);
}

function __MENU_showMenuPopup_3_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	layer.clipWidth <<= 1;
	layer.clipHeight <<= 1;
	if (layer.clipWidth >= layer.realWidth || layer.clipHeight >= layer.realHeight) {
		layer.clipWidth = layer.realWidth;
		layer.clipHeight = layer.realHeight;
		finished = true;
	}
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	if (finished) {
		menuEngine.cancelShow(menuId);
	}
}

function __MENU_hideMenuPopup_3(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	timerId = window.setInterval("__MENU_hideMenuPopup_3_step(\"" + menuId + "\");", menuEngine.hideInterval);
	menuEngine.setDelayedTimer("hide", menuId, null);
	menuEngine.setTimer("hide", menuId, timerId);
}

function __MENU_hideMenuPopup_3_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	if (layer.clipWidth > layer.deltaWidth)
		layer.clipWidth >>= 1;
	else
		layer.clipWidth = 0;
	if (layer.clipHeight > layer.deltaHeight)
		layer.clipHeight >>= 1;
	else
		layer.clipHeight = 0;
	if (layer.clipWidth <= 0 || layer.clipHeight <= 0) {
		layer.clipWidth = 0;
		layer.clipHeight = 0;
		finished = true;
	}
	layer.style.clip = "rect(0px " + layer.clipWidth + "px " + layer.clipHeight + "px 0px)";
	if (finished) {
		layer.clipWidth = 0;
		layer.clipHeight = 0;
		layer.style.visibility = "hidden";
		menuEngine.cancelHide(menuId);
	}
}

/* effect 4: alpha fading */

function __MENU_showMenuPopup_4(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	var opacity = layer.filters.alpha.opacity;
	if (opacity <= 0) opacity = 16;
	layer.filters.alpha.opacity = opacity;
	layer.style.visibility = "visible";
	timerId = window.setInterval("__MENU_showMenuPopup_4_step(\"" + menuId + "\");", menuEngine.showInterval);
	menuEngine.setDelayedTimer("show", menuId, null);
	menuEngine.setTimer("show", menuId, timerId);
}

function __MENU_showMenuPopup_4_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	var opacity = layer.filters.alpha.opacity;
	opacity <<= 1;
	if (opacity >= 100) {
		opacity = 100;
		finished = true;
	}
	layer.filters.alpha.opacity = opacity;
	if (finished) {
		menuEngine.cancelShow(menuId);
	}
}

function __MENU_hideMenuPopup_4(menuId)
{
	var layer = document.all[menuId];
	var menuEngine = layer.menuPopup.menuEngine;
	var timerId;
	timerId = window.setInterval("__MENU_hideMenuPopup_4_step(\"" + menuId + "\");", menuEngine.hideInterval);
	menuEngine.setDelayedTimer("hide", menuId, null);
	menuEngine.setTimer("hide", menuId, timerId);
}

function __MENU_hideMenuPopup_4_step(menuId)
{
	var layer = document.all[menuId];
	var finished = false;
	var menuEngine = layer.menuPopup.menuEngine;
	var opacity = layer.filters.alpha.opacity;
	if (opacity > 16)
		opacity >>= 1;
	else
		opacity = 0;
	if (opacity <= 0) {
		opacity = 0;
		finished = true;
	}
	layer.filters.alpha.opacity = opacity;
	if (finished) {
		layer.filters.alpha.opacity = 0;
		layer.style.visibility = "hidden";
		menuEngine.cancelHide(menuId);
	}
}
