/*
    anythingSlider v1.2
    
    By Chris Coyier: http://css-tricks.com
    with major improvements by Doug Neiner: http://pixelgraphics.us/
    based on work by Remy Sharp: http://jqueryfordesigners.com/


	To use the navigationFormatter function, you must have a function that
	accepts two paramaters, and returns a string of HTML text.
	
	index = integer index (1 based);
	panel = jQuery wrapped LI item this tab references
	@return = Must return a string of HTML/Text
	
	navigationFormatter: function(index, panel){
		return index + " Panel"; // This would have each tab with the text 'X Panel' where X = index
	}
*/

(function($){
	
    $.anythingSlider = function(el, options){
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;
        
        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el; 

        // Set up a few defaults
        base.currentPage = 1;
		    base.timer = null;
		    base.playing = false;

        // Add a reverse reference to the DOM object
        base.$el.data("AnythingSlider", base);
        
        base.init = function(){
            base.options = $.extend({},$.anythingSlider.defaults, options);
			
			     // Cache existing DOM elements for later 
            base.$wrapper = base.$el.find('> div').css('overflow', 'hidden');
            base.$slider  = base.$wrapper.find('> ul');
            base.$items   = base.$slider.find('> li');
            base.$single  = base.$items.filter(':first');

        
        	 // Get the details
            base.singleWidth = base.$single.outerWidth();
            base.pages = base.$items.length;

            // Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
			      // This supports the "infinite" scrolling
            base.$items.filter(':first').before(base.$items.filter(':last').clone().addClass('cloned'));
            base.$items.filter(':last' ).after(base.$items.filter(':first').clone().addClass('cloned'));

			      // We just added two items, time to re-cache the list
            base.$items = base.$slider.find('> li'); // reselect
            
		
      			// If autoPlay functionality is included, then initialize the settings
      			if(base.options.autoPlay) {
        				base.playing = !base.options.startStopped; // Sets the playing variable to false if startStopped is true
        				base.startStop(base.playing);
      			};
			
      			// If pauseOnHover then add hover effects
      			base.$el.hover(function(){
      					base.clearTimer();
      			}, function(){
      					base.startStop(base.playing);
      			});
      			
      			base.setCurrentPage(1);

        };

		    base.gotoPage = function(page, autoplay){
		    
            // When autoplay isn't passed, we stop the timer
            if(autoplay !== true) autoplay = false;
            if(!autoplay) base.startStop(false);
			
            if(typeof(page) == "undefined" || page == null) {
      				  page = 1;
      				  base.setCurrentPage(1);
      			};
			
            // Just check for bounds
            if(page > base.pages + 1) page = base.pages;
            if(page < 0 ) page = 1;

            var dir = page < base.currentPage ? -1 : 1,
                n = Math.abs(base.currentPage - page),
                left = base.singleWidth * dir * n;
			
            base.$wrapper.filter(':not(:animated)').animate({
                scrollLeft : '+=' + left
            }, base.options.animationTime, base.options.easing, function () {
                if (page == 0) {
                    base.$wrapper.scrollLeft(base.singleWidth * base.pages);
                    page = base.pages;
                } else if (page > base.pages) {
                    base.$wrapper.scrollLeft(base.singleWidth);
                    // reset back to start position
                    page = 1;
                };
				        base.setCurrentPage(page);
				
            });
		    };
		
		    base.setCurrentPage = function(page){
			     // Set visual
            if(base.options.buildNavigation){
    				    base.$nav.find('.cur').removeClass('cur');
    				    $(base.$navLinks[page - 1]).addClass('cur');	
            };
			
            // Only change left if move does not equal false
            base.$wrapper.scrollLeft(base.singleWidth * page);

            // Update local variable
            base.currentPage = page;
		    };
		
    		base.goForward = function(autoplay){
      			if(autoplay !== true) autoplay = false;
      			base.gotoPage(base.currentPage + 1, autoplay);
    		};
		
		
    		// Handles stopping and playing the slideshow
    		// Pass startStop(false) to stop and startStop(true) to play
    		base.startStop = function(playing){
      			if(playing !== true) playing = false; // Default if not supplied is false
      			
      			// Update variable
      			base.playing = playing;
      			
      			if(playing){
        				base.clearTimer(); // Just in case this was triggered twice in a row
        				base.timer = window.setInterval(function(){
                    base.goForward(true);
        				}, base.options.delay);
      			}else{
        				base.clearTimer();
      			};
    		};
		
        base.clearTimer = function(){
            // Clear the timer only if it is set
            if(base.timer) window.clearInterval(base.timer);
        };

        // Trigger the initialization
        base.init();
    };

	
    $.anythingSlider.defaults = {
        easing: "swing",                // Anything other than "linear" or "swing" requires the easing plugin
        autoPlay: true,                 // This turns off the entire FUNCTIONALY, not just if it starts running or not
        startStopped: false,            // If autoPlay is on, this can force it to start stopped
        delay: 3000,                    // How long between slide transitions in AutoPlay mode
        animationTime: 600,             // How long the slide transition takes                // Should links change the hashtag in the URL?
        pauseOnHover: true,             // If true, and autoPlay is enabled, the show will pause on hover              // Stop text
		    navigationFormatter: null       // Details at the top of the file on this use (advanced use)
    };
	

    $.fn.anythingSlider = function(options){
    		return this.each(function(i){			
            (new $.anythingSlider(this, options));
        });
    };

	
})(jQuery);


