(function($) {

    $.fn.infiniteCarousel = function(opts) {

        var options = opts || {};
        var container = $(this);
        var list = $('ul', container);
        var prev = $(options.prev);
        var next = $(options.next);

        if (list.length != 1) {
            throw new Error('infiniteCarousel plugin requeires single <ul> element inside');
        }

        var elements = list.children(),
                elementsAmount = elements.length,
                increment = elements.outerWidth('true'),
                visibleElementsAmount = Math.round(container.width() / increment),
                currentElement = 1,
                animating = false;

        for (var i = 0; i < visibleElementsAmount; i ++) {
            list.css('width', (elementsAmount + visibleElementsAmount) * increment + increment + 'px');
            list.append($(elements[i]).clone());
        }

        prev.click(function() {
            if (!animating) {
                if (currentElement == 1) {
                    list.css('left', "-" + elementsAmount * increment + "px");
                    currentElement = elementsAmount;
                }
                else {
                    currentElement --;
                }

                animating = true;
                list.animate({
                    left: '+=' + increment,
                    y: 0,
                    queue: true
                }, 'swing', function() {
                    animating = false;
                });

            }

            return false;
        });

        next.click(function() {
            if (!animating) {
                if (currentElement > elementsAmount) {
                    currentElement = 2;
                    list.css('left', '0px');
                }
                else {
                    currentElement ++;
                }

                animating = true;
                list.animate({
                    left: '-=' + increment,
                    y: 0,
                    queue: true
                }, 'swing', function() {
                    animating = false;
                });

            }

            return false;
        });

    };

})(jQuery);

