/*
Script : mooVslideMenu
achhh, class de menus d�roulants r�cursive pour g�rer un nombre illimit� de sous menus
massacred by christopher wait aka virtualgadjo - 03/2009
tourne avec mootools 1.2
*/
var mooVslideMenu = new Class ({

	Implements: [Events, Options],

	options: {
		duration       : 400,
		mainMouseEvent : 'click',
		subMouseEvent  : 'click',
		mainTransition : Fx.Transitions.linear,
		subTransition  : Fx.Transitions.linear,
		mainMode       : 'vertical',
		subMode        : 'vertical',
		selectClass    : 'selectItem',
    keepOpenClass  : 'active'
	},

	initialize: function(ziList, options) {
		this.setOptions(options);
		this.menu     = $(ziList);
		this.togs     = [];
		this.slides   = [];
		this.alone    = [];
		this.slidesFx = [];
		this.menuLi   = this.menu.getChildren('li');

		this.menuLi.each(function(el){
			if (el.getChildren('ul').length > 0){
				this.togs.push(el.getFirst('a'));
				this.slides.push(el.getFirst('ul'));
			}
			else this.alone.push(el.getFirst('a'));
		}.bind(this));

		this.slides.each(function(el, i){

			this.nextLevel(el, i);

			var slideFx = new Fx.Slide(el, {
				duration   : this.options.duration,
				transition : this.options.mainTransition,
				mode       : this.options.mainMode,
				onComplete : function(){
					if(slideFx.wrapper.offsetHeight != 0){
						slideFx.wrapper.setStyle('height', 'auto');
					}
				}.bind(this)
			});

      if(!el.hasClass(this.options.keepOpenClass))
        slideFx.hide();

			this.slidesFx.push(slideFx);

			if(this.slides[i].getParent().getParent().getFirst('a').hasClass(this.options.selectClass)){
				slideFx.slideIn();
			}

			this.togs.each(function(elem, j){
				elem.addEvent(this.options.mainMouseEvent, function(e){
					this.alone.each(function(elem){ elem.removeClass(this.options.selectClass) }.bind(this));
					e.stop();
					if( i == j ){
						this.slidesFx[i].slideIn();
						this.togs[i].addClass(this.options.selectClass);
					}
					else {
						this.slidesFx[i].slideOut();
						this.togs[i].removeClass(this.options.selectClass);
						this.removeSelect(this.slides[i]);
					}
				}.bind(this));
			}.bind(this));

			this.alone.each(function(el, i){
				el.addEvent('click', function(){
					this.slidesFx.each(function(ele){ ele.slideOut(); }.bind(this));
					this.togs.each(function(elem){ elem.removeClass(this.options.selectClass) }.bind(this));
				}.bind(this));
			}.bind(this));

		}.bind(this));
	},
	//presque la m�me mais �v�nement de souris, transition et sens du slide
	//peuvent �tre diff�rents du niveau principal.
	//Comprend la r�cursivit�, le premier niveau ne peut pas �tre
	//r�cursif - too much... - si on veut profiter des options instanci�es
	nextLevel: function(el, i){
		var level     = i;
		var newel     = el;
		var newtogs   = [];
		var newslides = [];
		var newalone  = [];
		var newMenuLi = newel.getChildren('li');

		//alert(this.slidesFx);

		newMenuLi.each(function(el){
			if (el.getChildren('ul').length > 0){
				newtogs.push(el.getFirst('a'));
				newslides.push(el.getFirst('ul'));
			}
			else newalone.push(el.getFirst('a'));
		}.bind(this));

		newslides.each(function(el, i){

			this.nextLevel(el, i);

			var newSlideFx = new Fx.Slide(el, {
				duration   : this.options.duration,
				transition : this.options.subTransition,
				mode       : this.options.subMode,
				onComplete : function(){
					if(newSlideFx.wrapper.offsetHeight != 0){
						newSlideFx.wrapper.setStyle('height', 'auto');
					}
				}.bind(this)
			});
      
      if(!el.hasClass(this.options.keepOpenClass))
        newSlideFx.hide();

			if(newslides[i].getParent().getParent().getFirst('a').hasClass(this.options.selectClass)){
				newSlideFx.slideIn();
			}

			newtogs.each(function(elem, j){
				elem.addEvent(this.options.subMouseEvent, function(e){
					newalone.each(function(elem){ elem.removeClass(this.options.selectClass) }.bind(this));
					e.stop();
					if( i == j ){
						newtogs[i].addClass(this.options.selectClass);
						newSlideFx.slideIn();
					}
					else {
						newSlideFx.slideOut();
						newtogs[i].removeClass(this.options.selectClass);
						this.removeSelect(newslides[i]);
					}
				}.bind(this));
			}.bind(this));

			newalone.each(function(el, i){
				el.addEvent('click', function(){
					newSlideFx.slideOut();
					newtogs.each(function(elem){ elem.removeClass(this.options.selectClass) }.bind(this));
				}.bind(this));
			}.bind(this));
/*
			if (this.slidesFx[level] &&this.slidesFx[level].wrapper.offsetHeight == 0){
				for (j = 0; j < i+1; j++){
					newSlideFx.hide();
				}
			}
*/
		}.bind(this));
	},

	removeSelect: function(el){
		el.removeClass(this.options.keepOpenClass);
		var ziElem = el.getChildren();
		ziElem.each(function(elem){
			elem.removeClass(this.options.selectClass);
			elem.removeClass(this.options.keepOpenClass);
			this.removeSelect(elem);
		}.bind(this));
	}

});




