/**
 * @author Stéphane Roucheray 
 * @extends jquery
 * JED - edited to allow for public method to show previous and next without calling the click action on the buttons
 */

// create closure
(function($) {
	//
	// plugin definition
	//
	jQuery.fn.carousel = function(previous, next, options){

		return this.each(function () {
		
			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;
				
				for (i = 0; i < shownInViewport; i++) {
					jQuery(sliderList).css('width',(numElmts+shownInViewport)*increment + increment + "px");
					jQuery(sliderList).append(jQuery(elmnts[i]).clone());
				}
				
				var showPrevInternal = function(){
					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;
					}
					
				}
				
				var showNextInternal = function(){
					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;
					}
				}
				
				this.showPrev = showPrevInternal;
				this.showNext = showNextInternal;
				
				jQuery(previous).click(function(event){
					showPrevInternal();
				});
				
				jQuery(next).click(function(event){
					showNextInternal();
				});
				
			}
			
		});
	};
//
// end of closure
//
})(jQuery);
