$.fn.actuSlider = function(option) {
	// default configuration properties
	var defaults = {
		//Identifiant et Texte du bouton "précédent"
		prevId : 'prevBtn',
		prevText : 'Précédent',
		//Identifiant et Texte du bouton "suivant"
		nextId : 'nextBtn',
		nextText : 'Suivant',
		//Permet d'afficher ou non les contrôles pour l'utilisateur
		controlsShow : true,
		controlsBefore : '',
		controlsAfter : '',
		//Cache le bouton concerné quand on atteint une extrémité du slide.
		//Uniquement valable quan continuous est a "false".
		controlsFade : true,
		//Affiche des liens vers le premier ou le dernier élément du slide.
		firstId : 'firstBtn',
		firstText : 'Début',
		firstShow : false,
		lastId : 'lastBtn',
		lastText : 'Fin',
		lastShow : false,
		//Réglage de l'affichage (Horizontal ou Vertical)
		vertical : false,
		speed : 2000,
		auto : true,
		pause : 2000,
		continuous : true,
		numeric : true,
		numericId : 'control'
	};
	var options = $.extend(defaults, option);
	
	this.each(function() {
		var obj = $(this);
		var s = $("li", obj).length;
		var w = $("li", obj).width();
		var h = $("li", obj).height();
		var clickable = true;
		obj.width(w);
		obj.height(h);
		obj.css("overflow", "hidden");
		var ts = s - 1;
		var t = 0;
		$("ul", obj).css('width', s * w);
		$(".top-actu", obj).hide();

		if (options.continuous) {
			$("ul", obj).prepend($("ul li:last-child", obj).clone().css("margin-left", "-" + w + "px"));
			$("ul", obj).append($("ul li:nth-child(2)", obj).clone());
			$("ul", obj).css('width', (s + 1) * w);
			$("ul li:eq(1) div", obj).show();
		};

		if (!options.vertical)
			$("li", obj).css('float', 'left');

		if (options.controlsShow) {
			var html = options.controlsBefore;
			html += '<a id="' + options.prevId + '" href=\"javascript:void(0);\"><span>' + options.prevText + '</span></a>';
			html += '<a id="' + options.nextId + '" href=\"javascript:void(0);\"><span>' + options.nextText + '</span></a>';
			if (options.numeric) {
				html += '<ol id="' + options.numericId + '"></ol>';
			} else {
				if (options.firstShow)
					html += '<a id="' + options.firstId + '" href=\"javascript:void(0);\">' + options.firstText + '</a>';
				if (options.lastShow)
					html += '<a id="' + options.lastId + '" href=\"javascript:void(0);\">' + options.lastText + '</a>';
			};
			html += options.controlsAfter;
			$(obj).append(html);
			if (options.numeric) {
				for ( var i = 0; i < s; i++) {
					$(document.createElement("li")).attr('id', options.numericId + (i + 1)).html(
						'<a rel=' + i + ' href=\"javascript:void(0);\">' + (i + 1) + '</a>').appendTo(
						$("#" + options.numericId)).click(
						function() {
							animate($("a", $(this)).attr('rel'), true);
						});
				};
			} else {
				$("#" + options.firstId).click(function() {
					animate("first", true);
				});
				$("#" + options.lastId).click(function() {
					animate("last", true);
				});
			};
			$("#" + options.nextId).click(function() {
				animate("next", true);
			});
			$("#" + options.prevId).click(function() {
				animate("prev", true);
			});
		};

		function setCurrent(i) {
			i = parseInt(i) + 1;
			$("li", "#" + options.numericId).removeClass("current");
			$("li#" + options.numericId + i).addClass("current");
			$("ul li:eq(" + (i) + ") div", obj).fadeIn("slow");
		};

		function adjust() {
			if (t > ts)
				t = 0;
			if (t < 0)
				t = ts;
			if (!options.vertical) {
				$("ul", obj).css("margin-left", (t * w * -1));
			} else {
				$("ul", obj).css("margin-left", (t * h * -1));
			}
			clickable = true;
			if (options.numeric)
				setCurrent(t);
		};

		function animate(dir, clicked) {
			if (clickable) {
				clickable = false;
				var ot = t;
				switch (dir) {
					case "next":
						t = (ot >= ts) ? (options.continuous ? t + 1 : ts) : t + 1;
						break;
					case "prev":
						t = (t <= 0) ? (options.continuous ? t - 1 : 0) : t - 1;
						break;
					case "first":
						t = 0;
						break;
					case "last":
						t = ts;
						break;
					default:
						t = dir;
						break;
				};
				$(".top-actu", obj).fadeOut("fast");
				var diff = Math.abs(ot - t);
				var speed = diff * options.speed;
				if (!options.vertical) {
					p = (t * w * -1);
					$("ul", obj).animate( {
						marginLeft : p
					}, {
						queue : false,
						duration : speed,
						complete : adjust
					});
				} else {
					p = (t * h * -1);
					$("ul", obj).animate( {
						marginTop : p
					}, {
						queue : false,
						duration : speed,
						complete : adjust
					});
				};

				if (!options.continuous && options.controlsFade) {
					if (t == ts) {
						$("#" + options.nextId).hide();
						$("#" + options.lastId).hide();
					} else {
						$("#" + options.nextId).show();
						$("#" + options.lastId).show();
					};
					if (t == 0) {
						$("#" + options.prevId).hide();
						$("#" + options.firstId).hide();
					} else {
						$("#" + options.prevId).show();
						$("#" + options.firstId).show();
					};
				};

				if (clicked)
					clearTimeout(timeout);
				if (options.auto && dir == "next" && !clicked) {
					timeout = setTimeout(function() {
						animate("next", false);
					}, diff * options.speed + options.pause);
				};
			};
		};
		// init
		var timeout;
		if (options.auto) {
			timeout = setTimeout(function() {
				animate("next", false);
			}, options.pause);
		};

		if (options.numeric)
			setCurrent(0);

		if (!options.continuous && options.controlsFade) {
			$("#" + options.prevId).hide();
			$("#" + options.firstId).hide();
		};
	});
};
