(function($){
  var settings;
  
  function shuffle(arr) {
    for (
      var j, x, i = arr.length; i;
      j = parseInt(Math.random() * i),
      x = arr[--i], arr[i] = arr[j], arr[j] = x
    );
  }

  function displayNextImage() {
    
    var lastImg = $('#' + settings.containerID + ' img:visible:last');
    var first = $('#' + settings.containerID + ' img:first');

    if (lastImg.attr('src') === $('#' + settings.containerID + ' img:first').attr('src')) {
      lastImg.css('z-index', 1);
      $('#' + settings.containerID + ' img:hidden').show();
      lastImg.fadeOut(settings.fadeDuration, function() {
        $(this).css('z-index', 0).show();
      });
    } else {
      lastImg.fadeOut(settings.fadeDuration);
    }

    setTimeout(displayNextImage, settings.wait);
  }
  
  $.fn.imageRotator = function(options) {
  
    var defaults = {
          images: [],
          containerID: 'imgRotator',
          wait : 5,        // Time in seconds between image swaps
          fadeDuration: 1  // Time in seconds for image transition
        };
        
    settings = $.extend({}, defaults, options);
      
    // Turn seconds into milliseconds
    settings.wait *= 1000;
    settings.fadeDuration *= 1000;

    this.each(function() {
      var $this = $(this);
      
      // Cache the first <img> tag
      var firstImg = $this.find('img:first');
      
      var numImages = settings.images.length;

      if (numImages) {
        if (numImages > 1) {
          // Shuffle the array if there are more than two images
          shuffle(settings.images);

          // Create the HTML for the remaining images and insert them after the first.
          for (var i=1; i < numImages; i++) {
            firstImg.clone().attr('src', settings.images[i]).insertAfter(firstImg);
          }
          
          setTimeout(displayNextImage, settings.wait);
        }

        // Assign an image to the 1st <img>
        firstImg.attr('src', settings.images[0]);

      } else {
        // If no images, hide the 1st <img>
        firstImg.hide();
      }
    });

    // returns the jQuery object to allow for chainability.
    return this;
  }
})(jQuery);
