//drop-down-menu.js
//
//script by: Bill Weinman http://bw.org/
//copyright (c) 2009 BHG LLC
//Version 1.0.1
//


//configurable variables
var timeout = 120;//milliseconds
var fadeSpeed = 100;//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 making the fade flicker
var lastOpacity = new Array();

//MSIE has it's own way of setting opacity, so we have to detect it
//all the other major browsers support the standard DOM opacity property in CSS
var msie = false;
if( navigator.appName == "Microsoft Internet Explorer") msie = true;

//entry point: set element to visible and clear it's 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 it's 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 teh 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 interupted
	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); //all other browsers (standard DOM)
	
	if(value == 0) hideMenu( id );
	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 )
	}
}


