/**
 * @compagny : Archriss, web agency & ingénérie
 * @website : www.archriss.fr
 * @author : Jean-Philippe RIVET
 * @contact : jprivet@archriss.com
 * @copyriht : Tous droits réservés
 * @purpose : ...
 */

/* *************************************** */
/* Ecriture basique */
/* *************************************** */

(function($){
	
	// Définition des méthodes dans l'espace de nommage unique
	var methods = {
		// exemple pour "options" : {param3: 'param3', param4: 'param4'}
		ini : function(options){
			
			// A la place de "$(this)" écrire ici "this", ce dernier étant déjà un objet jQuery.
			
			// Maintient de la chainabilité avec "return"
			return this.each(function(){
				
				// Initialisation de this
				var $this = $(this);
				
				// Récupération des données liées à l'objet en cours
				var data = $this.data('options');
				 
				// Si le plugin n'a pas été encore initialisé
				if (!data){
					
					// Paramètres par defaut
					var o = {
						target		: $this,
						message		: 'coucou'
					};
					
			        // Si les options existent...
					if(options){ 
				        $.extend(o, options);
				    }
					
					// Application des paramètres
					$(this).data('options', o);
					$(this).addClass('menuaccordion_dataoptions');
				}
   
				// Exemple d'application de function du l'espage nommé
				/*$this.click(function(){
					$(this).menuaccordion('action');
				});*/
				
				$this.find('li').each(function(){
					pointer = $(this).children('a').first().children('span.pointer');
					if($(this).children('ul').length == 0){
						if(!$(this).hasClass('level_2')){
							pointer.hide();							
						}
					} else {
						pointer.click(function(e){
							e.preventDefault();
							ul = $(this).parent().parent().children('ul');
							$(this).toggleClass('show').parent().parent().children('ul').e('blind');
						});
						if(!$(this).hasClass('active')){
							pointer.toggleClass('show').parent().parent().children('ul').first().hide();
						}
						
					}
				});
				
				
			});
			
		},
		action : function(){
			
			return this.each(function(){
				
				// Initialisation de this
				var $this = $(this);
				
				// Exemple de récupération de paramètres
				alert($this.menuaccordion('getOptions').param3);
				
			});
			
		},
		getOptions : function(){
			
			// Si l'élément en cours à déjà la classe "menuaccordion_dataoptions"...
			if(this.data('options')){
				// Retour du data
				return this.data('options');
			} else {
				// Recherche du target et retour du data
				return this.parents('.menuaccordion_dataoptions:first').data('options');
			}
			
		},
		setOptions : function(options){
			
			// Si l'élément en cours à déjà la classe "menuaccordion_dataoptions"...
			if(this.data('options')){
				// Retour de l'objet en cours
				var domElem = this;
			} else {
				// Recherche et retour du target
				var domElem = this.parents('.menuaccordion_dataoptions:first');
			}
			
			var o = domElem.data('options');
			
	        // Si les options existent...
			if(options){ 
		        $.extend(o, options);
		    }

			return domElem.data('options', o);
		}
	};

	// Création du plugin
	$.fn.menuaccordion = function(method) {
		if (methods[method]){
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || ! method) {
			return methods.ini.apply(this, arguments);
		} else {
			$.error('Method ' + method + ' does not exist on jQuery.menuaccordion');
		}		
	};
	
})(jQuery);

/* *************************************** */
/* Les bonnes pratiques */
/* *************************************** */

/*

* Toujours envelopper votre plugin dans (fonction($){//plugin ici})(jQuery);
* Employer directement "this" au lieu de "$(this)" dans le champs d'application immédiat d'une fonction du plugin
* Faire un retour de "this" pour maintenir la chainabilité des méthodes
* Préférer le passage de paramètres par objet afin de pouvoir les étendres avec les valeurs par défaut du plugin
* Utiliser un seul espace de nommage par pluggin pour les functions, évenements et données supplémentaires

*/


