/**
 * @author Stéphane Roucheray 
 * @extends jquery
 */
jQuery.fn.carousel = function(previous, next, options){
	var sliderList = jQuery(this).children()[0];
	//alert(options.eachStep);
	var eachStep = options.eachStep;
	if (sliderList) {
		if(eachStep == 5){
		var increment = jQuery(sliderList).children().outerWidth("true")*eachStep;
		elmnts = jQuery(sliderList).children();
		numElmts = elmnts.length;
		var clones = numElmts%5;
		if(clones > 0)
		{
			var tmp = numElmts - clones;
			tmp = tmp + 5;
			clones = tmp - numElmts;
		}
		for (i = 0; i < clones+5; i++) {
			jQuery(sliderList).append(jQuery(elmnts[i]).clone());
		}
		numElmts += clones;
		
		sizeFirstElmnt = jQuery(sliderList).children().outerWidth("true");
		shownInViewport = Math.round(jQuery(this).width() / sizeFirstElmnt);
		firstElementOnViewPort = eachStep;
		isAnimating = false;
		
		var sliderWidth = (numElmts+shownInViewport)*increment + increment;
		if(eachStep == 5)
			sliderWidth = (numElmts+shownInViewport)*sizeFirstElmnt;
		jQuery(sliderList).css('width',sliderWidth+"px");	
		
		
		jQuery(previous).click(function(event){
			if (!isAnimating) {
				
				if (firstElementOnViewPort == eachStep) {
					jQuery(sliderList).css('left', "-" + numElmts * sizeFirstElmnt + "px");
					firstElementOnViewPort = numElmts;
				}
				else {
					firstElementOnViewPort-=eachStep;
				}
				jQuery(sliderList).animate({
					left: "+=" + increment,
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				isAnimating = true;
				
			}
			
		});
		jQuery(next).click(function(event){
			
			if (!isAnimating) {
				if (firstElementOnViewPort >= numElmts) {
					firstElementOnViewPort = eachStep;
					jQuery(sliderList).animate({
						left: "0",
						y: 0,
						queue: true
					}, "swing", function(){isAnimating = false;});
				}
				else {
					firstElementOnViewPort += eachStep;
					jQuery(sliderList).animate({
						left: "-=" + increment,
						y: 0,
						queue: true
					}, "swing", function(){isAnimating = false;});
					
				}
				isAnimating = true;
				
			}
		});
		}
		else{
			var increment = jQuery(sliderList).children().outerWidth("true")*eachStep,
			elmnts = jQuery(sliderList).children(),
			numElmts = elmnts.length,
			sizeFirstElmnt = jQuery(sliderList).children().outerWidth("true"),
			shownInViewport = Math.round(jQuery(this).width() / sizeFirstElmnt),
			firstElementOnViewPort = eachStep,
			isAnimating = false;
			
			var sliderWidth = (numElmts+shownInViewport)*increment + increment;
			if(eachStep == 5)
				sliderWidth = (numElmts+shownInViewport)*sizeFirstElmnt;
				
			for (i = 0; i < shownInViewport; i++) {
				jQuery(sliderList).css('width',sliderWidth+"px");
				jQuery(sliderList).append(jQuery(elmnts[i]).clone());
			}
			
			jQuery(previous).click(function(event){
				if (!isAnimating) {
					if (firstElementOnViewPort == eachStep) {
						jQuery(sliderList).css('left', "-" + numElmts * sizeFirstElmnt + "px");
						firstElementOnViewPort = numElmts;
					}
					else {
						firstElementOnViewPort-=eachStep;
					}
					
					jQuery(sliderList).animate({
						left: "+=" + increment,
						y: 0,
						queue: true
					}, "swing", function(){isAnimating = false;});
					isAnimating = true;
				}
				
			});
			
			jQuery(next).click(function(event){
				if (!isAnimating) {
					if (firstElementOnViewPort > numElmts) {
						firstElementOnViewPort = eachStep*2;
						jQuery(sliderList).css('left', "0px");
					}
					else {
						firstElementOnViewPort += eachStep;
					}
					
					jQuery(sliderList).animate({
						left: "-=" + increment,
						y: 0,
						queue: true
					}, "swing", function(){isAnimating = false;});
					isAnimating = true;
				}
			});

		}
	}
};

