(function(jQuery){

	jQuery.fn.itiLanceurFadein = function(options)
	{
		var settings = jQuery.extend(
		{
			debug: false,
			conteneur_images:'div#images',
			identifieur_images:'a',
			conteneur_puces:'div#puces',
			identifieur_puces:'a',
			classe_puce_selectionnee:'selected',
			identifieur:'id',
			prefixe_identifieur_image:'image_',
			prefixe_identifieur_puce:'puce_',
			survol_puce:false,
			click_puce:true,
			slide_auto:true,
			fadeTime:1000,
			frequence:5000,
			fadePuce:500,
			showPuces:true
		}, options );
		
		if ( settings.debug ) jQuery('body').append('<div id="debug" style="position:fixed ;top:0 ;right:0 ;z-index:9999999;white-space:pre;"></div>') ;
		
		var animation = this ;
		var groupe_images = animation.find(settings.conteneur_images) ;
		if ( groupe_images.length == 0 )
		{
			var temp = explodeIdentifieur(settings.conteneur_images) ;
			var app = '<'+temp[0]+' '+temp[1]+'="'+temp[2]+'"></'+temp[0]+'>' ;
			animation.wrapInner(app) ;
			groupe_images = animation.find(settings.conteneur_images) ;
		}
		var images = groupe_images.find(settings.identifieur_images) ;
		
		debug('images.length = '+images.length) ;
		if ( images.length <= 1 )
		{
			debug('return;') ;
			return ;
		}
		
		var i = 1 ;
		images.each(function(){
			jQuery(this).attr(settings.identifieur,settings.prefixe_identifieur_image+i) ;
			i++ ;
		}) ;
		
		var currentNum = getFirstNum() ;
		var id_animation = Math.floor(Math.random()*101) ;
		
		if ( settings.showPuces )
		{
			var groupe_puces = animation.find(settings.conteneur_puces) ;
			if ( groupe_puces.length == 0 )
			{
				var temp = explodeIdentifieur(settings.conteneur_puces) ;
				var app = '<'+temp[0]+' '+temp[1]+'="'+temp[2]+'"></'+temp[0]+'>' ;
				animation.append(app) ;
				groupe_puces = animation.find(settings.conteneur_puces) ;
			}
			
			var i = 1 ;
			images.each(function(){
				var puce = jQuery('<'+settings.identifieur_puces+' '+settings.identifieur+'="'+settings.prefixe_identifieur_puce+i+'"></'+settings.identifieur_puces+'>') ;
				puce.html(i) ;
				groupe_puces.append(puce) ;
				i++ ;
			}) ;
			var puces = groupe_puces.find(settings.identifieur_puces) ;
		
			if ( settings.survol_puces )
			{
				puces.hover(function(){
					start(ereg_replace(settings.prefixe_identifieur_puce,'',jQuery(this).attr(settings.identifieur)),settings.fadePuce) ;
				}) ;
			}
			
			if ( settings.click_puce )
			{
				puces.click(function(){
					start(ereg_replace(settings.prefixe_identifieur_puce,'',jQuery(this).attr(settings.identifieur)),settings.fadePuce) ;
					return false ;
				}) ;
			}
		}
		
		start(currentNum,0) ;
		
		function explodeIdentifieur(identifieur)
		{
			var explode_class = identifieur.split('.') ;
			if ( explode_class.length > 1 ) return new Array(explode_class[0],'class',explode_class[1]) ;
			var explode_id = identifieur.split('#') ;
			if ( explode_id.length > 1 ) return new Array(explode_id[0],'id',explode_id[1]) ;
		}
		
		function start(id_start,time)
		{
			if ( id_start != null ) switcher(id_start,true,time) ;
			if ( settings.slide_auto )
			{
				animation.stopTime(id_animation) ;
				animation.everyTime(settings.frequence,id_animation,function() {
					switcher(getNextNum()) ;
				}) ;
			}
		}
		
		function getNextNum()
		{
			next = getImageByNum(currentNum).next(settings.identifieur_images) ;
			var ret = null ;
			debug(next.length) ;
			if ( next.length == 1 ) ret = next.attr(settings.identifieur) ;
			else ret = getFirstNum() ;
			ret = ereg_replace(settings.prefixe_identifieur_image,'',ret) ;
			debug('getNextNum(currentNum='+currentNum+') : '+ret) ;
			return ret ;
		}
		
		function switcher(vers,direct,time)
		{
			if ( direct == null ) direct = false ;
			if ( time == null ) time = settings.fadeTime ;
			
			debug('switcher(vers='+vers+', current='+currentNum+', direct='+direct+', time='+time+')') ;
			puces.removeClass(settings.classe_puce_selectionnee) ;
			getPuceByNum(vers).addClass(settings.classe_puce_selectionnee) ;
			
			var image_courante = getImageByNum(currentNum) ;
			var image_cible = getImageByNum(vers) ;
			
			images.stop().css('z-index',1).fadeTo(0,1).hide() ;
			image_courante.css('z-index',2).fadeTo(0,1).show() ;
			image_cible.css('z-index',3).fadeTo(0,0).show() ;
			
			image_courante.fadeTo(time,0) ;
			image_cible.fadeTo(time,1) ;
			
			currentNum = vers ;
		}
		
		function getImageByNum(num)
		{
			var ret = groupe_images.find(settings.identifieur_images+'['+settings.identifieur+'='+settings.prefixe_identifieur_image+num+']') ;
			debug('getImageByNum('+num+') : '+ret.attr(settings.identifieur)) ;
			return ret ;
		}
		
		function getPuceByNum(num)
		{
			var ret = groupe_puces.find(settings.identifieur_puces+'['+settings.identifieur+'='+settings.prefixe_identifieur_puce+num+']') ;
			debug('getPuceByNum('+num+') : '+ret.attr(settings.identifieur)) ;
			return ret ;
		}
		
		function getFirstNum()
		{
			debug('getFirstNum : ereg_replace('+settings.prefixe_identifieur_image+',\'\','+groupe_images.find(settings.identifieur_images+':first').attr(settings.identifieur)+')') ;
			var ret = ereg_replace(settings.prefixe_identifieur_image,'',groupe_images.find(settings.identifieur_images+':first').attr(settings.identifieur)) ;
			debug('getFirstIdentifieur() : '+ret) ;
			return ret ;
		}
		
		function debug(msg)
		{
			if ( settings.debug )
			jQuery('#debug').prepend(msg+"\n") ;
		}
		
		function ereg_replace(rg,ch,tx)
		{
		   var regEx = new RegExp(rg,"g")
		   return tx.replace(regEx,ch)
		}
		
	};

})(jQuery);
