// JavaScript Document//
//bw-menu.js
//simple dynamic menu
//
//by Bill Weiman http://bw.org/
//Copyright (c) 2009 BWG LLC
//
//Version 1.0.1
//Created for Dynamic Menus course at lynda.com
//

//configuration variables
var timeout   = 100; //milliseconds
var fadeSpeed = 250; //milliseconds
var useFade   = true;

//timers array
var timers = new Array();

//state array -- by id, value = active, falce = inactive
var state = new Array();

//lastOpacity: used to prevent multiple timers from making the fade flicker
var lastOpacity = new Array();

//MSIE has its own way of setting opacity, so we have to detect it
//all the 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;
	}
}


//Swap Main Hover images
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}
function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
//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 multiple t
	
	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 );
	var timer = 0;
	var i;
	
	state[id] = false;
	
	for( i = s; i >= 0 ; i-- ) {
		setTimeout( "setOpacity('" + id + "'," + ( i / s ) + ")", timer++ * fadeSpeed / s )
	}
}
	

