/*
 * icecarousel 2010-07-13
 * Guillaume Decroix, Stephane Iatonni, Nicolas Girod, Léo LETARO
 *****************************************************************
 * v1.1.3 [LL] 2010-07-13
 * - Correction de bug de calcul (taille du li deplace a la fin du ul lors de l'avancement)
 * - Possibilite de definir une vitesse constante
 * - Possibilite de choisir entre animation lineaire ou courbe de Bezier
 * Testee avec jQuery 1.4.2
 * Note: Dans une version ulterieure, changer le nom de l'option 'speed', car
 *		il s'agit d'un temps de deroulement et non d'une vitesse (notions inverses).
 *		Pas fait ici pour cause de compatibilite ascendante.
 *
 * v1.1.2 [SI, NG] 2009-05-28
 * - Ajout de callbacks sur avant/après slide		[callback_before_slide, callback_after_slide : fonction]
 * - Ajout de la pause au survol					[pause_on_hover : selecteur css]
 * - Ajout des fonctions pause/start
 *
 * v1.1.1
 * - La taille des li est désormais calculée sur le contenu du li
 *   et non sur la taille de l'image
 *
 * v1.0.1
 *
 *****************************************************************
 * Requiert jquery 1.4.2 (non testé sur les versions inférieures)
 *
 * L'exemple ci dessous... :
			$(window).load (function ()
			{
				$('.overflow_diaporama').icecarousel (
					{
						btnNext: '.btn_avance',
						btnPrev: '.btn_retour',
						speed: 500,
						constant_speed: true,
						easing: 'linear',
						rotate: true,
						rotate_speed: 2000
					}
				);
			});
 *
 * ...S'applique sur une structure interne HTML semblable a :
 *
	<div class="overflow_diaporama"> <!-- Dimensions fixes, overflow hidden -->
		<ul> <!-- Dimensions automatiques -->
			<li> <!-- Doit etre en float left - Dimensions automatiques -->
				<img /> <!-- La largeur peut etre variable -->
			</li>
			<li> <!-- Doit etre en float left - Dimensions automatiques -->
				<img /> <!-- La largeur peut etre variable -->
			</li>
		</ul>
	</div>
 *
 * le $(window).load sert a s'assurer que les images sont completement chargees avant de lancer le diaporama
 */
(function($)
{
	$.fn.icecarousel = function(o)
	{
		/**
		 * OPTIONS DU CAROUSEL + VALEURS PAR DEFAUT
		 */
		o = $.extend (
			{
				btnPrev: null, // Selecteur du bouton precedent
				btnNext: null, // Selecteur du bouton suivant
				speed: 200, // Temps (ms) ou indice de temps de deroulement d'un element
				constant_speed: false, // false: % deroules par seconde constants, true: px deroules par seconde constants
				easing: 'swing', // Animation Bezier ('swing') ou lineaire ('linear')
				rotate: false, // Deroulement automatique
				rotate_speed: 1000, // Temps (ms) entre chaque deroulement
				pause_on_hover: false, // Selecteur d'element qui arretera l'animation au survol
				callback_after_slide: false, // Fonction appelee apres chaque deroulement
				callback_before_slide: false, // Fonction appelee avant chaque deroulement
				auto: null,
				total_size: 0,
				temp_size: null,
				block_slide: false,
				_this: null
			},
			o || {}
		);

		o._this=$(this);

		$(o._this).find('li').each (function()
		{
			o.temp_size=$(this).outerWidth();
			o.total_size+=o.temp_size;
			$(this).css('width',o.temp_size);
		});
		$(o._this).children('ul').css('width',o.total_size);

		if (o.btnNext)
		{
			$(o.btnNext).click (function (event)
			{
				event.preventDefault();
				slide("avance");
			});
		}

		if (o.btnPrev)
		{
			$(o.btnPrev).click (function(event)
			{
				event.preventDefault();
				slide("recule");
			});
		}

		if (o.pause_on_hover)
		{
			$(o.pause_on_hover).mouseenter (function(event)
			{
				o.rotate = false;
			});
			$(o.pause_on_hover).mouseleave(function(event)
			{
				o.rotate = true;
			});
		}

		if (o.rotate==true && o.block_slide==false)
		{
			setInterval (function()
				{
					if (o.rotate)
					{
						slide("avance");
					}
				},
				o.rotate_speed
			);
		}

		function do_callback(event)
		{
			switch(event)
			{
				case 'after_slide':
					if (o.callback_after_slide != false && typeof(o.callback_after_slide) == 'function')
					{
						o.callback_after_slide();
					}
					break;
				case 'before_slide':
					if (o.callback_before_slide != false && typeof(o.callback_before_slide) == 'function')
					{
						o.callback_before_slide();
					}
					break;
			}
		}

		function pause()
		{
			o.rotate = false;
		}

		function start()
		{
			o.rotate = true;
		}

		function slide (_direction)
		{
			var effectiveSpeed;
			if (_direction=="avance")
			{
				if (o.block_slide==false)
				{
					o.block_slide=true;
					do_callback('before_slide');
					o.temp_size=$(o._this).find('li:nth-child(1)').outerWidth()*-1;

					// Calcul de la vitesse effective
					if (o.constant_speed)
					{
						effectiveSpeed = o.speed*(-o.temp_size)/50;
					}
					else
					{
						effectiveSpeed = o.speed;
					}

					$(o._this).children('ul').animate (
						{
							marginLeft : o.temp_size
						},
						effectiveSpeed,
						//o.speed,
						o.easing,
						function()
						{
							$(o._this).children('ul').append($(o._this).find('li:nth-child(1)'));
							$(o._this).children('ul').css('margin-left',0);

							// 2010-07-13 [v1.1.3] LL: Suppression de cette ligne qui cause des bugs
							//$(o._this).find('li:last-child').css('width',$(o._this).find('li').outerWidth());

							o.block_slide=false;
							do_callback('after_slide');
						}
					);
				}
			}
			else
			{
				if (o.block_slide==false)
				{
					o.block_slide=true;
					do_callback('before_slide');

					// 2010-07-13 [v1.1.3] LL: Correction d'un bug de calcul
					o.temp_size=$(o._this).find('li:last-child').outerWidth();

					// Calcul de la vitesse effective
					if (o.constant_speed)
					{
						effectiveSpeed = o.speed*(o.temp_size)/50;
					}
					else
					{
						effectiveSpeed = o.speed;
					}

					$(o._this).children('ul').css('margin-left',-o.temp_size);
					$(o._this).children('ul').prepend($(o._this).find('li:last-child'));
					$(o._this).children('ul').animate (
						{
							marginLeft: 0
						},
						effectiveSpeed,
						o.easing,
						function ()
						{
							o.block_slide=false;
							do_callback('after_slide');
						}
					);
				}
			}
		}
	};
})(jQuery);

