$.fn.infinitecarousel = function() { function repeat(str, num) { return new array(num + 1).join(str) } return this.each(function() { var $wrapper = $('> .wrapper', this).css('overflow', 'hidden'), $slider = $wrapper.find('> .pic-item-list'), $items = $slider.find('> .pic-item'), $single = $items.filter(':first'), singlewidth = $single.outerwidth(), visible = math.ceil($wrapper.innerwidth() / singlewidth), currentpage = 1, pages = math.ceil($items.length / visible); if (($items.length % visible) != 0) { $slider.append(repeat('
  • ', visible - ($items.length % visible))); $items = $slider.find('> .pic-item') } $items.filter(':first').before($items.slice( - visible).clone().addclass('cloned')); $items.filter(':last').after($items.slice(0, visible).clone().addclass('cloned')); $items = $slider.find('> .pic-item'); $wrapper.scrollleft(singlewidth * visible); 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 == 0) { $wrapper.scrollleft(singlewidth * visible * pages); page = pages } else if (page > pages) { $wrapper.scrollleft(singlewidth * visible); page = 1 } currentpage = page }); return false } $wrapper.after(''); $('a.back', this).click(function() { return gotopage(currentpage - 1) }); $('a.forward', this).click(function() { return gotopage(currentpage + 1) }); $(this).bind('goto', function(event, page) { gotopage(page) }); $(this).bind('next', function () { gotopage(currentpage + 1); }); }) };