/* ------------------------
   CLASS DEFINITIONS 
   ------------------------ */

/* **********************************************************
   CLASS:       LineItem
   DESCRIPTION: An individual link item in a LineItemList
   MEMBERS:	    sUrl:    Link URL; default = '#'
                sText:   Link text; default = empty string
                sTarget: Target for link; default = '_top'
                sClass:  CSS class; default = 'menulineitem'
                sID:     Locally unique identifier; 
                         default = empty string
   ******************************************************** */
function LineItem(sUrl, sText, sTarget, sClass, sID) {
	this.sUrl = sUrl || "#";
	this.sText = sText || "";
	this.sTarget = sTarget || "_top";
	this.sClass = sClass || "menulineitem";
	this.sID = sID || "";
	this.Render = LineItemRender;
}

/* **********************************************************
   FUNCTION: LineItemRender = LineItem.Render()
   PURPOSE:  Render LineItem object in browser document
   INPUTS:	 None
   RETURNS:  True
   ******************************************************** */
function LineItemRender() {
	var id = this.sID
	var cls = this.sClass;
	var url = this.sUrl;
	var text = this.sText;
	var targ = this.sTarget;

	document.writeln("  <" + "div class=\"" + cls + "\" id=\"" + id + "\" onmouseover=\"SetClass('" + id + "', 'menulinehilite')\" onmouseout=\"SetClass('" + id + "', 'menulineitem')\"" + ">");
	document.writeln("    <" + "a href=\"" + url + "\" class=\"" + cls + "\" target=\"" + targ + "\"" + ">" + text + "<" + "/" + "a" + ">");
	document.writeln("  <" + "/" + "div" + ">");
	
	return true;
}

/* **********************************************************
   CLASS:       LineItemList
   DESCRIPTION: A collection of LineItem objects
   MEMBERS:	    sID:      Locally unique identifier;
                          default = empty string
                aryItems: Array of LineItem objects;
                          default = empty array
   ******************************************************** */
function LineItemList(sID) {
	this.sID = sID || "";
	this.aryItems = [];
	this.Add = LineItemListAdd;
	this.Render = LineItemListRender;
}

/* **********************************************************
   FUNCTION: LineItemListAdd = LineItemList.Add()
   PURPOSE:  Add item to LineItemList
   INPUTS:	 oItem: A LineItem object
   RETURNS:  true
   ******************************************************** */
function LineItemListAdd(oItem) {
	this.aryItems[this.aryItems.length] = oItem;
	return true;
}

/* **********************************************************
   FUNCTION: LineItemListRender = LineItemList.Render()
   PURPOSE:  Render LineItemList object (array of LineItems) 
             and its items in browser document
   INPUTS:	 None
   RETURNS:  true
   ******************************************************** */
function LineItemListRender() {
	var id = this.sID;
	var ary = this.aryItems;
	var k = 0;
	
	document.writeln("<" + "div class=\"menulist\" id=\"s" + id + "\" style=\"visibility:hidden;display:none;\"" + ">");
	for (k = 0; k < ary.length; k++) {
		ary[k].Render();
	}
	document.writeln("<" + "/" + "div" + ">");

	return true;
}

/* **********************************************************
   CLASS:       GehaImage
   DESCRIPTION: An image object
   MEMBERS:	    sMainSrc:  Primary image 'src' attribute;
                           default = empty string
                sHoverSrc: onHover image 'src' attribute;
                           default = empty string
                sName:     Image name; default = empty string
                sAlt:      Image 'alt' attribute; default =
                           empty string
                iWidth:    Image 'width' attribute;
				           default = 142
                iHeight:   Image 'height' attribute;
                           default = 24
   ******************************************************** */
function GehaImage(sMainSrc, sHoverSrc, sName, sAlt, iWidth, iHeight) {
	this.sMainSrc = sMainSrc || "";
	this.sHoverSrc = sHoverSrc || "";
	this.sName = sName || "";
	this.sAlt = sAlt || "";
	this.iWidth = iWidth || 142;
	this.iHeight = iHeight || 24;
	this.Render = GehaImageRender;
}

//This function is for those link on nav bar without sub link
function GehaImageNoSubLink(sUrl, sMainSrc, sHoverSrc, sName, sAlt, iWidth, iHeight) {
    this.sUrl = sUrl || "#";
	this.sMainSrc = sMainSrc || "";
	this.sHoverSrc = sHoverSrc || "";
	this.sName = sName || "";
	this.sAlt = sAlt || "";
	this.iWidth = iWidth || 142;
	this.iHeight = iHeight || 24;
	this.Render = GehaImageRenderNoSubLink;
}

/* **********************************************************
   FUNCTION: GehaImageRender = GehaImage.Render()
   PURPOSE:  Render GehaImage object in browser document
   INPUTS:	 None
   RETURNS:  true
   ******************************************************** */
function GehaImageRender() {
	var src = this.sMainSrc;
	var nme = this.sName;
	var alt = this.sAlt;
	var wid = this.iWidth;
	var hgt = this.iHeight;
	document.write("<" + "img src=\"" + src + "\" border=\"0\" name=\"" + nme + "\" width=\"" + wid + "\" height=\"" + hgt + "\" alt=\"" + alt + "\"" + ">");
	return true;
}
function GehaImageRenderNoSubLink() {
    var url = this.sUrl;
	var src = this.sMainSrc;
	var nme = this.sName;
	var alt = this.sAlt;
	var wid = this.iWidth;
	var hgt = this.iHeight;
	document.write("    <" + "a href=\"" + url + "\"" + ">" + "<" + "img src=\"" + src + "\" border=\"0\" name=\"" + nme + "\" width=\"" + wid + "\" height=\"" + hgt + "\" alt=\"" + alt + "\"" + ">" + "<" + "/" + "a" + ">");
	return true;
}

/* **********************************************************
   CLASS:       Heading
   DESCRIPTION: A Menu heading
   MEMBERS:	    oImg:  A GehaImage object; default = null
                sID:   A locally unique identifier;
                       default = empty string
                oList: A LineItemList object;
                       default = null
   ******************************************************** */
function Heading(oImg, sID, oList) {
	this.oImg = oImg || null;
	this.sID = sID || "";
	this.oList = oList || null;
	this.Render = HeadingRender;
}

/* **********************************************************
   FUNCTION: HeadingRender = Heading.Render()
   PURPOSE:  Render Heading object and its subobjects in 
             browser document
   INPUTS:	 None
   RETURNS:  true
   ******************************************************** */
function HeadingRender() {
	var id = this.sID;
	var Img = this.oImg;
	var imgName = Img.sName;
	var mSrc = Img.sMainSrc;
	var hSrc = Img.sHoverSrc;
	
	document.writeln("<" + "div class=\"menusection\" id=\"m" + id + "\"" + ">");
	document.write("  <" + "span onclick=\"ToggleHead('" + id + "', oMenu)\" onmouseover=\"SetImage('" + imgName + "', '" + hSrc + "')\" onmouseout=\"SetImage('" + imgName + "', '" + mSrc + "')\"" + ">");
	Img.Render()
	document.write("<" + "/" + "span" + ">");
	this.oList.Render();
	document.writeln("<" + "/" + "div" + ">");

	return true;
}

/* **********************************************************
   CLASS:       Menu
   DESCRIPTION: A dynamic menu for DOM-compliant browsers
   MEMBERS:	    aryHeadings: An array of Heading objects;
                             default = empty array
                sOpened:     The ID of the currently opened
                             menu section; default = empty
                             string
   ******************************************************** */
function Menu() {
	this.aryHeadings = [];
	this.sOpened = "";
	this.Add = MenuAdd;
	this.Render = MenuRender;
}

/* **********************************************************
   FUNCTION: MenuAdd = Menu.Add()
   PURPOSE:  Add a Heading object to a Menu
   INPUTS:	 oHead: A Heading object
   RETURNS:  true
   ******************************************************** */
function MenuAdd(oHeading) {
	this.aryHeadings[this.aryHeadings.length] = oHeading;
	return true;
}

/* **********************************************************
   FUNCTION: Menu = Menu.Render()
   PURPOSE:  Render Menu object and its sub-objects in 
             browser document
   INPUTS:	 ID of menu section that should be opened after
             rendering
   RETURNS:  true
   ******************************************************** */
function MenuRender(sDiv) {
	var oHeads = this.aryHeadings;
	
	for (var k = 0; k < oHeads.length; k++) {
		oHeads[k].Render();
	}
	
	ShowHead(sDiv, this);
	this.sOpened = sDiv;

	return true;
}

/* ------------------------
   UTILITY METHODS 
   ------------------------ */
/* **********************************************************
   FUNCTION: LoadImagesToCache
   PURPOSE:  Pre-cache images associated with a Menu object
   INPUTS:	 oMenu: A Menu object
   RETURNS:  true
   ******************************************************** */
function LoadImagesToCache(oMenu) {
	var oI = new Image();
	for (var k = 0; k < oMenu.aryHeadings.length; k++) {
		oI.src = oMenu.aryHeadings[k].oImg.sMainSrc;
		oI.src = oMenu.aryHeadings[k].oImg.sHoverSrc;
	}
	return true;
}

/* **********************************************************
   FUNCTION: ToggleHead
   PURPOSE:  Open a closed menu section, or close an open
             menu section
   INPUTS:	 sID:   ID of Menu section (head) to toggle
             oMenu: A Menu object
   RETURNS:  true (false on error)
   ******************************************************** */
function ToggleHead(sID, oMenu) {
	if (typeof(oMenu) == "undefined") {
		alert("ToggleHead: Menu object not defined!");
		return false;
	}
	
	if (oMenu.sOpened == sID) {
		HideHead(sID, oMenu);
		oMenu.sOpened = "";
	} else {
		HideHead(oMenu.sOpened, oMenu);
		ShowHead(sID, oMenu);
		oMenu.sOpened = sID;
	}
	return true;
}

/* **********************************************************
   FUNCTION: HideHead
   PURPOSE:  Close an open menu section
   INPUTS:	 sID:   ID of Menu section (head) to close
             oMenu: A Menu object
   RETURNS:  true (false on error)
   ******************************************************** */
function HideHead(sID, oMenu) {
	if (typeof(oMenu) == "undefined") {
		alert("HideHead: Menu object not defined!");
		return false;
	}

	if (sID != "") {
		document.getElementById("s" + sID).style.visibility = "hidden";
		document.getElementById("s" + sID).style.display = "none";
	}
	return true;
}

/* **********************************************************
   FUNCTION: ShowHead
   PURPOSE:  Open a closed menu section
   INPUTS:	 sID:   ID of Menu section (head) to open
             oMenu: A Menu object
   RETURNS:  true (false on error)
   ******************************************************** */
function ShowHead(sID, oMenu) {
	if (typeof(oMenu) == "undefined") {
		alert("ShowHead: Menu object not defined!");
		return false;
	}

	if (sID != "") {
		document.getElementById("s" + sID).style.visibility = "visible";
		document.getElementById("s" + sID).style.display = "block";
	}
	return true;
}

/* **********************************************************
   FUNCTION: SetImage
   PURPOSE:  Set the 'src' attribute of an image
   INPUTS:	 sName: The name of the image
             sSrc: The value of the 'src' attribute
   RETURNS:  true
   ******************************************************** */
function SetImage(sName, sSrc) {
	document.images[sName].src = sSrc;
	return true;
}

/* **********************************************************
   FUNCTION: SetClass
   PURPOSE:  Set the CSS 'class' attribute of a page element
   INPUTS:	 sID:    The ID of the element (typically the ID
                     of a DIV tag)
             sClass: The 'class' attribute of the element
   RETURNS:  true
   ******************************************************** */
function SetClass(sID, sClass) {
	document.getElementById(sID).className = sClass;
	return true;
}
