/**
* jQuery slideshow plugin
*
* @author Bartosz Pasiński <mail@pasi.pl>
* @requires jQuery
* @version 1.0
*/

(function($) {
  var cache = [];
  // Arguments are image paths relative to the current page.
  $.preLoadImage = function(src) {
    var cacheImage = document.createElement('img');
    cacheImage.src = src;
    cache.push(cacheImage);
  }
})(jQuery)

jQuery.fn.slideshow = function(options) {
  var cfg = jQuery.extend({
    fadeDuration: 2000,         // single slide fadein/fadeout duration
    showDelay:    0,           // delay of fadein effect
    interval:     3000,        // interval between slides
    pageElem:     '',          // element selector, if set used for page numbers
    mousePause:   false,       // mouseenter pauses slideshow?
    nextElem:     '',          // element selector for next slide button
    prevElem:     '',          // element selector for previous slide button
    onShow:       function (elem) {} // triggered on showing image
  }, options);

  var timer;
  var element = this;
  var current = 0;
  $('li', this).each(function(index, elem){
    if (cfg.pageElem != '') {
      $('<a/>', {
        href: "javascript:void(0)",
        click: function(){
          if (false == $(this).hasClass('selected'))
          {
            current = this.rel;
            show($('li', element).eq(this.rel));
          }
        },
        text: index+1,
        rel: index
      }).appendTo(cfg.pageElem);
    }
  });
  $('li', this).not(":eq(0)").hide();
  $('li', this).eq(0).show();
  if (cfg.pageElem != '') {
    $('a', cfg.pageElem).first().addClass('selected');
  }
  if (cfg.nextElem != '') {
    $(cfg.nextElem).click(function(){
      clearTimeout(timer);
      nextSlide();
      $(this).blur();
      return false;
    });
  }
  if (cfg.prevElem != '') {
    $(cfg.prevElem).click(function(){
      clearTimeout(timer);
      prevSlide();
      $(this).blur();
      return false;
    });
  }
  if (cfg.mousePause)
  {
    $(this).mouseenter(function(){
      clearTimeout(timer);
    });
    $(this).mouseleave(function(){
      timer = setTimeout(nextSlide, cfg.interval / 2);
    });
  }

  var showSlide = function(elem)
  {
    queue = $("li:visible", element).queue("fx");
	if (typeof queue != 'object' || queue.length > 0)return;
    var visible = $('li:visible', element);
    if (visible.get(0) == elem.get(0))return;
    visible.fadeOut(cfg.fadeDuration);
    $(elem).delay(cfg.showDelay).fadeIn(cfg.fadeDuration);
    cfg.onShow(elem);
    if (cfg.pageElem != '')
    {
      $('a', cfg.pageElem).removeClass('selected');
      $('a:eq(' + current + ')', cfg.pageElem).addClass('selected');
    }
    //clearTimeout(timer);
    //timer = setTimeout(nextSlide, 2*cfg.interval);
  }

  var nextSlide = function()
  {
    clearTimeout(timer);
    var next = $('li:visible', element).next();
    if(false == next.is('li')) {
      next = $('li:first', element);
      current = 0;
    } else {
      current++;
    }
    showSlide(next);
    if (cfg.interval)
      timer = setTimeout(nextSlide, cfg.interval);
  }
  var prevSlide = function()
  {
    clearTimeout(timer);
    var prev = $('li:visible', element).prev();
    if(false == prev.is('li')) {
      prev = $('li:last', element);
      current = $('li', element).size()-1;
    } else {
      current--;
    }
    showSlide(prev);
    if (cfg.interval)
      timer = setTimeout(nextSlide, cfg.interval);
  }
  if (cfg.interval)
    timer = setTimeout(nextSlide, cfg.interval);

  return showSlide;
}

