/**
    dynMenu 2.1
    requires:
    - prototype 1.4.0
*/


/* Depends on prototype.js 1.4.0 */

function indiPopup(targetID, popupID) {
    var popObj= $(popupID);
    var targetObj = $(targetID);
    targetObj.blur();
    if (popObj.style['visibility']=='visible'){
        indiHide(popObj);
    } else {
/*
        addEvent(popObj,'focus',function() {indiShow(popupID);});
        addEvent(popObj,'mouseover',function() {indiShow(popupID);});

        addEvent(popObj,'mouseout',function() {eval("window.setTimeout('indiHide(\"" + popupID + "\")',500)");});
        addEvent(popObj,'blur',function() {eval("window.setTimeout('indiHide(\"" + popupID + "\")',500)");});
        addEvent(targetObj,'mouseout',function() {eval("window.setTimeout('indiHide(\"" + popupID + "\")',500)");});
*/
        indiShow(popObj);
    }
    return false;
}

function indiShow(objID) {
    $(objID).style['visibility']='visible';
}

function indiHide(objID) {
    $(objID).style['visibility']='hidden';
}

function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}

var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

addEvent(window,'unload',EventCache.flush);

// the timeout for the menu
var timeout = 500;

// creat timeout variables for list item
// it's for avoid some warning with IE
for( var i = 0; i < 100; i++ ) {
    eval("var timeoutli" + i + " = false;");
}

// this fonction apply the CSS style and the event
function initMenu( elementbyid ) {
    // a test to avoid some browser like IE4, Opera 6, and IE Mac

    // get some element
    var menu = $(elementbyid); // the root element
    var lis = menu.getElementsByTagName('li'); // all the li
    
    // change the class name of the menu, 
    // it's usefull for compatibility with old browser
    menu.className=elementbyid;
    
    // i am searching for ul element in li element
    for ( var i=0; i<lis.length; i++ ) {
        // is there a ul element ?
        if ( lis.item(i).getElementsByTagName('ul').length > 0 ) {        
            // link events to list item
            addEvent(lis.item(i),'mouseout',timeoutHide);
            addEvent(lis.item(i),'blur',timeoutHide);
            addEvent(lis.item(i),'focus',show);
            addEvent(lis.item(i),'mouseover',show);
            
            // add an id to list item
            lis.item(i).setAttribute( 'id', "li"+i );
            lis.item(i).getElementsByTagName('a')[0].className = 'menuIndicateur';
         }
         // won't quite work
         // else addEvent(lis.item(i),'mouseover',function() {hideAllOthersUls( lis.item(i) );});
         
    }
}
  
// hide the first ul element of the current element
function timeoutHide() {
    // start the timeout
    eval( "timeout" + this.id + " = window.setTimeout('hideUlUnder( \"" + this.id + "\" )', " + timeout + " );");
}

// hide the ul elements under the element identified by id
function hideUlUnder( id ) {   
    $(id).getElementsByTagName('ul')[0].style['visibility'] = 'hidden';
	alink = document.getElementById(id).getElementsByTagName('a')[0];
	alink.className = '';
}

// show the first ul element found under this element
function show() {
    // show the sub menu
    this.getElementsByTagName('ul')[0].style['visibility'] = 'visible';
	alink = this.getElementsByTagName('a')[0];
	alink.className = 'hover';
    // clear the timeout
    eval ( "clearTimeout( timeout"+ this.id +");" );
    hideAllOthersUls( this );
}

// hide all ul on the same level of  this list item
function hideAllOthersUls( currentLi ) {
    var ul = currentLi.parentNode;
    for ( var i=0; i<ul.childNodes.length; i++ )
        if ( ul.childNodes[i].id && ul.childNodes[i].id != currentLi.id )
            hideUlUnderLi( ul.childNodes[i] );
}


// hide all the ul wich are in the li element
function hideUlUnderLi( li ) {
	alink = li.getElementsByTagName('a')[0];
	alink.className = '';	
    var uls = li.getElementsByTagName('ul');
    for ( var i=0; i<uls.length; i++ )
        uls.item(i).style['visibility'] = 'hidden';
}