// Generic Carousel
/* @title         GenericCarousel
 * @version       1.0
 * @author        Ben Kimpel
 * @description   Generic carousel with flexible HTML configuration
 */
(function($) {
   $.fn.carousel = function(options) {      
      // Merge defaults and user options
      var o = $.extend({}, $.fn.carousel.defaults, options);
	  
	  	var $navigation = (o.nextPrevContainer != '') ? $(o.nextPrevContainer) : $(this);
		var $totals = (o.totalContainer != '') ? $(o.totalContainer) : $(this);
			
		var carouselID = $.fn.carousel.carouselCount;
	  	$navigation.each(function () {
	  		$(this).addClass('carouselID_' + carouselID);
			carouselID++;
	  	});
	  	
	    carouselID = $.fn.carousel.carouselCount;
	  	$totals.each(function () {
	  		$(this).addClass('carouselID_' + carouselID);
	  		carouselID++;
	  	});
      
        carouselID = $.fn.carousel.carouselCount;
      	$.fn.carousel.carouselCount += 1000;
      	
      return this.each(function() {
         var $this = $(this);
         var current = 0;

		 var totalElement = $('.carouselID_' + carouselID).find(o.totalSelector);
		 var counterElement = $('.carouselID_' + carouselID).find(o.counterSelector);
         var nextButton = $('.carouselID_' + carouselID).find(o.nextSelector);
		 var previousButton = $('.carouselID_' + carouselID).find(o.previousSelector);
         
         // Collect sections, hide all but first
         var sections = $this.find(o.sectionSelector);
         sections.each(function(i) { (i != 0) ? $(this).hide() : false; });

         counterElement.text(current + 1);
         totalElement.text(sections.length);

		 //If loop is set to false, hide the previous button on start
		 (sections.length <= 1) ? nextButton.css('visibility','hidden') : nextButton.css('visibility','visible');			
         (!o.loop && current + 1 == 1) ? previousButton.css('visibility','hidden') : previousButton.css('visibility','visible');

		 carouselID++;
		 
         // Next
		 nextButton.click(function () {
			if(!o.slideTransition){
				$(sections[current]).hide();
				current = (current === sections.length - 1) ? 0 : current + 1;
				$(sections[current]).show();
				counterElement.text(current + 1);
				// Show/Hide the previous/next buttons depending on the the loop flag
				(!o.loop && current + 1 == 1) ? previousButton.css('visibility','hidden') : previousButton.css('visibility','visible');
				(!o.loop && current === sections.length - 1) ? nextButton.css('visibility','hidden') : nextButton.css('visibility','visible');
			}else{				
				$(sections[current]).css('width',$(sections[current]).parent().outerWidth()).animate({ 'left':-$(sections[current]).width() }, o.slideSpeed, 'swing');	
				current = (current === sections.length - 1) ? 0 : current + 1;
				$(sections[current]).css({'width':$(sections[current]).parent().outerWidth(),'left':$(sections[current]).width()})		
					.show()							
					.animate({ 'left':0 }, o.slideSpeed, 'swing', function () {								
						counterElement.text(current + 1);						
						// Show/Hide the previous/next buttons depending on the the loop flag
						(!o.loop && current + 1 == 1) ? previousButton.css('visibility','hidden') : previousButton.css('visibility','visible');
						(!o.loop && current === sections.length - 1) ? nextButton.css('visibility','hidden') : nextButton.css('visibility','visible');
						});	
			}
            return false;
		 });         

         // Previous
         previousButton.click(function() {			
			if(!o.slideTransition){
				$(sections[current]).hide();
				current = (current === 0) ? sections.length - 1 : current - 1;
				$(sections[current]).show();
				counterElement.text(current + 1);
				// Show/Hide the previous/next buttons depending on the the loop flag
				(!o.loop && current + 1 == 1) ? previousButton.css('visibility','hidden') : previousButton.css('visibility','visible');
				(!o.loop && current === sections.length - 1) ? nextButton.css('visibility','hidden') : nextButton.css('visibility','visible');				
			}else{					
				$(sections[current]).css('width',$(sections[current]).parent().outerWidth()).animate({ 'left':$(sections[current]).parent().width() }, o.slideSpeed, 'swing');	
				current = (current === 0) ? sections.length - 1 : current - 1;
				$(sections[current]).css({'width':$(sections[current]).parent().outerWidth(),'left':-$(sections[current]).width()})		
					.show()							
					.animate({ 'left':0 }, o.slideSpeed, function () {								
						counterElement.text(current + 1);						
						// Show/Hide the previous/next buttons depending on the the loop flag
						(!o.loop && current + 1 == 1) ? previousButton.css('visibility','hidden') : previousButton.css('visibility','visible');
						(!o.loop && current === sections.length - 1) ? nextButton.css('visibility','hidden') : nextButton.css('visibility','visible');
						});	
			}
			return false;            
         });         
      }); // Matched element iterator
   };
   
   $.fn.carousel.carouselCount = 1000;
   
   // Defaults (public)
   $.fn.carousel.defaults = {
      loop: true,
	  slideTransition: false,
	  slideSpeed: 300,
      sectionSelector: '._contents li',
      nextSelector: '._next',
      previousSelector: '._previous',
      counterSelector: '._counter',
      totalSelector: '._total',
	  totalContainer: '',
	  nextPrevContainer: ''
   };
})(jQuery);
