/*
Menu
@version 8.0
@description Crée un menu déroulant récursif
@author IRCF
TODO Ajouter différentes transitions (slide vertical/horizontal)
Exemple :
<ul class="menu">
	<li>
		<a href="#">Item 1</a>
		<ul>
			<li><a href="#">Sous-Item 1</a></li>
			<li><a href="#">Sous-Item 2</a></li>
		</ul>
	</li>
	<li><a href="#">Item 2</a></li>
</ul>
*/
/* Menu V8 */
var Menu = new Class({
	Implements : Options,
	options : {
		showMinLevel : 0,
		hideDelay : 300,
		morph : {
			showStyles : {opacity:1},
			hideStyles : {opacity:0},
			options : {link:'cancel',duration:200}
		},
		toggleOnClick : false
	},
	initialize: function(menu,options){
		this.setOptions(options);
		this.menu = document.id(menu);
		if (this.menu){
			this.items = document.id(menu).getChildren('li');
			this.items.each(function(item,i){
				item.i = i;
				item.link = item.getElement('a');
				item.link.addEvent('focus',this.showItem.bind(this,item));
				item.submenu = item.getElement('ul');
				if (this.options.showMinLevel>0){
					if (item.submenu) item.submenu.setStyle('display','block');
				}else if (this.options.toggleOnClick){
					item.addEvent('click',this.toggleItem.bind(this,item));
				}else{
					item.addEvents({mouseenter:this.showItem.bind(this,item),mouseleave:this.hideItem.bind(this,item)});
				}
				if (item.submenu){
					item.submenu.morph = new Fx.Morph(item.submenu,this.options.morph.options);
					var options = $merge(this.options);
					options.showMinLevel = options.showMinLevel-1;
					new Menu(item.submenu,options);
				}
			}.bind(this));
		}
	},
	showItem : function(item){
		this.timer = $clear(this.timer);
		item.link.addClass('hover');
		if (item.submenu){
			item.submenu.morph.start(this.options.morph.showStyles).chain(function(){item.submenu.setStyle('display','block');}.bind(this));
		}
		this.items.each(function(otherItem,j){
			if (item.i!=j) this.hideItemNow(otherItem);
		}.bind(this));
	},
	hideItem : function(item){
		this.timer = $clear(this.timer);
		this.timer = this.hideItemNow.bind(this,item).delay(this.options.hideDelay);
	},
	hideItemNow : function(item){
		if (item.link){
			item.link.removeClass('hover');
			if (item.submenu){
				item.submenu.morph.start(this.options.morph.hideStyles).chain(function(){item.submenu.setStyle('display','none');}.bind(this));
			}
		}
	},
	toggleItem : function(item){
		// TODO Fix
		//if (item.hasClass('hover')){
		//	this.hideItemNow(item);
		//}else{
			this.showItem(item);
		//}
	}
});

