/*
---
description: Classe permetant de créer un menu déployable multi-niveaux

license: MIT-style

authors:
- Spider-Kid

requires:
- core/1.2.4: [Event, Class, Class.Extras, Element, Element.Event, Element.Style, Selectors, DomReady, Fx]
- more/1.2.4: [Fx.Style]

provides: [SKMenu]

Copyright (c) 2010 Spider-Kid
*/
var SKMenu = new Class({
	Implements: [Options, Events],
	options: {
		elementClass : 'ligne',  // désigne la classe de la balise regroupant un élement (opener + bloc)
		blocClass : 'liste', // désigne la classe de la balise qui sera a ouvrir au clic
		openerClass : 'titre',  // la class utilisé par l'élement qui servira a l'ouverture du bloc de niveau inférieur
		openMultiple : false,  // peut-il y avoir plusieurs bloc d'un même niveau d'ouvert simultanément ?
		startOpened : false,  // l'élement ouvert au lancement
		prefixeIdElement : "skm",  // préfixe utilisé dans la génération des ids des élements
		prefixeIdBloc : "skmBloc",  // préfixe utilisé dans la génération des ids des blocs
		openerClassActif : false,  // classe ajouté sur l'élement opener actif
		elementClassActif : 'actif'  // classe ajouté sur l'élément (opener + bloc)
	},
	root : $empty,
	current : $empty,
	iterator : 0,
	elements : Array(),
	/**
	 * initialisation
	 * @param {Element} root : l'élement racine qui contient l'ensemble du menu
	 * @param {Object} options
	 */
	initialize : function(root,options){
		this.setOptions(options);
		this.root = document.id(root);
		
		lesElements = this.root.getElements("."+this.options.elementClass);
		
		lesElements.each(this.initBlocs.bind(this));
		
		if(this.options.startOpened){
			this.ouvrir($(this.options.startOpened));
		}
	},
	/**
	 * initialisation d'un bloc
	 */
	initBlocs :function(element){
		bloc = element.getElement("."+this.options.blocClass);
		
		var self = this;
		
		if(bloc){
			id = element.get('id');
			if(!id){
				id = this.options.prefixeIdElement+this.iterator;
				id_bloc = this.options.prefixeIdBloc+this.iterator;
				this.iterator++;
				element.set('id',id);
				element.getElement('.'+self.options.blocClass).set('id',id_bloc);
			}
			self.elements[id] = new Fx.Slide(bloc);
			self.elements[id].hide();
			
			element.getElement('.'+self.options.openerClass).addEvent('click',function(e){
				id = this.getParent().get('id');
				
				self.elements[id].toggle();
				
				if(self.options.openerClassActif){ this.toggleClass(self.options.openerClassActif); }
				if(self.options.elementClassActif){ this.getParent().toggleClass(self.options.elementClassActif); }
				
				if(self.options.openMultiple===false){
					isopen = self.elements[id].open;
					
					leParent = this.getParent().getParent();
					
					childs = leParent.getElements("."+self.options.elementClass);
					childs = childs.erase(this.getParent());
					childs.each(self.closeBloc.bind(self));
				}
			});
		}
	},
	/**
	 * ferme un bloc
	 */
	closeBloc :function(element){
		bloc = element.getElement("."+this.options.blocClass);
		
		if(this.options.openerClassActif){ element.getElement("."+this.options.openerClass).removeClass(this.options.openerClassActif); }
		if(this.options.elementClassActif){ element.removeClass(this.options.elementClassActif); }
		
		if(bloc){
			id = element.get('id');
			this.elements[id].slideOut();
		}
	},
	/**
	 * ouvrir un bloc
	 */
	ouvrir :function(element){
		if(element){
			bloc = element.getElement("."+this.options.blocClass);
		
			if(this.options.openerClassActif){ element.getElement("."+this.options.openerClass).addClass(this.options.openerClassActif); }
			if(this.options.elementClassActif){ element.addClass(this.options.elementClassActif); }
			
			if(bloc){
				id = element.get('id');
				this.elements[id].show();
				this.elements[id].slideIn();
			}
			
			leParent = element.getParent("."+this.options.elementClass);
			if(leParent){
				this.ouvrir(leParent);	
			}
		}
	}
});
