/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Class VerticalSubMenuItem
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function VerticalSubMenuItem(id, displayText, linkURL, accessGroup) {

	 ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Private variables
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		var _id = id;
  var _displayText = displayText;
	 var _linkURL = linkURL;
	 var _accessGroup = accessGroup;

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Getters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Setters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Events
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Boolean Tests
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Instance Methods
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  this.writeSubMenuItem = function() {

			 var str = "";

				 str += "<tr>";
						str += "<td class=\"tdVertMenuSubItem\">";
						 str += "<a href=\"" + _linkURL + "\">" + _displayText + "</a>";
						str += "</td>";
					str += "</tr>";
					
				return str;
				
		}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Class VerticalSubMenu
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function VerticalSubMenu(id) {

	 ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Private variables
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		var _id = id;
	 var _menuItems = new Array();
	
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Getters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Setters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Events
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Boolean Tests
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  this.hasMenuItems = function() { return _menuItems.length;}

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Instance Methods
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  this.writeSubMenu = function() {
			
			 var str = "<table width=\"90%\">";

     for(var i=0; i<_menuItems.length; i++) str += _menuItems[i].writeSubMenuItem();
					
				str += "</table>";
				
				return str;
			
		}
		
		this.addItem = function(id, displayText, linkURL, accessGroup) {
			var vsmi = new VerticalSubMenuItem(id, displayText, linkURL, accessGroup);
			_menuItems.push(vsmi);
		}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Class VerticalMenuItem
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function VerticalMenuItem(id, name, displayText, linkURL, accessGroup) {

	 ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Private variables
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		var _id = id;
		var _name = name;
  var _displayText = displayText.replace("\\n", "<br />");
	 var _linkURL = linkURL;
		var _accessGroup = accessGroup;
		var _aMenuItem = new nuAnchor("aMenuItem" + _id);
	 var _subMenu = new VerticalSubMenu(_id);
		var _divSubMenu = new nuDivArea("divSubMenu" + _id);
		var _imgArrow = new nuImage("imgArrow" + _id);
		 var _imgOffSrc = "images/vertmenu_arrow_right.jpg";
		 var _imgOnSrc = "images/vertmenu_arrow_down.jpg";
	
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Getters
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  this.getSubMenu = function() { return _subMenu;}
		
		function _getLinkURL() {
			if(!_hasLinkURL()) return "#";
			else return _linkURL;
		}

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Setters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Events
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  this.setClickEvent = function() {
		 if(!_hasLinkURL()) _aMenuItem.on("click", function() { _toggleSubMenuDisplay();});		
		}
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Boolean Tests
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  function _hasLinkURL() { return _linkURL.length > 0;}
		
		this.nameIs = function(nameToTest) { return _name==nameToTest;}

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Instance Methods
  ////////////////////////////////////////////////////////////////////////////////////////////////////
		function _toggleSubMenuDisplay() {
			var newDisplay = _divSubMenu.toggleDisplay();
			if(newDisplay) _imgArrow.setSrc(_imgOnSrc);
   else _imgArrow.setSrc(_imgOffSrc);
  }
		
		this.toggleSubMenuDisplay = function() { _toggleSubMenuDisplay();}
		
  this.getMenuItemHTML = function() {

   var str = "";
			 if(_id > 0) {
				 str += "<tr>";
					 str += "<td width=\"100%\" style=\"height: 7px; background-image: URL('images/vertMenu_dividerDot.jpg'); background-repeat: repeat-x;\"></td>";
				 str += "</tr>";
				}
				str += "<tr>";
					str += "<td class=\"tdVertMenuItem\">";
					 if(_subMenu.hasMenuItems()) str += "<img id=\"imgArrow" + _id + "\" src=\"images/vertmenu_arrow_right.jpg\" />&nbsp;";
					 str += "<a id=\"aMenuItem" + _id + "\" href=\"" + _getLinkURL() + "\">" + _displayText + "</a>";
					str += "</td>";
				str += "</tr>";
				str += "<tr>";
					str += "<td>";
				  str += "<div id=\"divSubMenu" + _id + "\" style=\"display: none;\">";
						 str += _subMenu.writeSubMenu();
				  str += "</div>";
					str += "</td>";
				str += "</tr>";

    return	str;
				
		}


}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Class VerticalMenu
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function VerticalMenu(targetCell, configFile, accessGroup) {
	
	 ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Private variables
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  var _tdMenu = new nuTableCell(targetCell);
		var _configFile = configFile;
		var _accessGroup = accessGroup;
		var _menuStr = "";
		
		var _vm = new Array();

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Getters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Setters
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Events
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Boolean Tests
  ////////////////////////////////////////////////////////////////////////////////////////////////////

  ////////////////////////////////////////////////////////////////////////////////////////////////////
		// Instance Methods
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  function _processConfigFile() {
			
    var xdoc = new XMLFile(_configFile);
				
				var menuNode = xdoc.getRoot("Menu");
				
   	var menuItemsNode = menuNode.getElementsByTagName("MenuItems")[0];
				var menuItemNodeArr = menuItemsNode.getElementsByTagName("MenuItem");
				
					for(var i = 0; i < menuItemNodeArr.length; i++) {
						var sectionNameNode = menuItemNodeArr[i].getElementsByTagName("SectionName")[0];
						var displayTextNode = menuItemNodeArr[i].getElementsByTagName("DisplayText")[0];
						var linkURLNode = menuItemNodeArr[i].getElementsByTagName("LinkURL")[0];
						var accessGroupNode = menuItemNodeArr[i].getElementsByTagName("AccessGroup")[0];
						 var accessGroupValue = getXMLNodeValue(accessGroupNode);
						 
						if( (accessGroupValue == "General") || 
										(accessGroupValue == "Client" && _accessGroup == "Client") || 
										(accessGroupValue == "Admin" && _accessGroup == "Admin") || 
										(_accessGroup == "Admin") || 
										(_accessGroup == "PFM")
								) {
							
       var vmi = new VerticalMenuItem(i, getXMLNodeValue(sectionNameNode), getXMLNodeValue(displayTextNode), getXMLNodeValue(linkURLNode));
						
	 					 var subMenuItemsNode = menuItemNodeArr[i].getElementsByTagName("SubMenuItems")[0];
	 					  if(subMenuItemsNode.hasChildNodes()) {
									
		 							 var subMenuItemNodeArr = subMenuItemsNode.getElementsByTagName("SubMenuItem");

           for(var j = 0; j < subMenuItemNodeArr.length; j++) {
	           var displayTextSubNode = subMenuItemNodeArr[j].getElementsByTagName("DisplayText")[0];
	           var linkURLSubNode = subMenuItemNodeArr[j].getElementsByTagName("LinkURL")[0];
     	 					var accessGroupSubNode = subMenuItemNodeArr[j].getElementsByTagName("AccessGroup")[0];
      						 var accessGroupSubValue = getXMLNodeValue(accessGroupSubNode);

            if( (accessGroupValue == "General") || 
																(accessGroupValue == "Client" && _accessGroup == "Client") || 
      										(accessGroupValue == "Admin" && _accessGroup == "Admin") || 
																(_accessGroup == "Admin") || 
																(_accessGroup == "PFM")
														) {
												 vmi.getSubMenu().addItem(j, getXMLNodeValue(displayTextSubNode), getXMLNodeValue(linkURLSubNode));
												}

 										}

	 							}
						
       _vm.push(vmi);
						
			 		}			
			
					} // end if
			
		}
		
		function _writeMenu() {
			
			 _menuStr += "<table width=\"95%\" cellspacing=\"0\" bgcolor=\"#ffffff\" style=\"border-right: 1px solid #dddddd;\">";
			
			 for(i=0; i<_vm.length; i++) {
					
      _menuStr += _vm[i].getMenuItemHTML();

    }

			 _menuStr += "</table>";
				
				_tdMenu.setInnerHTML(_menuStr);

			 for(i=0; i<_vm.length; i++) _vm[i].setClickEvent();

		}
		
		this.openSubMenu = function(page) {
			var currPageInfo = page.split(",");
			 if(currPageInfo.length > 1) {
					for(i=0; i<_vm.length; i++) {
						if(_vm[i].nameIs(currPageInfo[0])) _vm[i].toggleSubMenuDisplay();
					}
				}			
		}
  
		_processConfigFile();
		_writeMenu();
}

