//navmenu.js
//simple dynamic menu

// configuration variables
var timeout   = 250; // milliseconds
var fadeSpeed = 500; // milliseconds
var useFade   = true;

// timers array
var timers = new Array();

// state array  -- by id, value = active, false = inactive
var state = new Array();

// lastOpacity: used to prevent multiple timers from makin the fade flicker
var lastOpacity = new Array();

// MSIE has its own way of setting opacity, so we have to detect it
// all other major browsers support the standard DOM opacity property
var msie = false;
if( navigator.appName == "Microsoft Internet Explorer" ) msie = true;

// entry point: set element to visible and clear its timers
function setMenu( id )
{
  var e = document.getElementById(id);
      e.style.visibility = "visible";
      state[id] = true;
      setOpacity (id, 1 );
      if(timers[id]) {
           clearTimeout(timers[id]);
           timers[id] = undefined;
      }
}

// set element to hidden and reset its opacity
// typically called by a timer
// may be used as an entry point to bypass timers and fades
function hideMenu( id )
{
   var e = document.getElementById(id);
   state[id] = false;
   e.style.visibility = "hidden";
   if(useFade) setOpacity( id, 1 );
}

// entry point: hide the menu using fade (if enabled)
function clearMenu( id )
{
    if(useFade) timers[id] = setTimeout( 'fadeMenu( "' + id + '" )', timeout );
    else timers[id] = setTimeout( 'hideMenu( "' + id + '")', timeout );
}

// set the opacity
// special support for MSIE
function setOpacity( id, value )
{
    var e = document.getElementById(id);
    
    if(state[id]) value = 1;      // menu fade was interrupted
    else if(lastOpacity[id] && (lastOpacity[id] < value)) value = lastOpacity[id]; //prevents flicker if mltiple
    
    if(msie) e.style.filter = 'alpha(opacity=' + value * 100 + ')'; //MS Internet Explorer
    else e.style.opacity = (value);  // Everyone else (standard DOM)
    
    if( value == 0 ) hideMenu( id ); // when all faded, reset the menu state
    lastOpacity[id] = value;
}

//  fade a menu
//  typically called by a timer
function fadeMenu ( id )
{
      var start = 0;
      var end = 0;
      var s = Math.round( fadeSpeed / 25 );  //  fade in 25ms increments
      var timer = 0;
      var i;
      
      state[id] = false;
      
      for( i = s; i >= 0 ; i-- ) {
          setTimeout( "setOpacity('" + id + "', " + ( i / s ) + ")", timer++ * fadeSpeed / s )
      }
}
