(function($) {
$.fn.carousel = function(o) {
    o = $.extend({
        btnPrev: null,
        btnNext: null,
        auto: null,
		pager: false,
        speed: 500,
        visible: 4,
        start: 0,
        scroll: 4,
        beforeStart: null,
        afterEnd: null
    }, o || {});

    return this.each(function() {
		animCss="left", sizeCss="width";

		var div = $(this);
		var ul =  $("ul", div);
		var li = $("li", div);
		for (i=0; i<li.length;i++){
			li[i].className = "carouselElt";
		}
		li[0].className = "first carouselElt";
		var itemLength = li.size()
		var curr = o.start;
		var v = o.visible;
        div.css({overflow: "hidden"});

        var liSize = width(li);
		var liHeight =  height(li);
        var ulSize = liSize * itemLength;
        var divSize = liSize * v;
		
        ul.css({width: ulSize+"px", left: -(curr*liSize), height: liHeight+"px"});
        div.css(sizeCss, divSize+"px");
		
		 if(o.pager && itemLength > o.visible ){
			var indexControl = Math.ceil(itemLength/o.visible);
			div.before("<ul class=\"controlList\"></ul>");
			var listPager = div.siblings(".controlList");
			for(i=1; i<=indexControl;i++){
				div.siblings(".controlList").append("<li><a rel=\""+parseInt(i-1)+"\" href=\"#\">"+i+"</a></li>");
			}
			$(listPager).find("li")[o.start].className = "active";
			var pager =  $(".controlList", div.parent(0));
			$("a", pager).click(function(){		
				clearInterval(interval);
				return go(parseInt($(this).attr('rel'))*parseInt(o.visible));
			 });
		 }
		
		 if(o.btnPrev){
            $(o.btnPrev).click(function() {
				clearInterval(interval);
                return go(curr-o.scroll);
            }); if(itemLength <= o.visible ){$(o.btnPrev).hide();}
        }
        if(o.btnNext){
            $(o.btnNext).click(function() {
				clearInterval(interval);
                return go(curr+o.scroll);
            });if(itemLength <= o.visible ){$(o.btnNext).hide();}
        }
        if(o.auto)
           var interval =  setInterval(function() {
                go(curr+o.scroll,interval);
            }, o.auto+o.speed);

        function vis() {
            return li.gt(curr-1).lt(v);
        };
		
		function go(to, interval) {
			if(o.beforeStart) o.beforeStart.call(this, vis());		
			if(to<0) {
				if(to>-o.visible)curr = 0;
				else return;
			}
			else{
				if (itemLength<to+o.visible){
					curr = itemLength-o.visible
				} else curr = to;
			}
			if(interval && itemLength <= to){
				clearInterval(interval);	
				curr = 0;
			}			
			if(o.pager){
				pagerIndex = Math.ceil(curr/o.visible);
				pagerList = $(pager).find("li");
				for (i=0; i<pagerList.length;i++){
					if (pagerList[i].className == null || pagerList[i].className.length == 0
							|| "off" == pagerList[i].className || "active" == pagerList[i].className) {
					pagerList[i].className = "off";
				}
				}
				if (pagerList[pagerIndex].className == null || pagerList[pagerIndex].className.length == 0
						|| "off" == pagerList[pagerIndex].className || "active" == pagerList[pagerIndex].className) {
				pagerList[pagerIndex].className = "active"
			}
			}
			ul.animate({left: curr*liSize*-1}, o.speed, function(){
				ul.css(animCss, curr*liSize*-1+"px");
				var listCarousel = $("li", ul);
				for (i=0; i<listCarousel.length;i++){
					listCarousel[i].className = "carouselElt";
				}
				listCarousel[curr].className = "first carouselElt";
				if(o.afterEnd) o.afterEnd.call(this, vis())				
			});
            return false;
		};
    });
};
function css(el, prop) {
    return parseInt($.css(el[0], prop)) || 0;
};
function width(el) {
    return  el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight') + css(el, 'borderRight');
};
function height(el) {
    return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom');
};
})(jQuery);

/********************************************************************************/
function createFarandoleBtn(classPrev,classNext){
	//si la classe est celle du carousel à 5 produits avec flèches, on créée les éléments de flèches avec les classes spécifiées en paramètre
		$(".carouselStandard5El").each(function(){$(this).before('<a class="'+classPrev+'"><span>Précédent</span></a>');$(this).after('<a class="'+classNext+'"><span>Suivant</span></a>')});
}

function initCarousel(){
	//variables précisant les classes pour les boutons précédents et suivants à créer
	var btnPrev = 'btnPrev';
	var btnNext = 'btnNext';
	//création js des éléments précédent et suivant
	createFarandoleBtn(btnPrev,btnNext);
	
	$(".carouselAuto").carousel({
		auto: 2000,
		pager: true
	});
	$(".carouselStandard").carousel({
		pager: true
	});
	
	//carousel version 5 produits avec 2 éléments suivant et précédent
	$(".carouselStandard5El").carousel({
		pager: true,
		btnPrev: "."+btnPrev,
        btnNext: "."+btnNext,
        visible: 5,
        scroll: 5        
	});
}
addEvent(window, 'load',initCarousel, false);

