/**
 * @author StÃ©phane Roucheray 
 * @extends jquery
 */


jQuery.fn.carousel = function(previous, next, options){
	var options = $.extend({
		slide_pages : '.slide_pages'
	}, options);
	
	var sliderList = jQuery(this).children()[0];
	
	if (sliderList) {
		var increment = jQuery(sliderList).children().outerWidth("true"),
		elmnts = jQuery(sliderList).children(),
		numElmts = elmnts.length,
		sizeFirstElmnt = increment,
		shownInViewport = Math.round(jQuery(this).width() / sizeFirstElmnt),
		firstElementOnViewPort = 1,
		isAnimating = false;

		//Slide Bullets
		var slide_pages = jQuery(options.slide_pages);
		var slide_bullets = slide_pages.children('li');
		// \Slide Bullets
		
		for (i = 0; i < shownInViewport; i++) {
			jQuery(sliderList).append(jQuery(elmnts[i]).clone().css('left', increment * (i + numElmts)));
		}
		jQuery(sliderList).css('width',((numElmts+shownInViewport)*increment + increment) + "px");
		
		
		jQuery(previous).click(function(event){
			if (!isAnimating) {
				if (firstElementOnViewPort == 1) {
					jQuery(sliderList).css('left', "-" + numElmts * sizeFirstElmnt + "px");
					firstElementOnViewPort = numElmts;
				}
				else {
					firstElementOnViewPort--;
				}
				
				jQuery(sliderList).animate({
					left: "+=" + increment,
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				isAnimating = true;
			}
			
			if(slide_pages.length) {
				slide_bullets.removeClass('active');
				jQuery(slide_bullets[firstElementOnViewPort-1]).addClass('active');
			}
			
			return false;
		});
		
		jQuery(next).click(function(event){
			if (!isAnimating) {
				if (firstElementOnViewPort > numElmts) {
					firstElementOnViewPort = 2;
					jQuery(sliderList).css('left', "0px");
				}
				else {
					firstElementOnViewPort++;
				}
				jQuery(sliderList).animate({
					left: "-=" + increment,
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				isAnimating = true;
			}
			
			if(slide_pages.length) {
				slide_bullets.removeClass('active');
				if(firstElementOnViewPort == (numElmts+1)) {
					jQuery(slide_bullets[0]).addClass('active');
				} else {
					jQuery(slide_bullets[firstElementOnViewPort-1]).addClass('active');
				}
			}
			
			return false;
		});
		
		//Slide Bullets
		/*
			Let users click bullets.
			Only works with one item on screen at a time.
		*/
		if(slide_pages.length) {
			jQuery(slide_bullets[0]).addClass('active');
			
			slide_bullets.children('a').click(function() {
				scrollToPane(parseInt(jQuery(this).text()));
			});
		}
		
		function scrollToPane(pane) {
			if(pane > firstElementOnViewPort) {
				jQuery(sliderList).animate({
					left: "-=" + (increment*(pane-firstElementOnViewPort)),
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				isAnimating = true;
			} else if(pane < firstElementOnViewPort) {
				jQuery(sliderList).animate({
					left: "+=" + (increment*(firstElementOnViewPort-pane)),
					y: 0,
					queue: true
				}, "swing", function(){isAnimating = false;});
				isAnimating = true;
			}
			firstElementOnViewPort = pane;
			slide_bullets.removeClass('active');
			jQuery(slide_bullets[pane-1]).addClass('active');
		}
		// \Slide Bullets
		
	}
};
