(function($) {
$.fn.carousel = function (opt) {
  opt = $.extend(opt||{}, {
    paging: false,
    unit: 1,
    
  $:null});
  function repeat(str, num) { return (new Array(num + 1)).join(str); }

  return this.each(function () {
    var current = 0,
        container = $(this).css('overflow', 'hidden'),
        width = container.innerWidth(),
        baseLeft = container.offset().left,
        baseRight = baseLeft + width,
        original_items = container.find('li'),
        originalLength = original_items.length,
        first = original_items.filter(':first'),
        last = original_items.filter(':last'),
    $$;
    container.find('ul').contents().filter(function() {
      return this.nodeType == 3 && ! /[^ \r\n]/.test(this.data);
    }).remove();

    var i;
    for (i = 1; i < originalLength; ++i) {
      if ((original_items.eq(i).offset().left - baseLeft) > width) break
    }
    last.after(original_items.slice(0, i).clone(true));
    var head = last.clone(true);
    first.before(head);

    var items = container.find('li'),
      stops = [],
      prevRight = head.offset().left + head.outerWidth();
    for (var i = 0; i <= originalLength; ++i) {
      var item = items.eq(i+1), left = item.offset().left;
      stops.push(prevRight + Math.floor((left - prevRight) / 2) - baseLeft);
      prevRight = left + item.outerWidth();
    }
    container.scrollLeft(stops[current]);

    var start = stops[0], end = stops[originalLength], animationID, delta;
    container.mouseleave(function() {
      clearInterval(animationID);
      animationID = false;
    }).mousemove(function(ev) {
      var pos = ev.pageX - baseLeft - width/2,
          unit = (width/2) / 8;
      if (Math.abs(pos) < unit) { $(this).mouseleave(); return; }
      delta = Math.floor(pos / unit) + (pos > 0? -1: +1);
      if (animationID) return;
      animationID = setInterval(loop, 25);
      function loop() {
        var left = container.scrollLeft() + delta;
        if (left < start) left = end + (left - start);
        if (left > end) left = start + (left - end);
        container.scrollLeft(left);
      }
    });

    var next = function() {
      var index = current >= originalLength-1? 0: current+1;
      container.filter(':not(:animated)').animate(
        { scrollLeft: stops[current+1] },
        { duration: 500,
          complete: function() { container.scrollLeft(stops[current = index]); }}
      );
    };
    container.data('goNext', next);

    var prev = function() {
      if (current <= 0) container.scrollLeft(stops[originalLength]);
      var index = current <= 0? originalLength-1: current;
      container.filter(':not(:animated)').animate(
        { scrollLeft: stops[index] },
        { duration: 500,
          complete: function() { current = index; } }
      );
    };
    container.data('goPrev', prev);
    /*

    function getCurrent(eq) {
      var current, len = stops.length, here = container.scrollLeft();
      for (current = 0; current < len; ++current) {
        if (!!eq && here == stops[current]) return current;
        if (here < stops[current]) return current-1;
      }
      return current;
    }
    var navi = $('<a />').addClass('navigation').fadeTo(0.5, 0).css({
      display: 'block', width: '2em',
      position: 'absolute', left: container.offset().left, top: container.offset().top
    });
    container.prepend(navi.clone().text('<').addClass('prev').click(next)
      .css({float: 'left', backgroundColor: 'red', zIndex: 100}));
    container.append(navi.clone().text('>').addClass('next').click(prev)
      .css({float: 'rigth', 'text-align': 'right', zIndex: 99}));
    */
  });
};
})(jQuery);
