/**
 * @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 : ...
 */

(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,
						durationEffect 		: 1000,
						durationPause		: 5000,
						indexNext			: null,
						indexPrevious		: null,
						indexCurrent		: 0,
						transitionEffect	: 'slideNormal',
						transitionMode		: 'hide', // hide : l'élément suivant apparait et cache l'élément en cours. show : l'élément en cours disparait et laisse apparaitre l'élément suivant
						navigationTag		: 'td', // li ou td
						play				: true
					};
					
			        // Si les options existent...
					if(options){ 
				        $.extend(o, options);
				    }
					
					// Application des paramètres
					$(this).data('options', o);
					$(this).addClass('maincarousel_dataoptions');
				}
				
				// Initialisation
				var items = $this.find('.main_content .item');
				
				// Blocage de la largeur et de la hauteur des items
				items.hide().each(function(){
					$(this).width($(this).width());
					$(this).height($(this).height());
				});
				
				// NAVIGATION
				var nav = $this.find('.main_navigation');
				var navItems = nav.find(o.navigationTag);
				navItems.first().addClass('active first');
				navItems.each(function(index){
					$(this).data('index', index);
				});
				
				navItems.click(function(){
					var index = $(this).data('index');
					items.eq(index).maincarousel('nextItem', index);
				});
				
				// BUTTON STOP PLAY
				var buttonToggle = $this.find('.button_toggle');
				buttonToggle.removeClass('stateStop').addClass('statePlay');
				buttonToggle.click(function(){
					var $this = $(this);
					var o = $this.maincarousel('getOptions');
					$this.maincarousel('buttonToggle');
				});
				
				// BEGIN : Temporisation et exécution du premier effet
				items.first().show().delay($this.maincarousel('tempDelay')).queue(function(){
					$(this).maincarousel('nextItem');
				});
				
			});
			
		},
		tempDelay : function(){
			
			var o = this.maincarousel('getOptions');
			var pause = o.durationPause;
			
			if(typeof pause == 'string'){
				var val = $(pause).val();
				if(val != undefined){
					pause = val;
				}
				if(parseInt(pause)){
					pause = parseInt(pause);
				}
			}
			return pause;
		},
		nextItem : function(indexNew){
			
			return this.each(function(){
				
				// Initialisation de this
				var $this = $(this);				
				var o = $this.maincarousel('getOptions');
				var current = o.indexCurrent;				
				
				if(indexNew !== current){
					
					// Récupération des items précédent et suivant
					var indexPrevious = current;				
					var items = o.target.find('.main_content .item');
					
					// Arrêt de toutes les animations
					$this.maincarousel('stopAll');
									
					if(indexNew == undefined){
						current++;
						if(current >= items.length){
							current = 0;
						}				
						var indexNext = current;					
					} else {
						var indexNext = indexNew;					
					}
					
					// Réactualisation des items de navigation
					var nav = o.target.find('.main_navigation');
					var navItems = nav.find(o.navigationTag);
					
					// Initialisation de l'élément de navigation actif
					navItems.removeClass('active');
					navItems.eq(indexNext).addClass('active');
					
					// Réinitialisation des options
					$this.maincarousel('setOptions', { indexPrevious : indexPrevious, indexNext : indexNext , indexCurrent : indexNext, play : true });
	
					// Réactualisation des boutons de lecture
					var buttonToggle = o.target.find('.button_toggle');
					buttonToggle.removeClass('stateStop').addClass('statePlay');

					// Application de l'effet avec la tempo
					items.eq(indexNext).maincarousel('transision').delay($this.maincarousel('tempDelay')).queue(function(){
						$(this).maincarousel('nextItem');
					});
					
				}
				
			});
			
		},
		stopAll : function(){
			
			return this.each(function(){
				
				// Initialisation de this
				var $this = $(this);
				var o = $this.maincarousel('getOptions');
				var items = o.target.find('.main_content .item');

				// Arrêt de toutes les animations
				items.stop(true, true);
				items.clearQueue();
				
				// Réinitialisation des options
				$this.maincarousel('setOptions', { play : false });
				
			});
			
		},
		transision : function(){
			
			return this.each(function(){
				
				// Initialisation de this
				var $this = $(this);
				var o = $this.maincarousel('getOptions');
				var items = o.target.find('.main_content .item');
				
				var val = $(o.transitionMode).val();
				if(val != undefined){
					mode = val;
				} else {
					mode = o.transitionMode;
				}

				if(mode == 'show'){
					
					items.eq(o.indexNext).css('z-index', '2');
					items.eq(o.indexPrevious).css('z-index', '1');

					$this.e(o.transitionEffect, o.durationEffect, function(){
						$this.siblings().hide();
					});
					
				} else if(mode == 'hide'){
					
					items.eq(o.indexNext).show().css('z-index', '1');
					
					items.eq(o.indexPrevious).css('z-index', '2').e(o.transitionEffect, o.durationEffect, function(){
						$this.siblings().hide();
					});
					
				}
				
			});
			
		},
		buttonToggle : function(){
			
			return this.each(function(){
				
				// Initialisation de this
				var $this = $(this);
				var o = $this.maincarousel('getOptions');
				
				if(o.play){
					$this.maincarousel('stopAll');						
					$this.removeClass('statePlay').addClass('stateStop');
				} else {
					$this.maincarousel('nextItem');												
					$this.removeClass('stateStop').addClass('statePlay');
				}

			});
			
		},
		getOptions : function(){
			
			// Si l'élément en cours à déjà la classe "maincarousel_dataoptions"...
			if(this.data('options')){
				// Retour du data
				return this.data('options');
			} else {
				// Recherche du target et retour du data
				return this.parents('.maincarousel_dataoptions:first').data('options');
			}
			
		},
		setOptions : function(options){
			
			// Si l'élément en cours à déjà la classe "maincarousel_dataoptions"...
			if(this.data('options')){
				// Retour de l'objet en cours
				var domElem = this;
			} else {
				// Recherche et retour du target
				var domElem = this.parents('.maincarousel_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.maincarousel = 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.maincarousel');
		}		
	};
	
})(jQuery);
