jQuery.fn.rotator = function(rotatorDefaults) {
  var rotatorDefaults = jQuery.extend({
    show: 1,
    speed: 300,
    circle: true
  }, rotatorDefaults);

  return this.each(function() {
    var rotator = $(this);

    // Wrap items in two DIVs
    var rotator_list = rotator.find('.items');
    rotator_list.wrap('<div class="rotator_wrapper"></div>');
    var rotator_wrapper = rotator.find('.rotator_wrapper');

    var rotator_items = rotator_list.find('.item');
    var offset = 0;
    var active_page = 1;
    var number_of_pages = Math.ceil(rotator_items.length/rotatorDefaults.show);
    var item_width = rotator_items.outerWidth(true);
    var item_height = rotator_items.outerHeight(true);
    var timeout = 8000;


    // Set visible height of wrapper
    rotator_wrapper.height(item_height+'px');

    // Set actual width of list
    rotator_list.width(rotator_items.length*item_width);
    rotator_list.css({position: 'absolute', left: '0px'});

    // Remove bottom margin on items and set min_height.
    rotator_items.css({marginBottom: '0px'});
    
    tab_list = rotator.find('.tabs');
    tab_list.find('li a').each(function(i){
      var link = $(this);
      link.click(function(e) {
        e.preventDefault();
        rotator.stopTime('rotate');
        rotator.trigger('rotator:activate_page', [i+1]);
      });
    });
    
    // Setup events and activate the initial page
    rotator.bind('rotator:activate_page', goToPage)
    rotator.bind('rotator:next', next)
    rotator.bind('rotator:previous', previous)
    rotator.trigger('rotator:activate_page', [active_page]);
    
    // Set up timers
    rotator.everyTime(timeout, 'rotate', function(i) {
        $(this).trigger('rotator:next');
    });
    
    function next(e) {
      e.preventDefault();
      if ((active_page + 1) <= number_of_pages) {
        rotator.trigger('rotator:activate_page', [active_page + 1]);
      } else {
        if (rotatorDefaults.circle) { 
          console.log("go to beginning");
          rotator.trigger('rotator:activate_page', [1]);
        } else {
          rotator_list.animate({left: '-=50px'}, 100).animate({left: '+=50px'}, 200)          
        }
      }  
    }
    
    function previous(e) {
      e.preventDefault();
      if (active_page > 1) {
        rotator.trigger('rotator:activate_page', [active_page - 1]);
      } else {
        if (rotatorDefaults.circle) { 
          rotator.trigger('rotator:activate_page', [number_of_pages]);
        } else {        
          rotator_list.animate({left: '+=50px'}, 100).animate({left: '-=50px'}, 200)
        }
      }  
    }    
    
    function goToPage(e, page) {
      if (page > number_of_pages) { page = number_of_pages };
      if (page <= 0) { page = 1 };
      active_page = page;
      offset = (page * rotatorDefaults.show) - rotatorDefaults.show;
      move_to = offset * item_width;
      rotator_list.animate({left: -move_to+'px'}, rotatorDefaults.speed);
      
      var tabs = tab_list.find('li');
      var active_tab = tabs[page-1];
      
      if (!$(active_tab).hasClass('active')) {
        $(active_tab).addClass('active');
        //$(active_tab).animate({backgroundColor: '#0066af'}, 100);
      }
      
      tabs.each(function(){
        if (this != active_tab && $(this).hasClass('active')) {
          $(this).removeClass('active');
          //$(this).animate({backgroundColor: '#111'}, 100);
        }
      })
    }
  });
}
