// TwoLvlMenu class constructor
function TwoLvlMenu(sObjName, iTop, iLeft, iWidth, iZIndex)
{
   this.m_sObjName = sObjName;

   this.m_oMenuDiv     = null;
   this.m_bIsOpen      = false;
   this.m_iSubSelected = null;
   
   this.m_arrMenu     = new Array();
   this.m_arrSubMenus = new Array();
   
   this.m_iTop     = iTop;
   this.m_iLeft    = iLeft;
   this.m_iWidth   = iWidth;
   this.m_iZIndex  = iZIndex;
   
   this.m_iItemHeight    = 20;
   this.m_iSubItemHeight = 20;

   this.m_sItemClass       = "cellLevel1";
   this.m_sItemClassSel    = "cellLevel1Selected";
   this.m_sSubItemClass    = "cellLevel2";
   this.m_sSubItemClassSel = "cellLevel2Selected";

   this.m_sItemHtmlBeforeName = null;
   this.m_sItemHtmlAfterName  = null;

   this.m_sItemClickHtmlBeforeName = null;
   this.m_sItemClickHtmlAfterName  = null;

   this.m_sSubItemHtmlBeforeName = null;
   this.m_sSubItemHtmlAfterName  = null;

   this.m_sSubItemClickHtmlBeforeName = null;
   this.m_sSubItemClickHtmlAfterName  = null;

   this.draw        = TwoLvlMenuDraw;
   this.drawItem    = TwoLvlMenuDrawItem;
   this.addItem     = TwoLvlMenuAddItem;
   this.addSubItem  = TwoLvlMenuAddSubItem;
   this.getDivRef   = TwoLvlMenuGetDivRef;
   this.collapseAll = TwoLvlMenuCollapseAll;
   this.showSubMenu = TwoLvlMenuShowSubMenu;
   this.mClick      = TwoLvlMenuMClick;
   this.mClickSub   = TwoLvlMenuMClickSub;
}

// Get reference to div tag
function TwoLvlMenuGetDivRef(sID)
{
   var oDiv;
   if(document.layers)
      oDiv = document.layers[sID];
   else if(document.getElementByID)
      oDiv = document.getElementById(sID);
   else if(document.all)
      oDiv = document.all(sID);
   return oDiv;
}

// Hide all submenus
function TwoLvlMenuCollapseAll()
{
   var iTop = this.m_iTop;
   for(var i=0; i<this.m_arrMenu.length; i++)
   {
      // Set top of item
      (document.layers) ? this.getDivRef("divTwoLvlMenu"+i).top = iTop : this.getDivRef("divTwoLvlMenu"+i).style.top = iTop;
      iTop += this.m_iItemHeight;
      
      // If this item is open - hide submenu items and redraw menu item
      if(this.m_arrMenu[i].m_bIsOpen && this.m_arrSubMenus[i])
      {
         this.drawItem(i, this.m_sItemClass);
         this.m_arrMenu[i].m_bIsOpen = false;

         for(var i2=0; i2<this.m_arrSubMenus[i].length; i2++)
         {
            var oSubDiv = (document.layers) ? this.getDivRef("divTwoLvlMenu"+i+"-"+i2) : this.getDivRef("divTwoLvlMenu"+i+"-"+i2).style;
            oSubDiv.visibility = (document.layers) ? "hide" : "hidden";
         }
      }
   }
}

// Show a submenu
function TwoLvlMenuShowSubMenu(iIndex)
{
   var iTop = this.m_iTop;
   for(var i=0; i<this.m_arrMenu.length; i++)
   {
      // Set top of item
      (document.layers) ? this.getDivRef("divTwoLvlMenu"+i).top = iTop : this.getDivRef("divTwoLvlMenu"+i).style.top = iTop;
      iTop += this.m_iItemHeight;
      
      // Open this submenu
      if(i == iIndex && this.m_arrSubMenus[i])
      {
         this.drawItem(iIndex, this.m_sItemClassSel, true);
         this.m_arrMenu[i].m_bIsOpen = true;

         for(var i2=0; i2<this.m_arrSubMenus[i].length; i2++)
         {
            // Set top and show
            var oSubDiv = (document.layers) ? this.getDivRef("divTwoLvlMenu"+i+"-"+i2) : this.getDivRef("divTwoLvlMenu"+i+"-"+i2).style;
            oSubDiv.top = iTop;
            oSubDiv.visibility = (document.layers) ? "show" : "visible";
            iTop += this.m_iSubItemHeight;
         }
      }
   }
}

// OnClick for main menu items - hide and show
function TwoLvlMenuMClick(iIndex)
{
   var bIsOpen = this.m_arrMenu[iIndex].m_bIsOpen;
   this.collapseAll();

   // Open submenu only if it wasn't already open
   if(!bIsOpen)
   {
      this.showSubMenu(iIndex);

      // Run item onClick
      this.m_arrMenu[iIndex].mClick();
      this.m_iSelectedIndex = iIndex;
   }
}

// OnClick for submenu items - run object onClick
function TwoLvlMenuMClickSub(sIndex)
{
   this.drawItem(this.m_iSubSelected, this.m_sSubItemClass, false, true);
   this.m_iSubSelected = sIndex;
   this.drawItem(sIndex, this.m_sSubItemClassSel, true, true);

   var arrIndex  = sIndex.split("-");
   var oSubMenu  = this.m_arrSubMenus[arrIndex[0]][arrIndex[1]];
   oSubMenu.mClick();
}

// Draw a menu item
function TwoLvlMenuDrawItem(iIndex, sClass, bSelect, bSubItem)
{
   if(iIndex == null)
      return;

   var oDiv  = this.getDivRef("divTwoLvlMenu"+iIndex);
   var sHtml = "";
   var oItem = (bSubItem) ? this.m_arrSubMenus[iIndex.split("-")[0]][iIndex.split("-")[1]] : this.m_arrMenu[iIndex];

   if(bSubItem)
   {
      if(!bSelect)
         sHtml = oItem.innerDraw(this.m_sObjName, this.m_sSubItemHtmlBeforeName, this.m_sSubItemHtmlAfterName, sClass, iIndex);
      else
         sHtml = oItem.innerDraw(this.m_sObjName, this.m_sSubItemClickHtmlBeforeName, this.m_sSubItemClickHtmlAfterName, sClass, iIndex);
   }
   else
   {
      if(!bSelect)
         sHtml = oItem.innerDraw(this.m_sObjName, this.m_sItemHtmlBeforeName, this.m_sItemHtmlAfterName, sClass, iIndex);
      else
         sHtml = oItem.innerDraw(this.m_sObjName, this.m_sItemClickHtmlBeforeName, this.m_sItemClickHtmlAfterName, sClass, iIndex);
   }
      
   if(document.layers)
   {
      oDiv.document.open();
      oDiv.document.writeln(sHtml);
      oDiv.document.close();
   }
   else
      oDiv.innerHTML = sHtml;
}

// Draw the entire menu
function TwoLvlMenuDraw()
{
   var sHtml  = "<FORM NAME=frmTwoLvlMenu METHOD=get><INPUT TYPE=hidden></FORM>";
   var sNsFix = (document.layers) ? "<DIV ID=divTwoLvlMenuNs4Fix style=\"position:absolute; left:-1px; top:-1px; height:1px; width:1px\"></div>" : "";

   var iSubItemTop;
   var iItemTop = this.m_iTop;

   for(var i=0; i<this.m_arrMenu.length; i++)
   {
      sHtml    += this.m_arrMenu[i].draw(this.m_sObjName, iItemTop, this.m_iLeft, this.m_iWidth, this.m_iItemHeight, this.m_iZIndex, this.m_sItemHtmlBeforeName, this.m_sItemHtmlAfterName, this.m_sItemClass, i);
      iItemTop += this.m_iItemHeight;
      if(this.m_arrSubMenus[i])
      {
         for(var i2=0; i2<this.m_arrSubMenus[i].length; i2++)
            sHtml += this.m_arrSubMenus[i][i2].draw(this.m_sObjName, 0, this.m_iLeft, this.m_iWidth, this.m_iSubItemHeight, this.m_iZIndex, this.m_sSubItemHtmlBeforeName, this.m_sSubItemHtmlAfterName, this.m_sSubItemClass, i+"-"+i2);
      }
   }
   document.writeln(sNsFix + sHtml);
}

// Add menu item
function TwoLvlMenuAddItem(sName, sUrl, sTarget, sRunOnClick)
{
   var i = this.m_arrMenu.length;
   this.m_arrMenu[i] = new TwoLvlMenuItem(sName, sUrl, sTarget, sRunOnClick, false);
   return i;
}

// Add submenu item
function TwoLvlMenuAddSubItem(iParent, sName, sUrl, sTarget, sRunOnClick)
{
   // If no submenu array, create new
   if(!this.m_arrSubMenus[iParent])
      this.m_arrSubMenus[iParent] = new Array();
   
   // Get submenu array
   var arrSubMenu = this.m_arrSubMenus[iParent];

   // Add sub menu item to array
   this.m_arrSubMenus[iParent][arrSubMenu.length] = new TwoLvlMenuItem(sName, sUrl, sTarget, sRunOnClick, true);
}


/*********************************************************/

// TwoLvlMenuItem class constructor
function TwoLvlMenuItem(sName, sUrl, sTarget, sRunOnClick, bIsChild)
{
   this.m_sName       = sName;
   this.m_sUrl        = sUrl;
   this.m_sTarget     = sTarget;
   this.m_sRunOnClick = sRunOnClick;
   this.m_bIsChild    = bIsChild;
   this.m_bIsOpen     = false;

   this.draw      = TwoLvlMenuItemDraw;
   this.innerDraw = TwoLvlMenuItemInnerDraw;
   this.mClick    = TwoLvlMenuItemMClick;
}

// OnClick
function TwoLvlMenuItemMClick()
{
   // Use form to goto url (in target)
   if(this.m_sUrl)
   {
      var oForm = document.forms["frmTwoLvlMenu"];
      oForm.action = this.m_sUrl;
      if(this.m_sTarget)
         oForm.target = this.m_sTarget;
      oForm.submit();
   }

   // Run extra function
   if(this.m_sRunOnClick)
      eval(this.m_sRunOnClick);
}

// Make the divs inner html for this item
function TwoLvlMenuItemInnerDraw(sParent, sHtmlBeforeName, sHtmlAfterName, sClass, iIndex)
{
   var sStyle, sMouseOver, sClick, sMouseOut, sInnerHtml, sDiv;
   var sInnerHtml = "";

   // Events
   sMouseOver = "";
   sClick     = "return false;";
   sMouseOut  = "";
   //sMouseOver = sParent + ".mOver('" + iIndex + "');" + sMouseOver;
   //sMouseOut  = sParent + ".mOut('" + iIndex + "');" + sMouseOut;

   if(!this.m_bIsChild)
      sClick = sParent + ".mClick('" + iIndex + "');" + sClick;
   else
      sClick = sParent + ".mClickSub('" + iIndex + "');" + sClick;

   // A HREF
   sInnerHtml = "<A HREF=\"#\" onMouseOver=\"" + sMouseOver + "\" onClick=\"" + sClick + "\" onMouseOut=\"" + sMouseOut + "\" onFocus=\"this.blur();\" CLASS=\"" + sClass + "\">" + this.m_sName + "</A>";

   return sHtmlBeforeName + sInnerHtml + sHtmlAfterName;
}

// Make the html for the div
function TwoLvlMenuItemDraw(sParent, iTop, iLeft, iWidth, iHeight, iZIndex, sHtmlBeforeName, sHtmlAfterName, sClass, iIndex)
{
   var sStyle, sDiv;
   var sContent = this.innerDraw(sParent, sHtmlBeforeName, sHtmlAfterName, sClass, iIndex);

   // DIV style properties
   sStyle  = "position:absolute;";
   sStyle += "top:" + iTop + "px;";
   sStyle += "left:" + iLeft + "px;";
   sStyle += "width:" + iWidth + "px;";
   sStyle += "height:" + iHeight + "px;";
   sStyle += "z-index:" + iZIndex + ";";

   if(this.m_bIsChild)
      sStyle += "visibility:hidden;";

   // Put them all together
   sDiv = "<DIV ID=\"divTwoLvlMenu" + iIndex + "\" STYLE=\"" + sStyle + "\">" + sContent + "</DIV>\n"

   return sDiv;
}
