var MooMenu = new Class({

	options: {
		duration:500,
		hideDuration:500,
		marginTop:'152px',
		transitionType:Fx.Transitions.Back.easeOut,
		selectClass:'selected',
		a1Class:'niv1',
		a2Class:'niv2b',
		n2Class:'niv2',
		n3Class:'niv3',
		premIndex:200
	},

	initialize:function(elementID,options)
	{
		this.setOptions(options);
		this.element = elementID;
		this.root = $(elementID);

		this.displayTimer = 0;

		this.insertTabIndexes();

		this.root.setStyles({'height':'307px','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:'154px',background:'#1b74ab',display:'none',position:'absolute',top:this.options.marginTop,left:'152px',height:'307px',opacity:0});
		},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:'154px',background:'#196b9e',display:'none',position:'absolute',top:this.options.marginTop,left:'0px',height:'307px',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 (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)).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();
				}
			}
		}
	},

	// 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:'152px'});
		}
	},

	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:'152px'});
		});

		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:'153px'}).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);


