(function () {
                jQuery.fn.infiniteCarousel = function (){
                                
                                function repeat(str, n) {
                                                return new Array( n + 1 ).join(str);
                                }
                                
                                return this.each(function () {
                                        var $wrapper = jQuery('> div', this).css('overflow', 'hidden'),
                                            $slider = $wrapper.find('> ul').width(9999),
                                            $items = $slider.find('> li'),
                                            $single = $items.filter(':first')
                                                
                                                singleWidth = $single.outerWidth(),
                                                        visible = Math.ceil($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) {
                                                        $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
                                        $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;
                                                    
                                                $wrapper.filter(':not(:animated)').animate({
                                                                scrollLeft : '+=' + left
                                                }, 500, function () {
                                                                if (page > pages) {
                                                                                $wrapper.scrollLeft(singleWidth * visible);
                                                                                page = 1;
                                                                } else if (page == 0) {
                                                                                page = pages;
                                                                                $wrapper.scrollLeft(singleWidth * visible * pages);
                                                                }
                                                                currentpage = page;
                                                })
                                        }
                                                                                
                                        // 5. Insert back and forward linka
                                        $wrapper.after('<div class="partner-buttons"><a href="#" class="arrow back"></a><a href="#" class="arrow forward"></a></div>');
                                                                                
                                        // 6. Bind back and forward links
                                        jQuery('a.back', this).click(function () {
                                                                gotoPage(currentpage - 1);
                                                                return false;
                                                })
                                        jQuery('a.forward', this).click(function () {
                                                                gotoPage(currentpage + 1);
                                                                return false;
                                                })
                                        
                                });
                        }; 
                })(jQuery);
