/*
	
	slideZoom
	Realisation Pierre Granger pour iti-conseil
	pierre.granger at hotmail.fr
	www.iti-conseil.com
	Derniere MAJ : 23/03/2011
	
*/ 
(function(jQuery){

	jQuery.fn.itiSlideZoom = function(options)
	{
		var settings = jQuery.extend(
		{
			debug : false,
			nb_affiches : 5,
			id_conteneur : 'ul',
			id_contenus : 'li',
			zoom : 1.4,
			top_zoome : 0,
			top_minis : 20,
			start : 1,
			vitesse : 500,
			auto_defile:true,
			vitesse_defile:4000,
			clique_tourne : false
			
		}, options );
		
		var dbg ;
		if ( settings.debug )
		{
			if ( jQuery('#debug').length == 0 )
			{
				dbg = jQuery('<div id="debug" style="position:fixed ; bottom:0 ; right:0 ; text-align:right ;background:#FFF ; color:#000 ; opacity:0.8 ; white-space:pre ; font-size:9px ;"></div>') ;
				jQuery('body').append(dbg) ;
			}	
		}
		
		var largeur_conteneur = jQuery(this).innerWidth() ;
		var conteneur = jQuery(this).find(settings.id_conteneur) ;
		var contenus = conteneur.find(settings.id_contenus) ;
		var first = conteneur.find(settings.id_contenus+':first') ;
		var nb_elems = contenus.length ;
		var largeur_mini = Math.round(first.width()) ;
		var largeur_zoome = Math.round(largeur_mini*settings.zoom) ;
		var num_zoome = Math.round((settings.nb_affiches+1)/2) ;
		var ecart = largeur_conteneur / settings.nb_affiches ;
		var positions = getPositions() ;
		var tous = new Array() ;
		var positionsRel = new Array() ;
		var courante = settings.start ;
		var affiches ;
		var moving = false ;
		
		debug('largeur_mini='+largeur_mini) ;
		debug('largeur_zoome='+largeur_zoome) ;
		debug('num_zoome='+num_zoome) ;
		debug('ecart='+ecart) ;
		
		contenus.hide() ;
		var i = 0 ;
		contenus.each(function(){
			jQuery(this).attr('rel',i) ;
			
			tous[i] = jQuery(this) ;
			if ( settings.debug ) jQuery(this).append(i) ;
			i++ ;
		}) ;
		
		contenus.find('a').click(function(){
			/*
			clique(jQuery(this).parent().attr('rel')) ;
			return false ;
			*/
		}) ;
		
		setPositions() ;
		
		if ( settings.auto_defile ) defile() ;
		
		function defile()
		{
			stopDefile() ;
			if ( settings.auto_defile )
			{
				jQuery(this).everyTime(settings.vitesse_defile,'slideZoom',function() {
					debug('time to move') ;
					move(next()) ;
				}) ;
			}
		}
		
		function stopDefile()
		{
			jQuery(this).stopTime('slideZoom') ;
		}
		
		function next()
		{
			if ( tous[courante+1] == undefined ) return 0 ;
			else return courante+1 ;
		}
		
		function getPositions()
		{
			debug('getPositions()') ;
			var arr = new Array() ;
			var nb_espacements = settings.nb_affiches - 1 ;
			debug('w_espacement = '+largeur_conteneur+' - '+largeur_zoome+' - ( '+largeur_mini+' * ( '+settings.nb_affiches+' - 1 '+') ) ;') ;
			var w_espacement = Math.round ( ( largeur_conteneur - largeur_zoome - ( largeur_mini * ( settings.nb_affiches - 1 ) ) ) / nb_espacements ) ;
			debug('w_espacement='+w_espacement) ;
			
			arr[0] = - ( largeur_mini + w_espacement ) ;
			arr[1] = 0 ;
			for ( var i = 2 ; i <= settings.nb_affiches - 1 ; i++ )
			{
				if ( i == num_zoome + 1 )
					arr[i] = arr[i-1] + largeur_zoome + w_espacement ;
				else
					arr[i] = arr[i-1] + largeur_mini + w_espacement ;
			}
			arr[settings.nb_affiches] = largeur_conteneur - largeur_mini ;
			arr[settings.nb_affiches+1] = largeur_conteneur + w_espacement ;
			debug(arr) ;
			return arr ;
		}
		
		function getAffiches()
		{
			debug('getAffiches()') ;
			var arr = new Array(settings.nb_affiches+2) ;
			for ( var i = 0 ; i < settings.nb_affiches + 2 ; i++ )
			{
				var id = courante-num_zoome+i ;
				arr[i] = getElement(id) ;
			}
			return arr ;
		}
		
		function getElement(rel)
		{
			if ( rel >= 0 && rel <= tous.length - 1 )
			{
				debug('getElement('+rel+')') ;
			}
			else if ( rel < 0 )
			{
				debug('getElement('+rel+'=>'+(tous.length+rel)+')') ;
				rel = tous.length + rel ;
			}
			else if ( rel > tous.length - 1 )
			{
				debug('getElement('+rel+'=>'+(rel-tous.length)+')') ;
				rel = rel - tous.length ;
			}
			return tous[rel] ;
		}
		
		function setPositions()
		{
			debug('setPositions()') ;
			affiches = getAffiches() ;
			positionsRel = new Array() ;
			for ( var i = 0 ; i < affiches.length ; i++ )
			{
				var cur = affiches[i] ;
				cur.show() ;
				var larg = largeur_mini ;
				var tp = settings.top_minis ;
				
				debug('setPosition('+cur.attr('rel')+',left:'+cur.css('left')+'=>'+positions[i]+')') ;
				
				if ( i == num_zoome )
				{
					larg = largeur_zoome ;
					tp = settings.top_zoome ;
				}
				
				cur.css({
					'width':larg,
					'left':positions[i],
					'top':tp
				}) ;
				debug('setPosition('+cur.attr('rel')+' : left = '+positions[i]+')') ;
				
				positionsRel[cur.attr('rel')] = i ;
			}
		}
		
		function move(to,vitesse)
		{
			debug('#######################') ;
			debug('move('+to+','+vitesse+')') ;
			
			setPositions() ;
			
			var pos = 1 ;
			if ( positionsRel[to] < num_zoome ) pos = -1 ;
			var ecart_position = Math.abs( positionsRel[to] - positionsRel[courante] ) ;
			debug('ecart_position = '+ecart_position) ;
			var dernier = false ;
			affiches = getAffiches() ;
			moving = true ;
			
			if ( vitesse == null ) vitesse = settings.vitesse / ecart_position ;
			
			var nouvelle_courante = courante + pos ;
			if ( nouvelle_courante < 0 ) nouvelle_courante = nb_elems - 1 ;
			else if ( nouvelle_courante > nb_elems - 1 ) nouvelle_courante = 0 ;
			
			for ( var i = 0 ; i < affiches.length ; i++ )
			{
				var cur = affiches[i] ;
				var w = largeur_mini ;
				var top = settings.top_minis ;
				if ( i == num_zoome + pos ) { w = largeur_zoome ; top = settings.top_zoome ; }
				var ipt = parseInt(i-pos) ;
				var pt = null ;
				
				if ( i == ( positions.length - 1 ) ) dernier = true ;
				
				pt = positions[ipt] ;
				if ( pt == undefined )
				{
					if ( pos < 0 )
					{
						debug('pt undefined pour '+i+' : pt = positions[positions.length-1] = '+positions[positions.length-1]) ;
						pt = positions[positions.length-1] ;
					}
					else
					{
						debug('pt undefined pour '+i+' : pt = positions[0] = '+positions[0]) ;
						pt = positions[0] ;
					}
				}
				
				debug('affiches['+i+'/'+cur.attr('rel')+'].animate(left:'+cur.css('left')+'=>'+pt+',width:'+w+');') ;
				
				cur.find('span').remove() ;
				if ( settings.debug ) cur.prepend('<span>'+cur.css('left')+" ->"+pt+"<br /></span>") ;
				
				debug(cur.attr('rel')+' -> '+cur.left) ;
				cur.stop().animate(
					{
						'left':pt,
						'top':top,
						'width':w+'px'
					},
					vitesse,
					'linear',
					function(){
						debug(jQuery(this).attr('rel')+' -> '+jQuery(this).css('left')) ;
						if ( dernier )
						{
							courante = nouvelle_courante ;
							dernier = false ;
							moving = false ;
							if ( ecart_position > 1 ) move(to,vitesse) ;
						}
						setPositions() ;
					}
				) ;
			}
		}
		
		function clique(rel)
		{
			if ( moving ) return ;
			if ( rel == courante || ! settings.clique_tourne )
			{
				stopDefile() ;
				var li = tous[rel] ;
				debug(li) ;
				debug(li.length) ;
				var lien = li.find('a').attr('href') ;
				window.location = lien ;
			}
			else
			{
				move(rel) ;
				if ( settings.auto_defile ) defile() ;
			}
		}
		
		function debug(msg)
		{
			if ( settings.debug )
			dbg.append(msg+"\n") ;
		}
	};

})(jQuery);
