/**
 *  
 *  jquery.simplefade.2.1.js
 *  
 *  date : 29/01/2009
 *  auteur : Laurent Bettin  
 *  
 */ 
 /**********************************************************************************

Conventions pour certains paramètres types

jqTab		: un tableau d'éléments jQuery
jqObj		: un objet d'éléments jQuery
jqEl		: un élément jQuery unique
i			: itérateur ou nombre
context 	: contexte d'exécution des sélécteurs jQuery
defaults	: les options par defaut du plugin

**********************************************************************************/
(function($){
     $.Fade = function(context, pluginOptions){
    	
		/*PRIVATES PARAM*/
        var defaults = {
                        delay : 3000, //durée de la transition
                        timeout : 1500, //temps d'attente entre 2 transitions
                        startCallback : null, //callback au début d'une transition
                        endCallback: null //callback à la fin d'une transition
                    };
    	
		var base = this;

		var context = $(context);
        var jqObj	= context.children();

		/*PUBLICS PARAM*/
		base.opts 		= $.extend({}, defaults, pluginOptions);
		base.current 	= $(jqObj[0]); /*element affiché mis à jour une fois la transition entre 2 images terminées*/
		base.t			= 1;
		
		
		/*PRIVATES METHODS*/
		function init () {
			base.current.show();
			fadeEl();			
		};

        function fadeEl() {
								
			//Fonction de callback au départ de la transition
			if( $.isFunction( base.opts.startCallback ) ) { 
				base.opts.startCallback( base.current );
			}
			
			if ( base.t ) {
				base.t = setTimeout ( function () {
			
					var nextEl 		= base.current.next();
					var nextToFade 	= nextEl.length ? nextEl : $(jqObj[0]) ;

					base.current.fadeOut ( base.opts.delay );
		
					nextToFade.fadeIn ( base.opts.delay, function () {
						/*MAJ de l'élément en cours d'affichage*/
						base.current = $(this);
						/*Callback de fin*/
						if( $.isFunction(base.opts.endCallback) ) { 
							base.opts.endCallback( base.current );
						}
						fadeEl()
					});
		
				}, base.opts.timeout );
			};
			
		};
        
		/*PUBLICS METHODS*/
		base.stopFade = function () {
			base.t = 0;
		}
		
		base.restartFade = function () {
			base.t = 1;
			fadeEl();
		}
		
		init();

    };
		
	 $.fn.fade = function(pluginOptions){
        return this.each(function(){
			if ($(this).data('fadePluginDatas')) {
				return;
			}			
            $(this).data('fadePluginDatas', new $.Fade(this, pluginOptions) );
        });
    };
	
})(jQuery)
