(function () {
  jQuery.fn.JPCarousel = function(options) {

    //Default Settings
    settings = jQuery.extend({
      orientation: 'horizontal',
      timed: false,
      interval: 5000,
      speed: 1000,
      numbers: true
    }, options);
    
    function repeat(str,n) {
      alert(n);
      return new Array(n+1).join(str);
    }

    return this.each( function(options) {

      var $wrapper = $("div.carousel-wrapper", this).css('overflow','hidden');
        $slider = (settings['orientation'] == 'vertical') ? $wrapper.find('> ul').height(9999) : $wrapper.find('> ul').width(9999),
        $items = $slider.find('> li'),
        $single = $items.filter(':first'),

        singleMeasurement = (settings['orientation'] == 'vertical') ? $single.outerHeight() : $single.outerWidth(),
        visible = (settings['orientation'] == 'vertical') ? Math.ceil($wrapper.innerHeight() / singleMeasurement ) : Math.ceil($wrapper.innerWidth() / singleMeasurement),
        currentPage = 1,
        pages = Math.ceil($items.length / visible),
        
        intervalId = null;
                
      if ($items.length % visible != 0) {
        $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
        $items = $slider.find('> li');
      }

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

      if (settings['orientation'] == 'vertical') {
        $wrapper.scrollTop(singleMeasurement * visible);
      } else {
        $wrapper.scrollLeft(singleMeasurement *visible);
      }

      function gotoPage(page) {
        var dir = page < currentPage ? -1 : 1,
          n = Math.abs(currentPage - page),
          offset = singleMeasurement * dir * visible * n;

        if(settings['orientation'] == 'vertical') {
          $wrapper.filter(':not(:animated)').animate({
            scrollTop : "+=" + offset
          }, settings['speed'], function() {
            if (page > pages) {
              $wrapper.scrollTop(singleMeasurement * visible);
              page = 1;
            } else if (page == 0) {
              page = pages;
              $wrapper.scrollTop(singleMeasurement * visible * pages);
            }
            currentPage = page;
          });
        } else {
          $wrapper.filter(':not(:animated)').animate({
            scrollLeft : "+=" + offset
          }, settings['speed'], function() {
            // if page == last page, then reset position
            if (page > pages) {
              $wrapper.scrollLeft(singleMeasurement * visible);
              page = 1;
            } else if (page == 0) {
              page = pages;
              $wrapper.scrollLeft(singleMeasurement * visible * pages);
            }
            currentPage = page;
          });
        }
        
        if ( settings['timed'] && intervalId != null ) {
          window.clearInterval(intervalId);
          intervalId = window.setInterval( next, settings['interval'] );
        }
      }
      
      function skipToPage(page) {
        var dir = page < currentPage ? -1 : 1,
          n = Math.abs(currentPage - page),
          offset = singleMeasurement * dir * visible * n;
          
        if(settings['orientation'] == 'vertical') {
          $wrapper.scrollTop( $wrapper.scrollTop() + offset );
        } else {
          $wrapper.scrollLeft( $wrapper.scrollLeft() + offset);  
        }
        
        if ( page > pages ) {
          $wrapper.scrollLeft(singleMeasurement * visible);
          page = 1;
        } else if ( page == 0 ) {
          page = pages;
          $wrapper.scrollLeft( singleMeasurement * visible * pages );
        }
        currentPage = page;
        
        if ( settings['timed'] && intervalId != null ) {
          window.clearInterval(intervalId);
          intervalId = window.setInterval( next, settings['interval'] );
        }
      }

      window.gotoPage = gotoPage;

      $wrapper.after('<a href="#" class="arrow back">&lt;</a><a href="#" class="arrow forward">&gt;</a>');
      
      $('a.back',this).click(function() {
        gotoPage(currentPage - 1);
        return false;
      });
    
      $('a.forward',this).click(function() {
        gotoPage(currentPage + 1);
        return false;
      });
      
      if( settings['timed'] ) {
        intervalId = window.setInterval( next, settings['interval'] );  
      }
      
      function next() {
        $('a.forward').click();  
      }
      
      if( settings['numbers'] ) {
        $numberWrapper = $('<div class="number-wrapper" />');
        for ( var i=1; i <= pages; i++ ) {
          $numberWrapper.append(
            $('<a href="#" class="number-link" rel="' + i + '">' + i + '</a>').click(function() {
              var pg = parseInt( $(this).attr('rel') );
              //gotoPage(pg);
              skipToPage(pg);
              return false;
            })
          );
        }
        $wrapper.after( $numberWrapper );
      }
      
  
    });
  };
})(jQuery);

$(document).ready(function() {
  $(".rotator").JPCarousel({
    orientation: 'vertical',
    timed: true,
    interval: 10000
  });
});

