// 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 (hover state)
var topActiveClassName = "topNavActive";

//this is the active state class name for top level items (current state)
var topCurrentClassName = "topNavCurrent";

//this is the active state class name
var activeClassName = "activeItem";

//this is the inactive state class name
var inactiveClassName = "nonActiveItem";

// pMenu  -> the menu which is the anchor is in - string id or object ref
// id     -> id of the menu to be shown
// anch   -> 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()",100);};
   
   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;  
   }
   
   toggleFlash("off");
   
   var top    = getOffsetProperty(anch, "Top", "topnav");
   var left   = getOffsetProperty(anch, "Left", "topnav");
   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-offset)+"px";
                  menu.style.left = (left+width+offset)+"px";
                  // mac ie5.2 hack //bad form but it works
                  var ua = navigator.userAgent.toLowerCase(); 
                  var ieMac    = ((ua.indexOf("msie") != -1) && (ua.indexOf("mac")!=-1)); 
                  if(ieMac)
                     menu.style.left = (parseInt(menu.style.left)-15)+"px";
                  break;
                 }
   }
   menu.style.visibility='visible';

   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);};
}

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;
         }
       }
	   
// Hides the Top level buttons 
    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(visibleMenus.length == 0)
      toggleFlash("on");
}

function noSubMenu(item)
{   
   if(typeof item == "object")
   {
      currentMenu = item;
   }else{
      currentMenu = document.getElementById(item);
   }
   currentMenu.childMenu = null;
   hideMenus();
}

function activateNavItem(item)
{  
   if(item.className.indexOf(topCurrentClassName) >= 0)
   {
      return;
   }
   else {
      item.doNotDeactivate = false;
   }
    if(item.className.indexOf(topLevelClassName) >= 0)
   {      
        item.className = topLevelClassName +" "+ topActiveClassName;
   }else{
      if(item.className.indexOf(inactiveClassName) > 0)
      {
         item.className = item.className.replace(inactiveClassName,activeClassName);
      }else{
         item.className = activeClassName+" "+item.className;
      }
   }
}

function deactivateNavItem(item)
{
   if(item.className.indexOf(topCurrentClassName) >= 0)
   {
      return;
   }
   if(item.className.indexOf(topLevelClassName) >= 0)
   {      
         item.className = topLevelClassName;
   }else{
      if(item.className.indexOf(activeClassName) > 0)
      {
         item.className = item.className.replace(activeClassName,inactiveClassName);
      }else{
        item.className = inactiveClassName +" "+ item.className;
      }
   }
}


/**********************************************************************
   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;
      // mac ie5.2 hack //bad form but it works
      var ua = navigator.userAgent.toLowerCase(); 
      var ieMac    = ((ua.indexOf("msie") != -1) && (ua.indexOf("mac")!=-1)); 
      if(ieMac && element == relativeElm)
         offset -= eval('element.offset' + property)
   } while (element != relativeElm && element != null);
   return parseInt(offset);
}

/*******************************************************************************************
   is the document ready - to append a node in IE the page must be completely loaded
 ******************************************************************************************/

function testReady()
   { //document.readyState == uninitialized || loading || interactive || complete
      if(document.readyState)
      {
         if(document.readyState == "complete")
         {
            return true;
         }
            return false;
      }
            return true;
   }
   
   
function toggleFlash(onOff)
{

   var ua        = navigator.userAgent.toLowerCase(); 
   var ns        = (ua.indexOf('mozilla')!=-1 && ua.indexOf('spoofer')==-1 && ua.indexOf('compatible') == -1 && ua.indexOf('opera')==-1 && ua.indexOf('webtv')==-1); 
	var gecko     = (ua.indexOf('gecko') != -1);
   var firefox   = (ua.indexOf('firefox') != -1);
   var mozilla   = (gecko && ua.indexOf("gecko/") + 14 == ua.length);
   if(ns)
   {
      if(mozilla || firefox)
      ns = false;
   }
	var noFlashLayers  = (ns); 

   if(noFlashLayers && document.getElementById('flashToHide') && document.getElementById('imageToShow') )
   {
      if(onOff == "on")
      {
      document.getElementById('imageToShow').style.display = "none";
      document.getElementById('flashToHide').style.display = "block";
      }
      if(onOff == "off")
      {
      document.getElementById('imageToShow').style.display = "block";
      document.getElementById('flashToHide').style.display = "none";
      }
   }
}
