var featureds, curFeatured; // array of all featured complex elements, the current one being displayed
var prog, start;            // progress display, element on which the slideshow started
var showInterval;            // timer for slideshow cycling

$(document).ready(function() {
  /* Init
  -----------------------*/

  // Collect array of featured complex elements (& hide them all)
  featureds = $('#featured-list li:not(#slide-controls)').addClass('hide').css({opacity: 0.0});

  // Choose random index to start slideshow
  curFeatured = Math.floor(Math.random() * featureds.length);
  $(featureds[curFeatured]).addClass('active').css({opacity: 1.0});

  // Set up progress display "showing x-th of y"
  prog = $('#slide-controls strong');
  start = curFeatured;

  // Start show
  slideStart();
  progUpdate();

  /* Slideshow Behaviors
  -----------------------*/

  // Pause show on mouse hover
  $('#featured-list li:not(#slide-controls)').hover(
    function() { slideStop(); },
    function() { slideStart(); }
  );

  // Next/previous buttons
  $('#slide-controls #slide-next').click(function(e) {
    e.preventDefault();

    slideSwitch();
    slideStart();
  });
  $('#slide-controls #slide-prev').click(function(e) {
    e.preventDefault();

    slideSwitch(-1);
    slideStart();
  });
});

/* Slideshow
------------------------*/

// Start show
function slideStart() {
  clearInterval(showInterval);
  showInterval = setInterval('slideSwitch()', 5000);
}

// Stop show
function slideStop() {
  clearInterval(showInterval);
}

// Switch slides
// @arg dir = (1|-1) direction to switch (forward or back)
function slideSwitch(dir) {
  // Default to advance forward
  dir = dir || 1;

  // Select current, advance to next item (forward or back, looping back as needed), select the next
   var active = $(featureds[curFeatured]);
  if (curFeatured + dir == featureds.length)
    curFeatured = 0;
  else if (curFeatured + dir == -1)
    curFeatured = featureds.length - 1;
  else
    curFeatured += dir;
  var next = $(featureds[curFeatured]).addClass('active');

  // Perform the fade-out, fade-in transition
    active.animate(
    {opacity: 0.0}, 500,
    function() {
      active.removeClass('active');
      next.animate({opacity: 1.0}, 250, function() {
        // Update progress display
        progUpdate();
      });
     }
  );
}

// Updates progress display
function progUpdate() {
  // Calculate index of current complex, relative to the random starting position
  var curNum = curFeatured - start + 1;
  if (curNum <= 0)
    curNum += featureds.length;

  // Add correct ordinal suffix
  if (curNum == 1)
    curNum += 'st';
  else if (curNum == 2)
    curNum += 'nd';
  else if (curNum == 3)
    curNum += 'rd';
  else
    curNum += 'th';

  // Update text
  prog.text(curNum + ' of ' + featureds.length);
}
