/**
 *  
 *  jquery.simplegalery.2.1.js
 *  
 *  date : 12/12/2008
 *	modification : 02/02/09
 *		correction d'un bug quand il n'y avait pas de légende
 *		changement de la méthode de ciblage de l'image principal
 *		ajout des fonctions de callback
 *		ajout de l'option delay pour choisir la durée de la transition
 *		ajout de la copie de l'attribut alt de la vignette vers l'image principale
 *		correction d'un bug dans la gestion de l'evènement load
 *  auteur : Laurent Bettin    
 *  
 *	Paramètres :
 *	delay : (string, int) default('fast') 					: Durée de la transition (en ms si int, ["slow", "def", ou "fast"] si string)			
 *	thumbnails : (string) default('#thumbnails')   			: Identifiant du bloc qui contient les vignettes	
 *	legend : (string) default('') 							: Identifiant du bloc qui contient la légende (facultatif)
 *	(jquery) onClickEventCallback : (fn) default(null)		: Fonction de callback appelée sur le clic d'une vignette (toujours retournée)
 *
 *	(jquery) transitionStartCallback : (fn) default(null)	: Fonction de callback appelée au début d'une transition
 *															(retournée uniquement si une transition est lancée)
 *
 *	(jquery) transitionEndCallback : (fn) default(null)		: Fonction de callback appelée a la fin d'une transition
 *															(retournée uniquement si une transition est lancée)
 *
 * 	(jquery) returnFalseCallback : (fn) default(null)		: Fonction de callback appelée quand l'image cliquée est déjà affichée
 */
 
(function($){     
    $.fn.simpleGalery = function( params ) {
		
		var params = $.extend({
		
	  		delay : 'fast', 				
            thumbnails : '#thumbnails', 		
            legend : '',						
            onClickEventCallback : null,
            transitionStartCallback : null,
            transitionEndCallback : null,
            returnFalseCallback : null
                      
        },params);
		
		/**
		*
		*	context : $(this),
		*	thumbnails : $(params.thumbnails),
		*	altAttr : '', Attribut alt de la vignette
		*	clickThumb : '', Le lien cliqué sous forme d'objet jquery, passé en paramètre aux fonction de callback
		*	legend : '', Si spécifiée la légende est récupérée via l'attribut title du lien cliqué
		*	imgToShow : '' l'image à afficher
		*
		*/
		
		var privateParam = {
			
			context : $(this),
			thumbnails : $(params.thumbnails),
			altAttr : '',
			clickThumb : '',
			legend : '',
			imgToShow : ''
		
		}
		
        return this.each( function() {
        	$('img', privateParam.context).bind('load', loadEventCallback );
            defineClickEvent();
        });

        function defineClickEvent() {
			
            $('a', privateParam.thumbnails).click( function () {
				
				privateParam.clickThumb = $(this);
				privateParam.imgToShow 	= privateParam.clickThumb.attr('href');
				privateParam.altAttr 	= $('img', privateParam.clickThumb).attr('alt');
				privateParam.legend 	= params.legend ? privateParam.clickThumb.attr('title') : '';
				
				if( $.isFunction( params.onClickEventCallback ) ) { 
	        		params.onClickEventCallback( privateParam.clickThumb );
	        	}

				if ( $('img', privateParam.context).attr('src') == privateParam.imgToShow ) {
					if( $.isFunction( params.returnFalseCallback ) ) { 
        				params.returnFalseCallback( privateParam.clickThumb );
        			}
					return false;
				}
				
				startTransition();
            	
            	return false;
            	
            });
            
        };
        
        function startTransition() {
        
       		if( $.isFunction( params.transitionStartCallback ) ) { 
        		params.transitionStartCallback( privateParam.clickThumb );
        	}
			
			privateParam.context.children().fadeOut(params.delay, function() {
				if( params.legend ) {
					$(params.legend, privateParam.context).html( privateParam.legend );
				}
           		$('img', privateParam.context).attr('src', privateParam.imgToShow).attr('alt', privateParam.altAttr);
           	});
        
        }
        
        function loadEventCallback () {
			
            privateParam.context.children().fadeIn(params.delay, function () {
            	if( $.isFunction( params.transitionEndCallback ) ) { 
			       	params.transitionEndCallback( privateParam.clickThumb );
			    }
            });
        
        }

    }
})(jQuery)