﻿(function($){
$.fn.infiniteCarousel = function () {
    
    function repeat(str, num) {
        return new Array( num + 1 ).join( str );
    }
  
    return this.each(function () {
        var $wrapper = $('> div', this).css('overflow', 'hidden');
        var $slider = $wrapper.find('> ul');
        var $items = $slider.find('> li');
        var $single = $items.filter(':first');
            
        var singleWidth = $single.outerWidth();
        var visible = Math.ceil($wrapper.innerWidth() / singleWidth);
        var pages = Math.ceil($items.length / visible);
        var currentPage = 1;
        
        if (pages > 1) {
            if (($items.length % visible) != 0) {
                $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
                $items = $slider.find('> li');
            }

            $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned'));
            $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));
            $items = $slider.find('> li'); // reselect
            
            $wrapper.scrollLeft(singleWidth * visible);
            
            function gotoPage(page) {
                var dir = page < currentPage ? -1 : 1;
                var n = Math.abs(currentPage - page);
                var left = singleWidth * dir * visible * n;
                
                $wrapper.filter(':not(:animated)').animate({
                    scrollLeft : '+=' + left
                }, 500, function () {
                    if (page == 0) {
                        $wrapper.scrollLeft(singleWidth * visible * pages);
                        page = pages;
                    } else if (page > pages) {
                        $wrapper.scrollLeft(singleWidth * visible);
                        page = 1;
                    } 

                    currentPage = page;
                });                
                
                return false;
            }
        
        
            $wrapper.after('<ul class="carouselControls">' +
                                '<li><a class="carouselBack"></a></li>' +
                                '<li><a class="carouselPause"></a></li>' +
                                '<li><a class="carouselForward"></a></li>' +
                           '</ul>');
        
            $('a.carouselBack', this).click(function () {
                return gotoPage(currentPage - 1);                
            });
            
            $('a.carouselForward', this).click(function () {
                return gotoPage(currentPage + 1);
            });            
            
            var autoscrolling = false;
            var manualscrolling = true;     
             
            $(this).mouseenter(function(){
                autoscrolling = false;
                $(this).children('.carouselControls').stop(true,true).fadeIn();
            }).mouseleave(function(){
                if (!manualscrolling) {
                    autoscrolling = true;
                    $(this).children('.carouselControls').stop(true,true).fadeOut();
                }
            });
            
            $(this).find('.carouselPause').click(function(){
                manualscrolling = !manualscrolling;
                if(manualscrolling) {
                    $(this).addClass('carouselPlay');
                    autoscrolling = false;
                }
                else {
                    $(this).removeClass('carouselPlay');
                    autoscrolling = true;
                }
            });
            
            $(this).bind('goto', function (event, page) {
                gotoPage(page);
            });
            
            $(this).bind('next', function () {
                gotoPage(currentPage + 1);
            });
            
            $(this).bind('previous', function () {
                gotoPage(currentPage - 1);
            });
            
            $(this).bind('autoplay', function () {
                autoscrolling = true;
                manualscrolling = false;
                setInterval(
                    function(){ if(autoscrolling && !manualscrolling) { gotoPage(currentPage + 1); } }, 
                    5000);
            });
            
            $(this).bind('pause', function () {
                autoscrolling = false;
            });
            
            $(this).bind('resume', function () {
                autoscrolling = true;
            });
        }
    });
};
})(jQuery);
