(function($j){
	
	$j.fn.carousel = function(params){
		
		var params = $j.extend({
			auto: false,
			loop: true,
			dispItems: 1,
			pagination: false,
			nextBtn: "<span class=\"carousel-next\">suivant</span>",
			prevBtn: "<span class=\"carousel-previous\">suivant</span>",
			autoSlide: true,
			autoSlideInterval: 5000,
			delayAutoSlide: 0
		},params);
		
		return this.each(function(){
			
			// Env object
			var env = {
				$elts: {},
				params: params,
				launchOnLoad: []
			};
			
			// Carousel main container
			env.$elts.carousel = $j(this).addClass("js");
			
			// Carousel content
			env.$elts.content = $j(this).find(">").css({position: "absolute", "top": 0});
			
			// Content wrapper
			env.$elts.wrap = env.$elts.content.wrap('<div class="carousel-wrap"></div>').parent().css({overflow: "hidden", position: "relative"});
			
			// env.steps object
			env.steps = {
				first: 0, // First step
				count: env.$elts.content.find(">").length // Items count
			};
			// Last visible step
			env.steps.last = env.steps.count - 1;
			
			// Next / Prev Buttons
			env.$elts.nextBtn = $j(params.nextBtn).appendTo(env.$elts.carousel).addClass("carousel-control next").data("firstStep", env.params.dispItems);
			env.$elts.prevBtn = $j(params.prevBtn).prependTo(env.$elts.carousel).addClass("carousel-control previous").data("firstStep", -(env.params.dispItems));
			
			// Bind events on next / prev buttons
			initButtonsEvents(env, function(e){
				slide(e, this, env);
			});
			
			// Pagination
			if (env.params.pagination) initPagination(env);
			
			// Loop
			//if (env.params.loop) initLoop(env);
			
			// On window load !
			$j(window).load(function(){
				
				// First item
				var $firstItem = env.$elts.content.find(">:eq(0)");
				
				// Get default item width
				env.itemWidth = $firstItem.width() + parseFloat($firstItem.css("borderLeftWidth")) + parseFloat($firstItem.css("borderRightWidth"));
				
				// Define content width
				env.contentWidth = env.itemWidth * env.steps.count;
				
				// Set content width to container
				env.$elts.content.width( env.contentWidth );
				
				// Update Next / Prev buttons state
				updateButtonsState(env);
				
				// Launch function added to "window onload" event
				$j.each(env.launchOnLoad, function(i,fn){
					fn();
				});
				
				// Launch autoslide
				if (env.params.autoSlide){
					window.setTimeout(function(){
						env.autoSlideInterval = window.setInterval(function(){
							env.$elts.nextBtn.click();
						}, env.params.autoSlideInterval);
					}, env.params.delayAutoSlide);
				}
			});
			
		});
		
	};
	
	// Slide effect
	function slide(e, btn, env){
		var $btn = $j(btn);
		var newFirstStep = $btn.data("firstStep");
		
		env.$elts.content.stop().animate({
			left : -(env.itemWidth * newFirstStep) + "px"
		});
		
		env.steps.first = newFirstStep;
		
		updateButtonsState(env);
		
		// Stop autoslide
		if (!!e.clientX && env.autoSlideInterval){
			window.clearInterval(env.autoSlideInterval);
		}
	};
	
	// Update all buttons state : disabled or not
	function updateButtonsState(env){
		
		env.$elts.prevBtn.data("firstStep", env.steps.first - env.params.dispItems);
		env.$elts.nextBtn.data("firstStep", env.steps.first + env.params.dispItems);
		
		if (env.$elts.prevBtn.data("firstStep") < 0) {
			if (env.params.loop){
				env.$elts.prevBtn.data("firstStep", env.steps.count-1);
				env.$elts.prevBtn.trigger("enable");
			}
			else {
				env.$elts.prevBtn.trigger("disable");
			}
		}
		else {
			env.$elts.prevBtn.trigger("enable");
		}
		
		if (env.$elts.nextBtn.data("firstStep") >= env.steps.count) {
			if (env.params.loop){
				env.$elts.nextBtn.data("firstStep", 0);
				env.$elts.nextBtn.trigger("enable");
			}
			else {
				env.$elts.nextBtn.trigger("disable");
			}
		}
		else {
			env.$elts.nextBtn.trigger("enable");
		}
		
		if (env.params.pagination){
			env.$elts.paginationBtns.removeClass("active")
			.filter(function(){ return ($j(this).data("firstStep") == env.steps.first) }).addClass("active");
		}
	};
	
	// Next / Prev buttons events only
	function initButtonsEvents(env, slideEvent){
		
		env.$elts.nextBtn.add(env.$elts.prevBtn)
		.bind("enable", function(){
			$j(this).bind("click", slideEvent).removeClass("disabled");
		})
		.bind("disable", function(){
			$j(this).unbind("click").addClass("disabled");
		});
		
		env.$elts.nextBtn.add(env.$elts.prevBtn).hover(
			function(){
				$j(this).addClass("hover");
			},
			function(){
				$j(this).removeClass("hover");
			}
		);
	};
	
	// Pagination
	function initPagination(env){
		env.$elts.pagination = $j('<div class="center-wrap"><div class="carousel-pagination"><p></p></div></div>').appendTo(env.$elts.carousel).find("p");
		env.$elts.paginationBtns = $j([]);
		
		env.$elts.content.find("li").each(function(i){
			if (i%env.params.dispItems == 0)
				env.$elts.paginationBtns = env.$elts.paginationBtns.add( $j('<a role="button">'+(i+1)+'</a>').data("firstStep", i) );
		});
		
		env.$elts.paginationBtns.appendTo(env.$elts.pagination);
		
		env.$elts.paginationBtns.slice(0,1).addClass("active");
		
		// Events
		env.launchOnLoad.push(function(){
			env.$elts.paginationBtns.click(function(e){
				slide( e, this, env);
			});
		});
	};
	
})(jQuery);



$(function(){
	$("body").addClass("js");
	$("#content #to-discover div.box-content").carousel({
		autoSlide: true
	});
});