//	JavaScript Document
//
// 	bw-menu.js
//	simple dynamic menu
//
// by Bill Weiman http://bw.org/
// Copyright (c) 2009 BHG LLC
//
//  Version 1.0.1
// Created for Dynamic Menus course at lynda.com
//
// Ch. 4. Using JavaScript to Make a Menu Dynamic (Understanding JavaScript and the DOM)
//

// 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 mutlitple timers from making the fade flicker
var lastOpacity = new Array();

// MSIE has its won 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 elelment 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 multiple ti
		
		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 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 )
	}
}
		

