(function($){

	$.fn.itiLanceurFadein = function(options)
	{
		var settings = jQuery.extend(
		{
			debug: false,
			conteneur_images:'div#images',
			identifieur_images:'div.image',
			conteneur_puces:'div#puces',
			identifieur_puces:'a',
			classe_puce_selectionnee:'selected',
			identifieur:'rel',
			survol_puce:false,
			click_puce:true,
			fadeTime:1000,
			frequence:5000,
			fadePuce:500
			
		}, options );
		
		var current_pos = 0 ;
		var animation = this ;
		var groupe_puces = animation.find(settings.conteneur_puces) ;
		var puces = groupe_puces.find(settings.identifieur_puces) ;
		var groupe_images = animation.find(settings.conteneur_images) ;
		var images = groupe_images.find(settings.identifieur_images) ;
		var current_id = getFirstIdentifieur() ;
		var id_animation = Math.floor(Math.random()*101) ;
		
		if ( settings.debug ) animation.append('<div id="debug"></div>') ;
	
		if ( settings.survol_puces )
		{
			puces.hover(function(){
				start($(this).attr(settings.identifieur),settings.fadePuce) ;
			}) ;
		}
		
		if ( settings.click_puce )
		{
			puces.click(function(){
				start($(this).attr(settings.identifieur),settings.fadePuce) ;
				return false ;
			}) ;
		}
		
		start(current_id,0) ;
		
		function start(id_start,time)
		{
			if ( id_start != null ) switcher(id_start,true,time) ;
			animation.stopTime(id_animation) ;
			animation.everyTime(settings.frequence,id_animation,function() {
				switcher(getNext()) ;
			}) ;
		}
		
		function getNext()
		{
			next = getImageByIdentifieur(current_id).next(settings.identifieur_images) ;
			debug('getNext() : current_id='+current_id) ;
			if ( next.length == 1 ) return next.attr(settings.identifieur) ;
			else return getFirstIdentifieur() ;
		}
		
		function switcher(vers,direct,time)
		{
			if ( direct == null ) direct = false ;
			if ( time == null ) time = settings.fadeTime ;
			
			debug('switcher(vers='+vers+', current='+current_id+', direct='+direct+', time='+time+')') ;
			puces.removeClass(settings.classe_puce_selectionnee) ;
			debug(getPuceByIdentifieur(vers).attr('rel')) ;
			getPuceByIdentifieur(vers).addClass(settings.classe_puce_selectionnee) ;
			
			var image_courante = getImageByIdentifieur(current_id) ;
			var image_cible = getImageByIdentifieur(vers) ;
			
			if ( direct )
			{
				if ( current_id != vers )
				{
					images.stop() ;
					images.css('z-index',1) ;
					images.fadeTo(0,100) ;
					image_courante.css('z-index',3) ;
					image_cible.css('z-index',2) ;
					image_courante.fadeTo(0,100) ;
					image_courante.fadeTo(time,0,function(){image_cible.css('z-index',4);}) ;
					current_id = vers ;
				}
				else
				{
					images.css('z-index',1) ;
					images.fadeTo(0,100) ;
					image_courante.css('z-index',3) ;
					image_courante.fadeTo(0,100) ;
				}
			}
			else
			{
				images.css('z-index',1) ;
				images.fadeTo(0,100) ;
				
				image_courante.css('z-index',3) ;
				image_cible.css('z-index',2) ;
				image_courante.fadeTo(time,0,function(){image_cible.css('z-index',4);}) ;
				current_id = getNext() ;
			}
		}
		
		function getImageByIdentifieur(rel)
		{
			return groupe_images.find(settings.identifieur_images+'['+settings.identifieur+'='+rel+']') ;
		}
		
		function getPuceByIdentifieur(rel)
		{
			return groupe_puces.find(settings.identifieur_puces+'['+settings.identifieur+'='+rel+']') ;
		}
		
		function getFirstIdentifieur()
		{
			return groupe_images.find(settings.identifieur_images+':first').attr(settings.identifieur) ;
		}
		
		function debug(msg)
		{
			if ( settings.debug )
			$('#debug').prepend(msg+"\n") ;
		}
		
	};

})(jQuery);
