
(function($) {

$.fn.fadingSlideshow = function(opts) {
  /* Global variables */
  var slides = [];
  var currentDirection = true;
  var index = 0;
  
  opts = $.extend({}, $.fn.fadingSlideshow.defaults, opts);

  var alternateDirection = false;
  switch (opts.direction) {
    case 'down':
      currentDirection = false;
      break;
    case 'up':
      currentDirection = true;
      break;
    case 'alternate':
      currentDirection = true;
      alternateDirection = true;
      break;
  }

  function animateSlide(currentSlide, prevSlide, direction) {
    var startPos, finishPos;
  
    $currentSlide = $(currentSlide);
    $prevSlide = $(prevSlide);
  
    startPos = 0;
    endPos = $currentSlide.parent().height() - $currentSlide.height();
  
    if (!direction) {
      tmp = endPos;
      endPos = startPos;
      startPos = tmp;
    }

    $prevSlide.css('z-index', 0)
    $currentSlide.css({
        top: startPos,
        zIndex: 1
      });
    $currentSlide.fadeIn(opts.fadeDuration, function() {
        $prevSlide.hide();
      })
    $currentSlide.animate( { top: endPos }, {
          duration: opts.slideDuration,
          // queue: false,
          complete: doNextSlide,
          easing: opts.easing
      });
  }

  function doNextSlide() {
    nextSlide = slides.shift();
    prevSlide = slides[slides.length - 1];
    slides.push(nextSlide);
    
    animateSlide(nextSlide, prevSlide, currentDirection);
        
    currentDirection = 
      alternateDirection ? !currentDirection : currentdirection;
  }

  $slides = this.children();

  if ($slides.length > 0) {
    
    this.css('overflow', 'hidden');
    this.wrap('<div></div>')
      .css({
        overflow: 'hidden',
        width: this.width(),
        height: this.height()
      });
    $slides.hide();
    $slides.css('position', 'absolute');
    slides = $.makeArray($slides);

    this.append('<img src="' + opts.loader + '" id="slideshow-loader">');
    $('#slideshow-loader').css({
      margin: 'auto',
      position: 'absolute',
      left: (this.width() - 220) / 2.0,
      top: (this.height() - 19) / 2.0
    });

    if ($slides[0].complete || $slides[0].readyState == 'complete') {
      $('#slideshow-loader').hide();
      doNextSlide();
    } else {
      $(slides[0]).bind('load', function(event) {
        $('#slideshow-loader').hide();
        doNextSlide();      
      });
    }
  }
};

$.fn.fadingSlideshow.defaults = {
  fadeDuration:   2000,
  slideDuration:  10000,
  direction:      'alternate',
  beginCycle:     function() {},
  eachSlide:      function() {},
  easing:         'swing',
  loader:         'loader.gif'
};

// private function for debugging
function debug($obj) {
  if (window.console && window.console.log) {
    window.console.log($obj);
  }
}

})(jQuery);
