org.berthomg.createNamespace('org.berthomg.dynMenu', 0.1);

org.berthomg.dynMenu.timeoutLi = new Hash();

org.berthomg.dynMenu.MenuMaker = new Class({

	timeout: 250,
	timeoutLi: new Hash(),
	menu: null,
	
	initialize: function(menu) {
		var menu = $(menu);
		var lis = menu.getElementsByTagName('li');
		
		if(!menu.hasClass('menu')) menu.addClass('menu');
		menu.removeClass('invisible');
		
		this.menu = menu;
		
		for ( var i=0; i<lis.length; i++ ) {
	        var li = lis.item(i);
			li = $(li);
			// is there a ul element ?
			if ( li.getElementsByTagName('ul').length > 0 ) {        
				li.addEvent('keyup', this.show.pass(li, this));
	        }
            // link events to list item
			li.addEvent('mouseover', this.show.pass(li, this));
			li.addEvent('focus',     this.show.pass(li, this));
			li.addEvent('mouseout',  this.timeoutHide.pass(li, this));
			li.addEvent('blur',      this.timeoutHide.pass(li, this));

            li.setProperty('id', 'li'+i);
	    }
	},
	
	timeoutHide: function(eve) {
		this.timeoutLi.set(eve.id, window.setTimeout(this.hideUlUnder.pass(eve, this),this.timeout));
	},

	// hide the ul elements under the element identified by id
	hideUlUnder: function ( ele ) {   
    	var uls = $(ele).getElementsByTagName('ul');
		if(uls.length > 0)
			$(uls[0]).style.visibility = 'hidden';
	},
	
	show: function (eve) {
		// show the sub menu
	    var uls = eve.getElementsByTagName('ul');
			if(uls.length > 0) {
                $(uls[0]).style.visibility = 'visible';
            }
	    var currentNode=$(eve);
	    while(currentNode) {
			currentNode = $(currentNode);
			if( currentNode.nodeName=='LI') {
			    var aas = currentNode.getElementsByTagName('a');
				if(aas.length > 0)
					$(aas[0]).addClass('linkOver');
			}
			currentNode=currentNode.parentNode;
	    }
	    // clear the timeout
		clearTimeout(this.timeoutLi.get(eve.id))
	    //eval ( "clearTimeout( ch.dosimple.timeout"+ this.id +");" );
	    this.hideAllOthersUls( eve );
	},
	
	// hide all ul on the same level of  this list item
	hideAllOthersUls: function ( currentLi ) {
	    var lis = $(currentLi.parentNode);
	    for ( var i=0; i<lis.childNodes.length; i++ ) {
	        if ( lis.childNodes[i].nodeName=='LI' && lis.childNodes[i].id != currentLi.id ) {
	            this.hideUlUnderLi( lis.childNodes[i] );
	        }
	    }
	},
	
	// hide all the ul wich are in the li element
	hideUlUnderLi: function ( li ) {
	    var lesas = $(li).getElementsByTagName('a');
	    for ( var i=0; i < lesas.length; i++ ) {
	        $(lesas.item(i)).className="";
	    }
	    var uls = li.getElementsByTagName('ul');
	    for ( var i=0; i<uls.length; i++ ) {
	        $(uls.item(i)).style['visibility'] = 'hidden';
	    }
	}
});

