(function () {

    $.fn.infiniteCarousel = function () {

        function repeat(str, n) {

            return new Array( n + 1 ).join(str);

        }

        

        return this.each(function () {

            // magic!

            var $carousel_wrapper = $('> div', this).css('overflow', 'hidden'),

                $slider = $carousel_wrapper.find('> ul').width(9999),

                $items = $slider.find('> li'),

                $single = $items.filter(':first')

                

                singleWidth = $single.outerWidth(),

                visible = Math.ceil($carousel_wrapper.innerWidth() / singleWidth),

                currentPage = 1,

                pages = Math.ceil($items.length / visible);

                

            /* TASKS */

            

            // 1. pad the pages with empty element if required

            if ($items.length % visible != 0) {

                // pad

                $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));

                $items = $slider.find('> li');

            }

            

            // 2. create the carousel padding on left and right (cloned)

            $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');

            

            // 3. reset scroll

            $carousel_wrapper.scrollLeft(singleWidth * visible);

            

            // 4. paging function

            function gotoPage(page) {

                var dir = page < currentPage ? -1 : 1,

                    n = Math.abs(currentPage - page),

                    left = singleWidth * dir * visible * n;

                

                $carousel_wrapper.filter(':not(:animated)').animate({

                    scrollLeft : '+=' + left

                }, 500, function () {

                    // if page == last page - then reset position

                    if (page > pages) {

                        $carousel_wrapper.scrollLeft(singleWidth * visible);

                        page = 1;

                    } else if (page == 0) {

                        page = pages;

                        $carousel_wrapper.scrollLeft(singleWidth * visible * pages);

                    }

                    

                    currentPage = page;

                });

            }

            

// THIS IS NEW CODE FOR THE AUTOMATIC INFINITE CAROUSEL

            $(this).bind('next', function () {

                gotoPage(currentPage + 1);

            });

        });

    };

})(jQuery);



$(document).ready(function () {

    // THIS IS NEW CODE FOR THE AUTOMATIC INFINITE CAROUSEL

    var autoscrolling = true;

    

    $('.infiniteCarousel').infiniteCarousel().mouseover(function () {

        autoscrolling = false;

    }).mouseout(function () {

        autoscrolling = true;

    });

    

    setInterval(function () {

        if (autoscrolling) {

            $('.infiniteCarousel').trigger('next');

        }

    }, 5000);

});




