// requires browser.js to be loaded

// [TTableMenu Object Prototype] Create new menu object
function TTableMenu()
{
//	Private Properties
	var activeMenu			= null;
	var aMenuItems			= new Array();
	var className			= "TTableMenu";
	var count				= 0;
	var cellL1Class			= "clsTableMenuL1";
	var cellL1ClassActive	= "clsTableMenuL1Active";
	var cellL2Class			= "clsTableMenuL2";
	var cellL2ClassActive	= "clsTableMenuL2Active";
	var cellL2ClassBorder	= "clsTableMenuL2Border";
	var linkL1Class			= "clsTableMenuLinkL1";
	var linkL1ClassActive	= "clsTableMenuLinkL1Active";
	var linkL2Class			= "clsTableMenuLinkL2";
	var linkL2ClassActive	= "clsTableMenuLinkL2Active";
	var onClick				= "";
	var onMouseOver			= "return ('function'==typeof(doStatus)) ? doStatus('<#SWAPMSG#>') : true;";
	var onMouseOut			= "return ('function'==typeof(doStatus)) ? doStatus('') : true;";
	var lastMenu			= null;
	var row1Cell1Width		= 10;
	var row1Cell2Width		= 115;
	var row1Cell3Width		= 1;
	var row1Height			= 34;
	var row2Height			= 18;
	var rootPath			= getPathName();
	var showActiveLink		= true;

//	Public Method Pointers
	this.addMenu			= addMenu;
	this.addSubMenu			= addSubMenu;
	this.createMenuItem		= createMenuItem;
	this.writeMenu			= writeMenu;

//	Public Property Method Pointer
	this.setActiveMenu			= setActiveMenu;
	this.setCellL1Class			= setCellL1Class;
	this.setCellL1ClassActive	= setCellL1ClassActive;
	this.setCellL2Class			= setCellL2Class;
	this.setCellL2ClassActive	= setCellL2ClassActive;
	this.setCellL2ClassBorder	= setCellL2ClassBorder;
	this.getClassName			= getClassName;
	this.setLinkL1Class			= setLinkL1Class;
	this.setLinkL1ClassActive	= setLinkL1ClassActive;
	this.setLinkL2Class			= setLinkL2Class;
	this.setLinkL2ClassActive	= setLinkL2ClassActive;
	this.setOnClick				= setOnClick;
	this.setOnMouseOver			= setOnMouseOver;
	this.setOnMouseOut			= setOnMouseOut;
	this.getMenuCode			= getMenuCode;
	this.setRow1Cell1Width		= setRow1Cell1Width;
	this.setRow1Cell2Width		= setRow1Cell2Width;
	this.setRow1Cell3Width		= setRow1Cell3Width;
	this.setRow1Height			= setRow1Height;
	this.setRow2Height			= setRow2Height;
	this.setShowActiveLink		= setShowActiveLink;

//	Initialization
	if (is.ns4)
	{
		setMenuItems(aMenuItems);
		setClassName(className);
		setCount(count);
		setCellL1Class(cellL1Class);
		setCellL1ClassActive(cellL1ClassActive);
		setCellL2Class(cellL2Class);
		setCellL2ClassActive(cellL2ClassActive);
		setCellL2ClassBorder(cellL2ClassBorder);
		setLinkL1Class(linkL1Class);
		setLinkL1ClassActive(linkL1ClassActive);
		setLinkL2Class(linkL2Class);
		setLinkL2ClassActive(linkL2ClassActive);
		setOnClick(onClick);
		setOnMouseOver(onMouseOver);
		setOnMouseOut(onMouseOut);
		setLastMenu(lastMenu);
		setActiveMenu(activeMenu);
		setRow1Cell1Width(row1Cell1Width);
		setRow1Cell2Width(row1Cell2Width);
		setRow1Cell3Width(row1Cell3Width);
		setRow1Height(row1Height);
		setRow2Height(row2Height);
		setShowActiveLink(showActiveLink);
	}

//	Private Property Methods (No public pointers)
	function setClassName(sValue)
	{
		className	= sValue;
	}
	function setCount(iValue)
	{
		count	= iValue;
	}
	function setLastMenu(sValue)
	{
		lastMenu	= sValue;
	}
	function setMenuItems(aValue)
	{
		aMenuItems	= aValue;
	}

//	Public Methods (They have public pointers)
	function addMenu(sName, sHref, sTarget, sText, sStatusMsg, sCellClass, sCellStyle, sLinkClass, sLinkStyle, sType)
	{
		for (var idx = 0; idx < arguments.length; idx++)
			arguments[idx]	= ("string" == typeof(arguments[idx]) && arguments[idx].trim() != "") ? arguments[idx].trim() : null;

		if (!sHref && !sText)
			return;

		var oMenuItem	= createMenuItem(this, sName, sHref, sTarget, sText, sStatusMsg, sCellClass, sCellStyle, sLinkClass, sLinkStyle, sType);
		if (oMenuItem)
		{
			lastMenu	= oMenuItem;
			aMenuItems.push(oMenuItem);
		}
	}

	function addSubMenu(sName, sHref, sTarget, sText, sStatusMsg, sCellClass, sCellStyle, sLinkClass, sLinkStyle, sType)
	{
		for (var idx = 0; idx < arguments.length; idx++)
			arguments[idx]	= ("string" == typeof(arguments[idx]) && arguments[idx].trim() != "") ? arguments[idx].trim() : null;

		if (!lastMenu || !sHref && !sText)
			return;

		var oMenuItem	= createMenuItem(lastMenu, sName, sHref, sTarget, sText, sStatusMsg, sCellClass, sCellStyle, sLinkClass, sLinkStyle, sType, true);
		if (oMenuItem)
		{
			oMenuItem.enabled	= false;
			aMenuItems.push(oMenuItem);
		}
	}

	function createMenuItem(oParent, sName, sHref, sTarget, sText, sStatusMsg, sCellClass, sCellStyle, sLinkClass, sLinkStyle, sType, isSubMenu)
	{
		if ("object" != typeof(oParent) || "function" != typeof(oParent.getClassName) || ("TTableMenu" != oParent.getClassName() && "TTableMenuItem" != oParent.getClassName()))
			return null;
		isSubMenu	= ("boolean" == typeof(isSubMenu)) ? isSubMenu : false;

		count++;
		var oMenuItem	= new TTableMenuItem(oParent);
		oMenuItem.id	= "TTableMenu" + count;
		oMenuItem.name	= "TTableMenu" + sName;
		if (sHref)
		{
			oMenuItem.href		= sHref;
			oMenuItem.target	= (sTarget) ? sTarget : "_self";
			oMenuItem.statusMsg	= sStatusMsg;
			oMenuItem.isPDF		= (sType && sType.toUpperCase() == "PDF");
		}
		if (sText)
		{
			oMenuItem.sCellClass	= sCellClass;
			oMenuItem.sCellStyle	= sCellStyle;
			oMenuItem.sLinkClass	= sLinkClass;
			oMenuItem.sLinkStyle	= sLinkStyle;
			oMenuItem.sText			= sText;
		}
		oMenuItem.isSubMenu	= isSubMenu;
		return oMenuItem;
	}

	function writeMenu()
	{
		var sHTML	= getMenuCode();
		if (sHTML != "")
			document.writeln(sHTML);
	}

//	Public Property Methods (They have public pointers)
	function setActiveMenu(sValue)
	{
		var idx;
		var oMenuItem;
		for (idx = 0; idx < aMenuItems.length; idx++)
		{
			// reintialize all menus
			oMenuItem	= aMenuItems[idx];
			oMenuItem.active	= false;
			if (oMenuItem.parent != this)	// if sub menu
				oMenuItem.enabled	= false;
		}
		activeMenu	= ("string" == typeof(sValue) && sValue.trim() != "") ? sValue.trim().toLowerCase() : null;
		if (!activeMenu)
			return;

		var oParent	= null;
		for (idx = 0; idx < aMenuItems.length; idx++)
		{
			oMenuItem	= aMenuItems[idx];
			if (oMenuItem.name.toLowerCase().indexOf(activeMenu) != -1)
			{
				oMenuItem.active	= true;
				if (oMenuItem.parent != this)
				{	// is sub menu
					oParent	= oMenuItem.parent;
					oParent.active	= true;
				}
				else
					oParent	= oMenuItem;
				break;
			}
		}
		if (oParent)
			for (idx = 0; idx < aMenuItems.length; idx++)
			{
				// enable all sub menus belonging to the parent
				oMenuItem	= aMenuItems[idx];
				if (oMenuItem.parent == oParent)
					oMenuItem.enabled	= true;
			}
	}

	function setCellL1Class(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		cellL1Class	= sValue.trim();
	}

	function setCellL1ClassActive(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		cellL1ClassActive	= sValue.trim();
	}

	function setCellL2Class(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		cellL2Class	= sValue.trim();
	}

	function setCellL2ClassActive(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		cellL2ClassActive	= sValue.trim();
	}

	function setCellL2ClassBorder(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		cellL2ClassBorder	= sValue.trim();
	}

	function getClassName()
	{
		return className;
	}

	function setLinkL1Class(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		linkL1Class	= sValue.trim();
	}

	function setLinkL1ClassActive(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		linkL1ClassActive	= sValue.trim();
	}

	function setLinkL2Class(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		linkL2Class	= sValue.trim();
	}

	function setLinkL2ClassActive(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		linkL2ClassActive	= sValue.trim();
	}

	function setOnClick(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		onClick	= sValue.trim();
	}

	function setOnMouseOver(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		onMouseOver	= sValue.trim();
	}

	function setOnMouseOut(sValue)
	{
		if ("string" != typeof(sValue))
			return;
		onMouseOut	= sValue.trim();
	}

	function getMenuCode()
	{
		var sHTML1		= "";
		var sHTML2		= "";
		var sMenuCode	= '<table width="100%" border="0" cellspacing="0" cellpadding="0">\n';
		var sMenuLine1	= '<tr>\n';
		var sMenuLine2	= "<tr>\n";
		var sTemp		= "";
		var oMenuItem;

		// Top-level Menu
		var sL1TemplateA = '<td class="<#ClassL1#>"<#StyleL1#> width="<#WidthL1C1#>" height="<#HeightL1C1#>"><img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL1C1#>" height="<#HeightL1C1#>"></td>\n';
		sL1TemplateA	+= '<td class="<#ClassL1#>"<#StyleL1#> width="<#WidthL1C2#>" valign="bottom"><#LinkL1C2#><br><img src="' + rootPath + 'images/spacepix.gif" width="10" height="4"></td>\n';
		sL1TemplateA	+= '<td width="<#WidthL1C3#>" height="<#HeightL1C3#>"><img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL1C3#>" height="<#HeightL1C3#>"></td>\n';
		var sL1TemplateB = '<td class="<#ClassL1#>" valign="bottom">&nbsp;</td>\n</tr>\n';
		var sL2TemplateA = '<td<#ClassL2#> width="<#WidthL2C1#>"><img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL2C1#>" height="1"></td>\n';
		sL2TemplateA	+= '<td<#ClassL2#>><img src="' + rootPath + 'images/spacepix.gif" width="10" height="1"></td>\n';
		sL2TemplateA	+= '<td width="<#WidthL2C3#>"><img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL2C3#>" height="1"></td>\n';
		var sL2TemplateB = '<td><img src="' + rootPath + 'images/spacepix.gif" width="1" height="1"></td>\n</tr>\n';

		for (var idx = 0; idx < aMenuItems.length; idx++)
		{
			oMenuItem	= aMenuItems[idx];
			if (!oMenuItem.enabled || oMenuItem.isSubMenu)
				continue;
			sHTML1	= sL1TemplateA;
			sTemp	= (oMenuItem.active) ? cellL1ClassActive : cellL1Class;
			if (oMenuItem.sCellClass)
				sTemp	+= (sTemp) ? " " + oMenuItem.sCellClass : oMenuItem.sCellClass;
			sHTML1	= sHTML1.replace(/<#ClassL1#>/g, sTemp);
			sTemp	= (oMenuItem.sCellStyle) ? ' style="' + oMenuItem.sCellStyle + '"' : "";
			sHTML1	= sHTML1.replace(/<#StyleL1#>/g, sTemp);
			sHTML1	= sHTML1.replace(/<#WidthL1C1#>/g, row1Cell1Width);
			sHTML1	= sHTML1.replace(/<#HeightL1C1#>/g, row1Height);
			sHTML1	= sHTML1.replace(/<#WidthL1C2#>/g, row1Cell2Width);
			sHTML1	= sHTML1.replace(/<#WidthL1C3#>/g, row1Cell3Width);
			sHTML1	= sHTML1.replace(/<#HeightL1C3#>/g, row1Height);
			sHTML2	= (oMenuItem.sText) ? oMenuItem.sText : "";
			if (oMenuItem.href && (!oMenuItem.active || showActiveLink))
			{
				sTemp	= (oMenuItem.active) ? linkL1ClassActive : linkL1Class;
				if (oMenuItem.sLinkClass)
					sTemp	+= (sTemp) ? " " + oMenuItem.sLinkClass : oMenuItem.sLinkClass;
				if (oMenuItem.isPDF)
					sHTML2	= sHTML2.toPDFLink(oMenuItem.href, oMenuItem.statusMsg, oMenuItem.target, sTemp, oMenuItem.sLinkStyle, null, onClick, onMouseOver, onMouseOut);
				else
					sHTML2	= sHTML2.toLink(oMenuItem.href, oMenuItem.statusMsg, oMenuItem.target, sTemp, oMenuItem.sLinkStyle, null, onClick, onMouseOver, onMouseOut);
			}
			sHTML1	= sHTML1.replace(/<#LinkL1C2#>/g, sHTML2);
			sHTML2	= sL2TemplateA;
			sTemp	= (oMenuItem.active) ? ' class="' + cellL1ClassActive + '"' : "";
			sHTML2	= sHTML2.replace(/<#ClassL2#>/g, sTemp);
			sHTML2	= sHTML2.replace(/<#WidthL2C1#>/g, row1Cell1Width);
			sHTML2	= sHTML2.replace(/<#WidthL2C3#>/g, row1Cell3Width);
			sMenuLine1	+= sHTML1;
			sMenuLine2	+= sHTML2;
		}
		sHTML1	= sL1TemplateB;
		sHTML1	= sHTML1.replace(/<#ClassL1#>/g, cellL1Class);
		sMenuLine1	+= sHTML1;
		sMenuLine2	+= sL2TemplateB;
		sMenuCode	+= sMenuLine1 + sMenuLine2 + '</table>\n';

		// Sub-level Menu - seperator table
		sHTML1		 = '<table width="100%" border="0" cellspacing="0" cellpadding="0">\n';
		sHTML1		+= '<tr>\n';
		sHTML1		+= '<td class="clsTableMenuL2"><img src="' + rootPath + 'images/spacepix.gif" width="7" height="3"></td>\n';
		sHTML1		+= '</tr>\n';
		sHTML1		+= '</table>\n';
		sMenuCode	+= sHTML1;

		// Second-Level Menu
		var sL2CellTemplate	= '<td class="<#ClassL2#>" height="1" valign="bottom" align="left"<#TDWidth#>>\n';
		sL2CellTemplate	+= '<table width="100%" border="0" cellspacing="0" cellpadding="0">\n';
		sL2CellTemplate	+= '<tr>\n<td class="<#ClassL2R1C1#>" colspan="3"><img src="' + rootPath + 'images/spacepix.gif" width="1" height="1"></td>\n</tr>\n';
		sL2CellTemplate	+= '<tr>\n<td class="<#ClassL2R2C1#>" width="1"><img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL2R2C1#>" height="1"></td>\n';
		sL2CellTemplate	+= '<td class="<#ClassL2R2C2#>" valign="bottom" nowrap><#ImgL2R2C2#><#LinkL2R2C2#>';
		sL2CellTemplate	+= '<img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL2R2C2#>" height="1"></td>\n';
		sL2CellTemplate	+= '<td class="<#ClassL2R2C3#>" width="1"><img src="' + rootPath + 'images/spacepix.gif" width="<#WidthL2R2C3#>" height="1"></td>\n</tr>\n';
		sL2CellTemplate	+= '<tr>\n<td class="<#ClassL2R3C1#>"><img src="' + rootPath + 'images/spacepix.gif" width="1" height="1"></td>\n';
		sL2CellTemplate	+= '<td class="<#ClassL2R3C2#>"><img src="' + rootPath + 'images/spacepix.gif" width="1" height="1"></td>\n';
		sL2CellTemplate	+= '<td class="<#ClassL2R3C3#>"><img src="' + rootPath + 'images/spacepix.gif" width="1" height="1"></td>\n';
		sL2CellTemplate	+= '</tr>\n</table>\n</td>\n';

		sMenuLine1	 = '<table width="100%" border="0" cellspacing="0" cellpadding="0">\n<tr>\n';
		var sWidth	 = "";
		var isFirst	 = true;
		for (var idx = 0; idx < aMenuItems.length; idx++)
		{
			oMenuItem	= aMenuItems[idx];
			if (!oMenuItem.enabled || !oMenuItem.isSubMenu)
				continue;
			sHTML1	= sL2CellTemplate;
			sHTML1	= sHTML1.replace(/<#TDWidth#>/g, "");
			sHTML1	= sHTML1.replace(/<#ClassL2#>/g, cellL2Class);
			if (oMenuItem.active && isFirst)
				sHTML1	= sHTML1.replace(/(<#ClassL2R2C1#>|<#ClassL2R3C1#>)/g, cellL2ClassActive);
			sTemp	= (oMenuItem.active) ? cellL2ClassBorder : cellL2Class;
			sHTML1	= sHTML1.replace(/(<#ClassL2R1C1#>|<#ClassL2R2C1#>|<#ClassL2R2C3#>)/g, sTemp);
			sTemp	= (oMenuItem.active) ? cellL2ClassActive : cellL2Class;
			sHTML1	= sHTML1.replace(/<#ClassL2R2C2#>/g, sTemp);
			sTemp	= (oMenuItem.active) ? cellL2ClassActive : cellL2ClassBorder;
			sHTML1	= sHTML1.replace(/<#ClassL2R3C2#>/g, sTemp);
			sHTML1	= sHTML1.replace(/(<#ClassL2R3C1#>|<#ClassL2R3C3#>)/g, cellL2ClassBorder);
			sHTML1	= sHTML1.replace(/<#ImgL2R2C2#>/g, '<img src="' + rootPath + 'images/spacepix.gif" width="5" height="' + row2Height + '">');
			sTemp	= (oMenuItem.active) ? "1" : "10";
			sHTML1	= sHTML1.replace(/(<#WidthL2R2C1#>|<#WidthL2R2C3#>)/g, sTemp);
			sTemp	= (oMenuItem.active) ? "5" : "1";
			sHTML1	= sHTML1.replace(/<#WidthL2R2C2#>/g, sTemp);
			sHTML2	= (oMenuItem.sText) ? oMenuItem.sText : "";
			if (oMenuItem.href && (!oMenuItem.active || showActiveLink))
			{
				sTemp	= (oMenuItem.active) ? linkL2ClassActive : linkL2Class;
				if (oMenuItem.sLinkClass)
					sTemp	+= (sTemp) ? " " + oMenuItem.sLinkClass : oMenuItem.sLinkClass;
				if (oMenuItem.isPDF)
					sHTML2	= sHTML2.toPDFLink(oMenuItem.href, oMenuItem.statusMsg, oMenuItem.target, sTemp, oMenuItem.sLinkStyle, null, onClick, onMouseOver, onMouseOut);
				else
					sHTML2	= sHTML2.toLink(oMenuItem.href, oMenuItem.statusMsg, oMenuItem.target, sTemp, oMenuItem.sLinkStyle, null, onClick, onMouseOver, onMouseOut);
			}
			sHTML1		 = sHTML1.replace(/<#LinkL2R2C2#>/g, sHTML2);
			sMenuLine1	+= sHTML1;
			isFirst		 = false;
		}
		sHTML1		 = sL2CellTemplate;
		sHTML1		 = sHTML1.replace(/<#TDWidth#>/g, ' width="100%"');
		sHTML1		 = sHTML1.replace(/(<#ClassL2#>|<#ClassL2R1C1#>|<#ClassL2R2C1#>|<#ClassL2R2C2#>|<#ClassL2R2C3#>)/g, cellL2Class);
		sHTML1		 = sHTML1.replace(/(<#ClassL2R3C1#>|<#ClassL2R3C2#>|<#ClassL2R3C3#>)/g, cellL2ClassBorder);
		sHTML1		 = sHTML1.replace(/(<#ImgL2R2C2#>|<#LinkL2R2C2#>)/g, "");
		sHTML1		 = sHTML1.replace(/(<#WidthL2R2C1#>|<#WidthL2R2C2#>|<#WidthL2R2C3#>)/g, "1");
		sMenuLine1	+= sHTML1;
		sMenuLine1	+= '</tr>\n</table>\n';
		sMenuCode	+= sMenuLine1;

		sHTML1		 = '<table width="100%" border="0" cellspacing="0" cellpadding="0">\n';
		sHTML1		+= '<tr>\n';
		sHTML1		+= '<td><img src="' + rootPath + 'images/spacepix.gif" width="1" height="1"></td>\n';
		sHTML1		+= '</tr>\n';
		sHTML1		+= '</table>\n';
		sMenuCode	+= sHTML1;
		return sMenuCode;
	}

	function setRow1Cell1Width(iValue)
	{
		row1Cell1Width	= iValue;
	}

	function setRow1Cell2Width(iValue)
	{
		row1Cell2Width	= iValue;
	}

	function setRow1Cell3Width(iValue)
	{
		row1Cell3Width	= iValue;
	}

	function setRow1Height(iValue)
	{
		row1Height	= iValue;
	}

	function setRow2Height(iValue)
	{
		row2Height	= iValue;
	}

	function setShowActiveLink(bValue)
	{
		if ("boolean" != typeof(bValue))
			return;
		showActiveLink	= bValue;
	}
}

// *************************************************
// [TTableMenuItem Object Prototype] Create new menu item
function TTableMenuItem(oParent)
{
//	Private Properties
	var className		= "TTableMenuItem";
//	Public Properties
	this.parent			= oParent;
	this.active			= false;
	this.enabled		= true;
	this.isPDF			= false;
	this.isSubMenu		= false;
	this.statusMsg		= "";
//	link properties
	this.href			= null;
	this.target			= null;
//	Cell properties
	this.id				= null;
	this.name			= null;
	this.sCellClass		= null;
	this.sCellStyle		= null;
	this.sLinkClass		= null;
	this.sLinkStyle		= null;
	this.sText			= "Link";
//	Public Property Method Pointer
	this.getClassName	= getClassName;
//	Initialization
	if (is.ns4)
		setClassName(className);
//	Private Property Methods (No public pointers)
	function setClassName(sValue)
	{
		className	= sValue;
	}
//	Public Property Methods (They have public pointers)
	function getClassName()
	{
		return className;
	}
}

// End of file
