$(function() {
  // this is a small helper extension i stole from
  // http://www.texotela.co.uk/code/jquery/reverse/
  // it merely reverses the order of a jQuery set.
  // Used to restore order of elements removed by prevAll
  $.fn.reverse = function() {
      return this.pushStack(this.get().reverse(), arguments);
  };

  // Isolate slider components
  var slideContainer = $('div#main_image_region'),
      slideList = $('div#main_image_region div#slider-images ul li').each(function(idx){ this.id = 'slide'+idx; }),
      triggerList = $('div#main_image_region div#switch ul li a').each(function(idx){ this.id = 'trigger'+idx; }),
      timer = false;

  // Create rotation listener
  slideContainer.bind('rotate',function(event){
    var idx = $(this).data('index'),
        trigger = $('#trigger'+idx),
        slide = $('#slide'+idx);
    slideContainer.data('index',triggerList.index(trigger)); // Update index
    triggerList.removeClass('curr').filter(trigger).addClass('curr'); // Highlight trigger
    slide.parent().stop().animate({left:'-='+slide.position().left+'px'},1000,function(){
      var move = slide.prevAll().remove().reverse(); // Must use 'reverse' to restore order after prevAll
      $(this).css({left:0}).append(move); // Append removed slides to end
    });
  })
  // Stop animation when mouse is over image
  .mouseover(function(){
    clearInterval(timer); timer = false;
  })
  // Re-start animation when mouse leaves image
  .mouseleave(function(){
    autoRotate();
  });

  // Create rotation timer
  autoRotate = function(){
    if (!timer) {
      timer = setInterval(function(){
        var idx = slideContainer.data('index') || 0;
        slideContainer.data('index',(idx < slideList.length-1 ? idx+1 : 0)).trigger('rotate');
      },10000);
    }
  }

  // Set up triggers to stop auto-rotate and go to specific slide
  triggerList.each(function(idx){
    $(this).click(function(e){
      e.preventDefault();
      slideContainer.data('index',idx).trigger('rotate');
    });
  });

  // Highlight first trigger as current
  $(triggerList[0]).addClass('curr');

  // Start timer to auto-rotate slides
  autoRotate();
});
