var MooMenu = new Class({

	options: {
		duration:500,
		hideDuration:500,
		marginTop:'180px',
		transitionType:Fx.Transitions.Back.easeOut,
		selectClass:'selected',
		a1Class:'niv1',
		a2Class:'niv2b',
		n2Class:'niv2',
		n3Class:'niv3',
		premIndex:200,
		forceOpen:false
	},

	initialize:function(elementID,options)
	{
		this.setOptions(options);
		this.element = elementID;
		this.root = $(elementID);

		this.displayTimer = 0;

		this.insertTabIndexes();

		this.root.setStyles({'height':'160px','z-index':2});

		// deplacement des menus de niveau 3
		this.n3 = $$('#'+this.element+' li ul li ul');
		this.n3.each(function(el,i){
			el.injectBefore($(elementID));
			el.setStyle('z-index',1);
			el.addClass('n3');
			el.setStyles({width:'320px',background:'#006600',display:'none',position:'absolute',top:this.options.marginTop,left:'190px',height:'160px',opacity:0});
			el.getElements('a').each(function(link){
				link.addEvent('focus',function(){
					this.addClass('selected');
				});
			});
			el.getElements('a').each(function(link){
				link.addEvent('blur',function(){
					this.removeClass('selected');
				});
			});
		},this);

		this.n2 = $$('#'+this.element+' li ul');

	// deplacement des menus de niveau 2
		this.n2.each(function(el,i){
			el.injectBefore($(elementID));
			el.setStyle('z-index',1);
			el.addClass('n2');
			el.setStyles({width:'150px',background:'#006600',display:'none',position:'absolute',top:this.options.marginTop,left:'0px',height:'160px',opacity:0});
		},this);

		this.a1 = $$('#'+this.element+' li a');
		this.a2 = $$('.'+this.options.a2Class);

		// depliage du menu
		this.a1.each(function(el,i){
			this.bindHover(el);
		},this);

		this.a2.each(function(el,i){
			this.bindSHover(el);
		},this);


		// repliage du menu
		this.bindSOut(this.root,1);
		this.n2.each(function(el,i){
			this.bindSOut(el,2);
		},this);

		this.n3.each(function(el,i){
			this.bindSOut(el,3);
		},this);

		// depliage manuel
		if ($('deplier')) {
			$('deplier').addEvent('click',this.deplier.bind(this));
		}

	},

	// deplie le menu à l'arborescence courante (class .encours)
	deplier:function()
	{
		if (!this.options.forceOpen) {
			if (id = $('deplier').getProperty('rel')) {
				if (id.indexOf('_')<0) {
					$(id).focus();
				} else {
					var myChain = new Chain();
					myChain.chain(function(){
						$(id.substr(0,id.indexOf('_'))).fireEvent('focus');
					});
					myChain.chain(function(){
						$(id.substr(id.indexOf('_')+1)).focus();
					});
					var runChain = function() { 
							myChain.callChain();
							if (myChain.chains.length == 0){
								runChain = $clear(timer);
							} 
						}
					runChain.periodical(200);
				}
			} else {
				var decl1 = this.root.getElementsBySelector('.encours');
				if (decl1) {
					decl1.addClass('selected');
					decl1.fireEvent('mouseover');
					var menu1 = $('s'+(decl1.getProperty('id').toString().substr(1)));
					var decl2 = menu1.getElementsBySelector('li a.encours');
					if (decl2) {
						decl2.addClass('selected');
						decl2.fireEvent('focus');
						var menu2 = $('ss'+(decl2.getProperty('id').toString().substr(1)));
						var decl3 = menu2.getElementsBySelector('li a.encours');
						if (decl3) {
							decl3.addClass('selected');
						}
						var element = $(decl2.getProperty('id').toString());
						element.focus();
					}
				}
			}
			this.options.forceOpen = true;
		} else {
			this.options.forceOpen = false;
			$$('.menu').getLast().fireEvent('mouseleave');
		}
	},

	// perserve natural keyboard navigation order
	insertTabIndexes:function()
	{
		var index = this.options.premIndex;
		$$('#'+this.element+' a').each(function(link){
		//$$('a').each(function(link){
			link.setProperty('tabindex',index);
			index++;
		});
	},

	bindHover:function(element)
	{
		element.addEvents({'mouseover':function(e){ this.showMenu(element); }.bind(this),
						  'focus':function(e){ this.showMenu(element); }.bind(this)
						 });
	},

	bindSHover:function(element)
	{
		element.addEvents({'mouseover':function(e){ this.showSMenu(element); }.bind(this),
						  'focus':function(e){ this.showSMenu(element); }.bind(this)
						 });
	},

	bindSOut:function(element,niv)
	{
		element.addEvents({'mouseleave':function(e){ this.mouseOut(element,niv); }.bind(this),
						   'mouseenter':function(e){ this.DisplayTimer = $clear(this.displayTimer);}.bind(this)
						 });
	},

	showMenu:function(decl)
	{

		this.a1.removeClass('selected');
		this.a2.removeClass('selected');
		decl.addClass('selected');

		var menu = $('s'+decl.getProperty('id').substr(1,1));

		this.n3.each(function(el,i){
			el.setStyles({display:'none',opacity:0,left:0});
		});

		this.n2.each(function(el,i){
			el.setStyles({opacity:0,left:0,display:'none'});
		});

		if (menu) {
			menu.addClass('niv2C');
			menu.setStyle('display','block');
			menu.effects({'duration':this.options.duration,transition: this.options.transitionType}).start({'opacity':1,left:'162px'});
		}
	},

	showSMenu:function(decl)
	{

		this.a2.removeClass('selected');
		decl.addClass('selected');

		var smenu = $('ss'+decl.getProperty('id').substr(1,2));

		this.n3.each(function(el,i){
			el.setStyles({display:'none',opacity:0,left:'170px'});
		});

		if (smenu) {
			smenu.setStyle('display','block');
			smenu.effects({'duration':this.options.duration, transition:this.options.transitionType}).start({'opacity':1,left:'305px'});
		}

	},

	mouseOut: function(el,niv) {
		this.el = el;
		if (niv==3) {
			this.displayTimer = this.hideSMenu.delay(this.options.hideDuration,this);
		} else if(niv==2) {
			this.displayTimer = this.hideMenu.delay(this.options.hideDuration,this);
		} else {
			this.displayTimer = this.hide.delay(this.options.hideDuration,this);
		}
	},

	hide:function()
	{
		elem = this.el;
		var decl = elem.getElementsBySelector('.selected');
		var smenu = $('s'+decl.getProperty('id').toString().substr(1,2));
		this.el = smenu;
		this.hideMenu();
	},

	hideMenu:function()
	{
		elem = this.el;
		if (elem) {
			var decl = elem.getElementsBySelector('.selected');
			var smenu = $('ss'+decl.getProperty('id').toString().substr(1,2));
			this.el = smenu;
			this.hideSMenu();
		}
	},

	hideSMenu:function(smenu)
	{
		elem = this.el;

		if (elem) {
			elem.effects({duration:250}).start({opacity:0,left:'170px'}).chain(function(){
				elem.setStyle('display','none');
				var id=elem.getProperty('id').substr(2,2);
				var father=$('n'+id).getParent().getParent();
				father.effects({'duration':250}).start({'opacity':0,left:'0'});
			});
		} else {
			this.n2.each(function(el){
				if (el.getStyle('display')=='block') {
					el.effects({'duration':250}).start({'opacity':0,left:'0'});
				}
			});
		}
	}

});

MooMenu.implement(new Options);


