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

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).not(":eq(0)").hide();
  $('li', this).eq(0).show();

  var api = function()
  {

    var _this = this;
    if (cfg.nextElem != '') {
      $(cfg.nextElem).click(function(){
        clearTimeout(timer);
        _this.nextSlide();
        $(this).blur();
        return false;
      });
    }
    if (cfg.prevElem != '') {
      $(cfg.prevElem).click(function(){
        clearTimeout(timer);
        _this.prevSlide();
        $(this).blur();
        return false;
      });
    }
    if (cfg.mousePause)
    {
      $(this).mouseenter(function(){
        clearTimeout(timer);
      });
      $(this).mouseleave(function(){
        timer = setTimeout(_this.nextSlide, cfg.interval / 2);
      });
    }


    this.showSlide = function(elem)
    {
      _this._showSlide(elem);
      _this.resetTimer(2*cfg.interval);
    }

    this._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');
        }
    }

    this.resetTimer = function(interval)
    {
      if (interval)
      {
        if (timer)clearTimeout(timer);
        timer = setTimeout(_this.nextSlide, interval);
      }
    }

    this.nextSlide = function()
    {
      var next = $('li:visible', element).next();
      if(false == next.is('li')) {
        next = $('li:first', element);
        current = 0;
      } else {
        current++;
      }
      _this.showSlide(next);
      _this.resetTimer(cfg.interval);
    }
    this.prevSlide = function()
    {
      var prev = $('li:visible', element).prev();
      if(false == prev.is('li')) {
        prev = $('li:last', element);
        current = $('li', element).size()-1;
      } else {
        current--;
      }
      _this.showSlide(prev);
      _this.resetTimer(cfg.interval);
    }
    _this.resetTimer(cfg.interval);
  }
  return new api();
}

