/************************************************
GENERIC nav.js
 http://www.obliquemotion.com/js/nav/nav.js
 by Byron Tredwell (byron(AT)obliquemotion.com)
************************************************/

// the current visible menu 
// - all of its parents and its one direct child should be visible
var currentMenu = null;

//all currently visible menus
var visibleMenus = new Array();

//this class name is ALWAYS visible
var topLevelClassName = "topNavItem";

//this is the active state class name for top level items
var topActiveClassName = "topNavActiveItem";

//this is the base subNav class name 
var subNavItemName = "subNavItem";

//this is the active state class name
var activeClassName = "activeItem";

//this is the inactive state class name
var inactiveClassName = "inActiveItem";

// layer menus up false layers down null follows html/css zIndex
var zUp = true;
var zStart = 1000;
var currentZ = 1000;
var zInc = 5;
// pMenu  -> parent menu - the menu which is the anchor is in - string id or object ref
// id     -> child menu - id of the menu to be shown
// anch   -> anchor - the element which is the menu is to be shown from (ie this)
// dir    -> what side the menu is shown on r, b
// offset -> px offest in dir - allows for overlaping menus
function showMenu(pMenu,id,anch,dir,offset)
{

   if(typeof pMenu == "object")
   {
   var base = pMenu;
   }else{
   var base = document.getElementById(pMenu);
   }
   
   if(base.currentLink)
   {
   deactivateNavItem(base.currentLink);
   }
   base.currentLink = anch;
   activateNavItem(base.currentLink);
   visibleMenus[visibleMenus.length] = base;
   base.onmouseout = function(){currentMenu = null; setTimeout("hideMenus()",50);};
   
   if(id == null && dir == null && offset == null)
   {
      noSubMenu(pMenu);
      return;
   }
   
   var menu   = document.getElementById(id);
   //if the nav hasn't loaded get out
   if(typeof menu == "undefined" || menu == null )
   {
    return;  
   }
   var top    = getOffsetProperty(anch, "Top");
   var left   = getOffsetProperty(anch, "Left");
   var width  = anch.offsetWidth;
   var height = anch.offsetHeight;
   if(top == "NaN" || left == "NaN")
   {
    return;  
   }
   if(offset == null || typeof offset == "undefined")
      offset = 0;

   switch(dir)
   {
      case "b" : {
                  menu.style.top  = (top+height+offset)+"px";
                  menu.style.left = (left)+"px";
                  break;
                 }      
      case "r" : {
                  menu.style.top  = (top)+"px";
                  menu.style.left = (left+width+offset)+"px";
                  break;
                 }
      case "l" : {
                  menu.style.top  = (top)+"px";
                  menu.style.left = (left-width-offset)+"px";
                  break;
                 }
   }   
   if(zUp!=null)
   {
      if(zUp)
      {
         currentZ += zInc;
      }else{
         currentZ -= zInc;
      }
      menu.style.zIndex = currentZ
   }
   menu.style.visibility = "inherit";

   if(menu.currentLink)
   {
   deactivateNavItem(menu.currentLink);
   menu.currentLink = null;
   }
   currentMenu     = base;
   base.childMenu  = menu;
   menu.parentMenu = base;
   visibleMenus[visibleMenus.length] = menu;
   
   menu.onmouseout = function(){currentMenu = null; setTimeout("hideMenus()",50);};
   setMouseOvers(menu);  
    
   if(typeof doShadow == "function") 
      doShadow(menu);
      
   if(typeof toggleForms == "function") 
      toggleForms();
      
}

function hideMenus()
{
   var mTreeBase       = currentMenu;
   var resetVisArray   = new Array();
   var activeMenuArray = new Array();
   if(mTreeBase !=null)
     {
      do {
      activeMenuArray[activeMenuArray.length] = mTreeBase;
      activeMenuArray[activeMenuArray.length] = mTreeBase.shadow;
      mTreeBase = mTreeBase.parentMenu;
      } 
      while (mTreeBase != null);
      if(currentMenu.childMenu !=null)
      {
      activeMenuArray[activeMenuArray.length] = currentMenu.childMenu;
      activeMenuArray[activeMenuArray.length] = currentMenu.childMenu.shadow;
      }
     }

   for(i=visibleMenus.length-1; i>=0; i--)
   {
    var m = visibleMenus[i];
    if(m == null)
         continue;
    var hideIt = true;
       for(j=0;j < activeMenuArray.length;j++)
       {
         if(m == activeMenuArray[j])
         {
            hideIt = false;
            break;
         }
       }
    if(hideIt == true)
    {
     if(m.className.indexOf(topLevelClassName) < 0)
     {
      m.style.visibility = "hidden";   
     }
     if(m.currentLink)
     {
      deactivateNavItem(m.currentLink);
      m.currentLink = null;
     }
    }else{
     resetVisArray[resetVisArray.length] = m;
    }
   }
   visibleMenus = resetVisArray;
   if(typeof toggleForms == "function") 
      toggleForms();
}

function noSubMenu(item)
{
   if(typeof item == "object")
      currentMenu = item;
   else
      currentMenu = document.getElementById(item); 
  
   currentMenu.childMenu = null;
   hideMenus();
}

function activateNavItem(item)
{  
/*alert (topLevelClassName);*/
    if(item.className.indexOf(topLevelClassName) >= 0)
   {
        item.className = item.className +" "+ topActiveClassName;
   }else{
      if(item.className.indexOf(inactiveClassName) > 0)
      {
         item.className = item.className.replace(inactiveClassName,activeClassName);
      }else{
         item.className = item.className +" "+ activeClassName;
      }
   }
}

function deactivateNavItem(item)
{
   if(item.className.indexOf(topLevelClassName) >= 0)
   {      
         item.className = item.className;
   }else{
      if(item.className.indexOf(activeClassName) > 0)
      {
         item.className = item.className.replace(activeClassName,inactiveClassName);
      }else{
         item.className = item.className +" "+inactiveClassName;
      }
   }
}

function setMouseOvers(menu)
{
   for(i=0;i<menu.childNodes.length;i++)
   { 
      if(menu.childNodes[i].className == subNavItemName && (typeof menu.childNodes[i].onmouseover == "undefined" || !menu.childNodes[i].onmouseover))
         menu.childNodes[i].onmouseover= function(){showMenu(menu.id,null,this);};
   }
}

/**********************************************************************
   Retrive the offset Left or Top of an elm relative to another
 *********************************************************************/

function getOffsetProperty(elementID, property, relativeElmID) {
   var offset = 0;
   if(typeof elementID == "object")
   {
   var element = elementID;
   }else{
   var element = document.getElementById(elementID);
   }  
   if(typeof element == "undefined" || element == null)
   {
    return "NaN";  
   }
   var relativeElm = document.getElementById(relativeElmID);
 
   if(relativeElm == null || typeof relativeElm == "undefined")
      relativeElm = document.body;
   do {
      offset += eval('element.offset' + property);
      element = element.offsetParent;
   } while (element != relativeElm && element != null);
   return parseInt(offset);
}

