/**
 * Generation d'un slider à partir d'une liste,
 * les boutons suivant et précédents possèdent classes .prev et .next et peuvent donc être édités.
 * 
 * @version 0.2 - 12/05/09
 * @author Sidney Bourgallé
 * @depends jquery-1.3.2.min.js
 * 
 * Paramètres
 *  int width : Largeur du slider en px
 *  int height : Hauteur du slider en px
 * 
 * Optionnels
 *  int speed : Vitesse de défilement en ms
 *  String siderClass : Classe du slider
 *  Boolean auto : Active le défilement automatique
 *  int autoSleep : Intervale de temps en ms entre deux défilement automatique
 * 
 * Exemple
 *  <script>
 *   $(document).ready(function()
 *   {
 *    $("ul").slider(
 *    {
 *     width: 400,
 *     height: 200
 *    });
 *   });
 *  </script type="text/javascript">
 *  <ul>
 *	 <li><img src="img1.jpg" alt="img1"/></li>
 *	 <li><img src="img2.jpg" alt="img2"/></li>
 *	 <li><img src="img3.jpg" alt="img3"/></li>
 *	 <li><img src="img4.jpg" alt="img4"/></li>
 *  </ul>
 * 
 * Changelog
 *  0.2 - 19/05/09 : Gestion du défilement automatique
 *  0.1 - 12/05/09 : Gestion du défilement
 */
jQuery.fn.slider = function(options)
{
	// Variables par défaut
	var settings = {
		width: false, // px
		height: false, // px
		
		speed: 1000, // ms
		autoSleep: 5000, // ms
		
		siderClass: "",
		
		auto: false
    };
	
    if(options)
    	jQuery.extend(settings, options);
	
    // Slider généré
    var liste;
	
	/**
	 * Initialise
	 * @param HtmlObject objet : Liste a transformer
	 * @return HtmlObject : Nouvelle liste
	 */
	function slider(objet)
	{
		// MaxHeight et TotalWidth
		var maxHeight = settings.height != false?settings.height:0;
		var totalWidth = 0;
		
		$(objet).children("li").each(function()
		{
			totalWidth += $(this).outerWidth(true);
			
			if(settings.height == false && $(this).outerHeight(true) > maxHeight)
				maxHeight = $(this).outerHeight(true);
		});
		
		// Preload
		$(objet).html($(objet).html()+$(objet).html()+$(objet).html());
		
		// Css
		$(objet).css(
		{
			listStyleType: "none"
		});
		
		$(objet).children("li").css(
		{
			float: "left",
			height: maxHeight
		});
		
		$(objet).width(totalWidth * 3);
		
		// Generation du containeur
		$(objet).before('<div '+(settings.siderClass != ""?'class="'+settings.siderClass+'"':'""')+'><div class="prev" style="float: left"></div><div class="next" style="float: right"></div><div></div></div>');
		
		var all =  $(objet).prev();
		var main = $(objet).prev().children("div:eq(2)");
		
		// Prev et next
		var prev = $(objet).prev().children("div:eq(0)");
		var next = $(objet).prev().children("div:eq(1)");
		
		// Css containeur (moins: prev + next)
		$(main).css(
		{
			width: settings.width - $(prev).outerWidth(true) - $(next).outerWidth(true) - (false /*@cc_on || @_jscript_version < 5.7 @*/?6:0),
			height: maxHeight,
			overflow: "hidden"
		});
		
		// Width containeur + prev + next
		$(objet).prev().css(
		{
			width: settings.width
		});
		
		// Remplissage
		liste = $(objet).clone().appendTo(main);
		
		// Gestion d'une erreur de chargement
		if($(main).width() > $(liste).width())
		{
			$(objet).prev().remove();
			$(objet).slider(settings);
			return 0;
		}
		
		// Indique si une annimation est en cours
	    liste.isplaying = false;
	    liste.play = true;
	    
	    // On supprime l'ancien
		$(objet).remove();
		
		// On avance un peu
		$(liste).css(
		{
			"marginLeft": - totalWidth / 2
		});
		
		// Lecture automatique
		if(settings.auto)
		{
			// Quand on survole le slider on stop l'autoPlay
			$(all).hover(function()
			{
				liste.play = false;
			},function()
			{
				liste.play = true;
			});
			
			// AutoPlay
			autoPlay();
			//setTimeout("sliderAutoPlay("+sliderArrayAutoPlay.push(liste)+","+1+","+settings.speed+","+settings.autoSleep+")", settings.autoSleep);
		}
		// Actions
		$(next).click(function() // Next
		{
			animate(1);
		});
		$(prev).click(function() // Prev
		{
			animate(-1);
		});
		return $(main).children("ul");
	}
	
	/**
	 * Réalise un slide
	 * @param int distance : Sens de l'annimation
	 * @return void
	 */
	function animate(distance)
	{
		if(liste.isplaying)
			return 0;
		
		// Infinie
		if(distance > 0)
		{
			distance = $(liste).children("li:last").outerWidth(true);
			$(liste).css(
			{
				"marginLeft": parseInt($(liste).css("marginLeft")) - $(liste).children("li:eq("+($(liste).children("li").length - 1)+")").outerWidth(true)
			});
			
			$(liste).children("li:eq("+($(liste).children("li").length - 1)+")").clone().prependTo(liste);
			$(liste).children("li:eq("+($(liste).children("li").length - 1)+")").remove();

		}
		else
		{
			distance = - $(liste).children("li:first").outerWidth(true); // Distance pacourue
			$(liste).css(
			{
				"marginLeft": parseInt($(liste).css("marginLeft")) + $(liste).children("li:eq(0)").outerWidth(true)
			});
			
			$(liste).children("li:eq(0)").clone().appendTo(liste);
			$(liste).children("li:eq(0)").remove();
		}
		
		// Début de l'annimation
		liste.isplaying = true;
		$(liste).stop().animate(
		{
			marginLeft: parseInt($(liste).css("marginLeft")) + distance
		}, settings.speed, function()
		{
			// Fin de l'annimation
			liste.isplaying = false;
		});
	}
	
	/**
	 * Gestion du défilement automatique
	 * @param int id : Identifiant du slider
	 * @return void
	 */
	function autoPlay()
	{
		if(liste.play)
			animate(1);
		
		setTimeout(function()
		{
			autoPlay();
		},settings.autoSleep);
	}
	
	return slider(this);
};
