jQuery.fn.slideShow = function(_options){
  // defaults options
  var _options = jQuery.extend({
    slideEl:'div.img-hold img',
    linkNext:'a.next',
    linkPrev:'a.prev',
    linkPause:'a.pause',
    numElementLink:'div.nav li a',
    duration:500,
    autoSlideShow:false,
    switchTime:3000,
    event:'click',
    currentEl:'#footer span.cur',
    allEl:'#footer span.all'
  },_options);

  return this.each(function(){
    var _THIS = jQuery(this);
    var _slideEl = $(_options.slideEl, _THIS);
    var _elTagName = _options.slideEl;
    var _linkNext = $(_options.linkNext, _THIS).length ? $(_options.linkNext, _THIS) : false;
    var _linkPrev = $(_options.linkPrev, _THIS).length ? $(_options.linkPrev, _THIS) : false;
    var _linkPause = $(_options.linkPause, _THIS).length ? $(_options.linkPause, _THIS) : false;
    var _numElementLink = $(_options.numElementLink, _THIS).length ? $(_options.numElementLink, _THIS) : false;
    var _numElement = $(_options.numElementLink, _THIS).length ? _numElementLink.parent() : false;
    var _duration = _options.duration;
    var _switchTime = _options.switchTime;
    var _numElActive, _n, _timer = false, _hover = false;
    
    if (!_slideEl.filter('.active').length)
        _slideEl.eq(0).addClass('active');
        
    $(_slideEl).not(".active").css('display','none');
    
    if ($(_numElement).length) {activeNumEl()}
    
    if (_options.autoSlideShow) {
        _timer = setTimeout(function(){nextEl()},_switchTime);
        contentHover();
    }
    if (_linkNext) {
        $(_linkNext).click(function(){
            if (_timer) {
                clearTimeout(_timer);
                _timer = setTimeout(function(){nextEl()},_switchTime);
            }
            if ($(_slideEl).filter(".active").next().is(_elTagName)) {
              $(_slideEl).filter(".active").next().addClass("next");
            } else {
              $(_slideEl).eq(0).addClass("next");
            }
            fadeElement();
            activeNumEl();
            return false;
        });
    }
    if (_linkPrev) {  
        $(_linkPrev).click(function(){
            if (_timer) {
                clearTimeout(_timer);
                _timer = setTimeout(function(){nextEl()},_switchTime);
            }
            if ($(_slideEl).filter(".active").prev().is(_elTagName)) {
              $(_slideEl).filter(".active").prev().addClass("next");
            } else {
              $(_slideEl).filter(":last-child").addClass("next");
            }
            fadeElement();
            activeNumEl();
            return false;
        });
    }
    if (_linkPause) {  
        if (!_options.autoSlideShow) {
          _linkPause.addClass('play');
          _options.autoSlideShow = true;
          if (!_hover) contentHover();
        }
        $(_linkPause).click(function(){
            if (!_linkPause.is('.play')) {
              clearTimeout(_timer);
              _linkPause.addClass('play');
            } else {
              _linkPause.removeClass('play');
              _timer = setTimeout(function(){nextEl()},_switchTime);
            }
            return false;
        });
    }
    if (_numElementLink) {
        $(_numElementLink).bind(_options.event, function(){
            if (_timer) {
                clearTimeout(_timer);
                _timer = setTimeout(function(){nextEl()},_switchTime);
            }
            _n = _numElement.index($(this).parent());
            if (!$(_slideEl).eq(_n).hasClass("active")){
              $(_slideEl).eq(_n).addClass("next");
              fadeElement();
              activeNumEl();
            }
            return false;
        });
    }
    if (_options.currentEl || _options.allEl) {
        _THIS.all = _slideEl.length;
        $(_options.allEl, _THIS).html(_THIS.all);
        function currentNum() {
          var _index = _slideEl.index(_slideEl.filter('.active')) + 1;
          $(_options.currentEl, _THIS).html(_index);
        }
        currentNum();
    }
    function contentHover() {
      _hover = true;
      _slideEl.hover(function() {
          if (_timer) clearTimeout(_timer);
      }, function(){
          if (_linkPause && !_linkPause.is('.play'))
            _timer = setTimeout(function(){nextEl()},_switchTime);
          else if (!_linkPause)
            _timer = setTimeout(function(){nextEl()},_switchTime);
      });      
    }
    function nextEl(){
        if ($(_slideEl).filter(".active").next().is(_elTagName)){
          $(_slideEl).filter(".active").next().addClass("next");
        } else {
          $(_slideEl).eq(0).addClass("next");
        }
        fadeElement();
        activeNumEl();
        _timer = setTimeout(function(){nextEl()},_switchTime);
    };    
    function activeNumEl() {
        $(_numElement).removeClass("active");
        _numElActive = $(_slideEl).index($(_slideEl).filter(".active")[0]);
        $(_numElement).eq(_numElActive).addClass("active");
    };
    function fadeElement(){
        $(_slideEl).filter(".active").fadeOut(_duration).removeClass("active");
        $(_slideEl).filter(".next").fadeIn(_duration).addClass("active").removeClass("next");
        if (_options.currentEl || _options.allEl) currentNum();
    };
  });
}


