/*
	
	iti Slider
	Réalisation Pierre Granger pour iti-conseil
	pierre.granger@hotmail.fr
	www.iti-conseil.com
	Dernière MAJ : 10/01/2011
	
*/
(function($){

	$.fn.itiSlider = function(options)
	{
		var settings = jQuery.extend(
		{
			debug: false,
			current:null,
			id_slider:'div#slider',
			id_precedent:'a#precedent',
			id_suivant:'a#suivant',
			id_conteneur:'ul',
			id_elements:'ul li',
			id_puces:'div#puces',
			id_puce:'a',
			effet:'easeOutCirc',
			temps:750,
			nb_affiches:1,
			cacher_boutons_inactifs:true,
			cacher_boutons:true,
			boucler:true,
			auto_defile:true,
			vitesse_defile:5000,
			pausebind:false,
			puces:true,
			play_pause:true,
			play_pause_id:'.play_pause'
		}, options );
		
		var slider = $(this).find(settings.id_slider) ;
		var precedent = $(this).find(settings.id_precedent) ;
		var suivant = $(this).find(settings.id_suivant) ;
		var conteneur = $(this).find(settings.id_conteneur) ;
		var elements = $(this).find(settings.id_elements) ;
		var nb_elements = elements.length ;
		var largeur = $(this).find(settings.id_elements+':first').outerWidth(true) ;
		var puces = $(this).find(settings.id_puces) ;
		var play_pause = $(this).find(settings.play_pause_id) ;
		var cache = new Object() ;
		var ml = 0 ;
		var num_courant = 1 ;
		if ( settings.current <= nb_elements && settings.current > 0 )
			num_courant = parseInt(settings.current) ;
		
		if ( settings.cacher_boutons ) {
			precedent.hide() ;
			suivant.hide() ;
		}
		
		var i = 1 ;
		elements.each(function(){
			$(this).attr('rel',i) ;
			if ( settings.puces )
			{
				puces.find(settings.id_puce).removeClass('selected') ;
				puces.find(settings.id_puce+'[rel='+num_courant+']').addClass('selected') ;
				var puce = $('<'+settings.id_puce+' rel="'+i+'"></'+settings.id_puce+'>') ;
				puce.click(function(){
					var rst = true ;
					if ( settings.play_pause && play_pause.hasClass('paused') ) rst = false ;
					go_to($(this).attr('rel'),rst) ;
					return false ;
				}) ;
				puce.html(i) ;
				puces.append(puce) ;
			}
			i++ ;
		}) ;
		
		elements.css({
			'position':'absolute',
			'top':0,
			'left':0
		}).hide() ;
		
		$(this).find(settings.id_elements+'[rel="'+num_courant+'"]').show() ;
		
		if ( settings.play_pause )
		{
			play_pause.removeClass('') ;
			play_pause.click(function(){
				if ( play_pause.hasClass('paused') )
				{
					play_pause.removeClass('paused') ;
					defiler() ;
					go_to(num_courant+1) ;
				}
				else
				{
					play_pause.addClass('paused') ;
					arret() ;
				}
				return false ;
			}) ;
		}
		else
			play_pause.click(function(){return false;}) ;
		
		defiler() ;
		binder() ;
		
		function go_to(num_to,restart)
		{
			var to = conteneur.find('[rel="'+num_to+'"]') ;
			if ( to.html() == '' && to.attr('rel') != null && ! num_to in cache )
			{
				$.get(
					to.attr('rel'),
					function(data,textStatus)
					{
						cache[num_to] = data ;
						go_to_animate(num_to,restart) ;
					}
				) ;
			}
			else
				go_to_animate(num_to,restart) ;
		}
		
		function go_to_animate(num_to,restart)
		{
			if ( restart != true ) restart = false ;
			num_from = parseInt(num_courant) ;
			
			if ( restart ) defiler() ;
			
			if ( num_from == num_to ) return false ;
			if ( num_from < num_to ) sens = 'droite' ;
			else sens = 'gauche' ;
			
			debug('go_to('+num_to+','+sens+') - from '+num_from) ;
			
			if ( settings.boucler )
			{
				if ( num_to > nb_elements ) num_to = 1 ;
				if ( num_to < 1 ) num_to = nb_elements ;
			}
			else
			{
				if ( num_to > nb_elements || num_to < 1 ) return ;
			}
			
			var from = conteneur.find('[rel="'+num_from+'"]') ;
			var to = conteneur.find('[rel="'+num_to+'"]') ;
			
			if ( settings.pausebind ) pause_bind() ;
			
			elements.hide() ;
			from.show() ;
			to.show() ;
			
			largeur = from.width() ;
			
			puces.find(settings.id_puce).removeClass('selected') ;
			puces.find(settings.id_puce+'[rel='+num_to+']').addClass('selected') ;
			
			if ( sens == 'droite' )
			{
				to.css({'left':largeur}).show() ;
				from.stop().animate(
					{'left':-(largeur)},
					settings.temps,settings.effet
				) ;
			}
			else
			{
				to.css({'left':-largeur}).show() ;
				from.stop().animate(
					{'left':(largeur)},
					settings.temps,settings.effet
				) ;
			}
			
			to.stop().animate(
				{'left':0},
				settings.temps,settings.effet,
				function(){
					if ( settings.pausebind ) binder() ;
					from.hide() ;
				}
			) ;
			
			debug('from '+num_from+' '+ to +'num_to') ;
			
			num_courant = parseInt(num_to) ;
		}
		
		function debug(msg)
		{
			if ( settings.debug )
			{
				if ( $('body').find('#debug').length == 0 ) $('body').append('<div id="debug"></div>') ;
				$('div#debug').append(msg+"\n") ;
			}
		}
		
		function defiler()
		{
			$(this).stopTime('animation') ;
			if ( settings.auto_defile )
			{
				$(this).everyTime(settings.vitesse_defile,'animation',function() {
					go_to(parseInt(num_courant)+1) ;
				}) ;
			}
		}
		
		function arret()
		{
			$(this).stopTime('animation') ;
		}
		
		function binder()
		{
			precedent.click(function(){
				go_to(parseInt(num_courant)-1,true) ;
				return false ;
			}) ;
			suivant.click(function(){
				go_to(parseInt(num_courant)+1,true) ;
				return false ;
			}) ;
		}
		
		function pause_bind()
		{
			suivant.unbind('click') ;
			precedent.unbind('click') ;
		}
		
	};

})(jQuery);
