jQuery(function(){
  initPlugins();
  initSlideShow();
});

function initPlugins(){
  clearFormFields({
    clearInputs: true,
    clearTextareas: true,
    passwordFieldText: false,
    addClassFocus: "focus",
    filterClass: "default"
  });
  jQuery('ul.tabset').jqueryTabs({
    addToParent:false,
    holdHeight:false,
    activeClass:'active',
    tabLinks:'a.tab',
    fadeSpeed:0
  });
  jQuery('div.gallery-box').fadeGallery({
    slideElements:'> ul > li',
    ie:false,
    pauseOnHover:true,
    autoRotation:true,
    switchTime:5000,
    duration:500,
    event:'click'
  });
}

// clear inputs js
function clearFormFields(o){
  if (o.clearInputs == null) o.clearInputs = true;
  if (o.clearTextareas == null) o.clearTextareas = true;
  if (o.passwordFieldText == null) o.passwordFieldText = false;
  if (o.addClassFocus == null) o.addClassFocus = false;
  if (!o.filterClass) o.filterClass = "default";
  if(o.clearInputs) {
    var inputs = document.getElementsByTagName("input");
    for (var i = 0; i < inputs.length; i++ ) {
      if((inputs[i].type == "text" || inputs[i].type == "password") && inputs[i].className.indexOf(o.filterClass) == -1) {
        inputs[i].valueHtml = inputs[i].value;
        inputs[i].onfocus = function ()  {
          if(this.valueHtml == this.value) this.value = "";
          if(this.fake) {
            inputsSwap(this, this.previousSibling);
            this.previousSibling.focus();
          }
          if(o.addClassFocus && !this.fake) {
            this.className += " " + o.addClassFocus;
            this.parentNode.className += " parent-" + o.addClassFocus;
          }
        }
        inputs[i].onblur = function () {
          if(this.value == "") {
            this.value = this.valueHtml;
            if(o.passwordFieldText && this.type == "password") inputsSwap(this, this.nextSibling);
          }
          if(o.addClassFocus) {
            this.className = this.className.replace(o.addClassFocus, "");
            this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
          }
        }
        if(o.passwordFieldText && inputs[i].type == "password") {
          var fakeInput = document.createElement("input");
          fakeInput.type = "text";
          fakeInput.value = inputs[i].value;
          fakeInput.className = inputs[i].className;
          fakeInput.fake = true;
          inputs[i].parentNode.insertBefore(fakeInput, inputs[i].nextSibling);
          inputsSwap(inputs[i], null);
        }
      }
    }
  }
  if(o.clearTextareas) {
    var textareas = document.getElementsByTagName("textarea");
    for(var i=0; i<textareas.length; i++) {
      if(textareas[i].className.indexOf(o.filterClass) == -1) {
        textareas[i].valueHtml = textareas[i].value;
        textareas[i].onfocus = function() {
          if(this.value == this.valueHtml) this.value = "";
          if(o.addClassFocus) {
            this.className += " " + o.addClassFocus;
            this.parentNode.className += " parent-" + o.addClassFocus;
          }
        }
        textareas[i].onblur = function() {
          if(this.value == "") this.value = this.valueHtml;
          if(o.addClassFocus) {
            this.className = this.className.replace(o.addClassFocus, "");
            this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
          }
        }
      }
    }
  }
  function inputsSwap(el, el2) {
    if(el) el.style.display = "none";
    if(el2) el2.style.display = "inline";
  }
}

// jquery tabs plugin
jQuery.fn.jqueryTabs = function(_options){
  // default options
  var _options = jQuery.extend({
    addToParent:false,
    holdHeight:false,
    activeClass:'active',
    tabLinks:'a.tab',
    fadeSpeed:300,
    event:'click'
  },_options);

  return this.each(function(){
    var _holder = jQuery(this);
    var _fadeSpeed = _options.fadeSpeed;
    var _activeClass = _options.activeClass;
    var _addToParent = _options.addToParent;
    var _holdHeight = _options.holdHeight;
    var _tabLinks = jQuery(_options.tabLinks, _holder);
    var _tabset = (_addToParent ? _tabLinks.parent() : _tabLinks);
    var _event = _options.event;
    var _animating = false;

    // tabs init
    _tabLinks.each(function(){
      var _tmpLink = jQuery(this);
      var _tmpTab = jQuery(_tmpLink.attr('href'));
      var _classItem = (_addToParent ? _tmpLink.parent() : _tmpLink);
      if(_tmpTab.length) {
        if(_classItem.hasClass(_activeClass)) _tmpTab.show();
        else _tmpTab.hide();
      }
      if(_holdHeight){_tmpTab.parent().css({height: _tmpTab.outerHeight(true)});}
    });

    // tab switcher
    function switchTab(_switcher) {
      if(!_animating) {
        var _link = jQuery(_switcher);
        var _newItem = (_addToParent ? _link.parent() : _link);
        var _newTab = jQuery(_link.attr('href'));
        if(_newItem.hasClass(_activeClass)) return;

        var _oldItem = jQuery(_addToParent ? _tabset : _tabLinks).filter('.'+_activeClass);
        var _oldTab = jQuery(jQuery(_addToParent ? _oldItem.children('a') : _oldItem).attr('href'));
        if(_newTab.length) {
          _animating = true;
          if(_oldItem.length) {
            _newItem.addClass(_activeClass);
            _oldItem.removeClass(_activeClass);

            var _parent = _oldTab.parent();
            if(_holdHeight) _parent.css({height:_newTab.outerHeight(true)});

            _oldTab.fadeOut(_fadeSpeed);
            _newTab.fadeIn(_fadeSpeed,function(){
              _animating = false;
            });
          } else {
            _newItem.addClass(_activeClass);
            _newTab.fadeIn(_fadeSpeed,function(){
              _animating = false;
            });
          }
        }
      }
    }

    // control
    _tabLinks.each(function(){
      jQuery(this).bind(_event,function(){
        switchTab(this);
        return false;
      });
    });
  });
}

// slideshow plugin
jQuery.fn.fadeGallery = function(_options){
  var _options = jQuery.extend({
    slideElements:'div.slideset > div',
    pagerLinks:'div.paging a',
    generatePagination:'div.paging',
    paginationUlClass:'switcher',
    switcherClasses:'',
    switcherClassTo:'a',
    currentNumSlide:'.count .current',
    indexOfNumsSlides:'.count .indexof',
    alwaysPutZero:true,
    btnPauseToSwitcher:'false',
    btnNext:'a.next',
    btnPrev:'a.prev',
    btnPlayPause:'a.play-pause',
    btnPlay:'a.play',
    btnPause:'a.pause',
    pausedClass:'paused',
    disabledClass: 'disabled',
    playClass:'playing',
    activeClass:'active',
    loadingClass:'ajax-loading',
    loadedClass:'slide-loaded',
    dynamicImageLoad:false,
    dynamicImageLoadAttr:'alt',
    ie:false,
    currentNum:false,
    allNum:false,
    startSlide:null,
    noCircle:false,
    pauseOnHover:true,
    autoRotation:false,
    autoHeight:false,
    onInit:false,
    onBeforeFade:false,
    onAfterFade:false,
    onChange:false,
    disableWhileAnimating:false,
    switchTime:3000,
    duration:650,
    event:'click'
  },_options);

  return this.each(function(){
    // gallery options
    if(this.slideshowInit) return; else this.slideshowInit;
    var _this = jQuery(this);
    var _slides = jQuery(_options.slideElements, _this);
    var _pagerLinks = jQuery(_options.pagerLinks, _this);
    var _generatePagination = jQuery(_options.generatePagination, _this);
    var _paginationUlClass = _options.paginationUlClass;
    var _switcherClasses = _options.switcherClasses;
    var _switcherClassTo = _options.switcherClassTo;
    var _currentNumSlide = jQuery(_options.currentNumSlide, _this);
    var _indexOfNumsSlides = jQuery(_options.indexOfNumsSlides, _this);
    var _alwaysPutZero = _options.alwaysPutZero;
    var _btnPauseToSwitcher = _options.btnPauseToSwitcher;
    var _btnPrev = jQuery(_options.btnPrev, _this);
    var _btnNext = jQuery(_options.btnNext, _this);
    var _btnPlayPause = jQuery(_options.btnPlayPause, _this);
    var _btnPause = jQuery(_options.btnPause, _this);
    var _btnPlay = jQuery(_options.btnPlay, _this);
    var _pauseOnHover = _options.pauseOnHover;
    var _dynamicImageLoad = _options.dynamicImageLoad;
    var _dynamicImageLoadAttr = _options.dynamicImageLoadAttr;
    var _ie = _options.ie;
    var _autoRotation = _options.autoRotation;
    var _activeClass = _options.activeClass;
    var _loadingClass = _options.loadingClass;
    var _loadedClass = _options.loadedClass;
    var _disabledClass = _options.disabledClass;
    var _pausedClass = _options.pausedClass;
    var _playClass = _options.playClass;
    var _autoHeight = _options.autoHeight;
    var _duration = _options.duration;
    var _switchTime = _options.switchTime;
    var _controlEvent = _options.event;
    var _currentNum = (_options.currentNum ? jQuery(_options.currentNum, _this) : false);
    var _allNum = (_options.allNum ? jQuery(_options.allNum, _this) : false);
    var _startSlide = _options.startSlide;
    var _noCycle = _options.noCircle;
    var _onChange = _options.onChange;
    var _onBeforeFade = _options.onBeforeFade;
    var _onAfterFade = _options.onAfterFade;
    var _onInit = _options.onInit;
    var _disableWhileAnimating = _options.disableWhileAnimating;
    
    if(_switcherClasses){_switcherClasses = _switcherClasses.split((/\s*,\s*/));}
    
    if(_ie && _ie != true){
      if(!(/[^0-9]/i).test(_ie)){
        if(jQuery.browser.msie && parseInt(jQuery.browser.version) == _ie){
          _duration = 0;
        }
      }else if(_ie.indexOf('!') != -1){
        _ie = _ie.replace(/[^0-9]/gi, '');
        if(jQuery.browser.msie && parseInt(jQuery.browser.version) != _ie){
          _duration = 0;
        }
      }else if(_ie.indexOf('>') != -1){
        _ie = _ie.replace(/[^0-9]/gi, '');
        if(jQuery.browser.msie && parseInt(jQuery.browser.version) > _ie){
          _duration = 0;
        }
      }else{
        _ie = _ie.replace(/[^0-9]/gi, '');
        if(jQuery.browser.msie && parseInt(jQuery.browser.version) < _ie){
          _duration = 0;
        }
      }
    }else if(_ie && jQuery.browser.msie){
      _duration = 0;
    }
    
    // gallery init
    var _anim = false;
    var _hover = false;
    var _prevIndex = 0;
    var _currentIndex = 0;
    var _slideCount = _slides.length;
    var _timer;
    var _switcherIndex = 0;
    if(_slideCount < 2) return;
    
    changeNum();
    function changeNum(){
      if(_currentNumSlide.length){
        if(_alwaysPutZero == false){
          _currentNumSlide.text(_currentIndex + 1);
        }else{
          if(_currentIndex + 1 < 10){
            var curIndNum = '0' + (_currentIndex + 1);
            _currentNumSlide.text(curIndNum);
          }
        }
      }
      if(_indexOfNumsSlides){
        if(_alwaysPutZero == false){
          _indexOfNumsSlides.text(_slides.length);
        }else{
          if(_slides.length < 10){
            var curIndNum = '0' + _slides.length;
            _indexOfNumsSlides.text(curIndNum);
          }
        }
      }
    }
    
    if(_generatePagination.length) {
      var list = $('<ul class="'+_paginationUlClass+'">');
      var classTagLi = '';
      var classTagA = '';
      for(var i=0; i<_slideCount; i++){
        if(_switcherClasses.length && _switcherClassTo == 'li'){
          classTagLi = ' class="'+_switcherClasses[_switcherIndex]+'"';
        }else if(_switcherClasses.length && _switcherClassTo == 'a'){
          classTagA = ' class="'+_switcherClasses[_switcherIndex]+'"';
        }
        $('<li'+classTagLi+'><a'+classTagA+' href="#">'+(i+1)+'</a></li>').appendTo(list);
        if(_switcherIndex < _switcherClasses.length -1){_switcherIndex++;}else{_switcherIndex = 0;}
      }
      _generatePagination.empty();
      list.appendTo(_generatePagination);
      if(_switcherClassTo.toLowerCase() == 'li'){
        _pagerLinks = list.children();
      }else{
        _pagerLinks = list.children().find('a');
      }
      if(_btnPauseToSwitcher == 'true'){_btnPause = list.children();}
    }
    
    _prevIndex = _slides.index(_slides.filter('.'+_activeClass));
    if(_prevIndex < 0) _prevIndex = _currentIndex = 0;
    else _currentIndex = _prevIndex;
    if(_startSlide != null) {
      if(_startSlide == 'random') _prevIndex = _currentIndex = Math.floor(Math.random()*_slideCount);
      else _prevIndex = _currentIndex = parseInt(_startSlide);
    }
    _slides.hide().eq(_currentIndex).show();
    if(_autoRotation) _this.removeClass(_pausedClass).addClass(_playClass);
    else _this.removeClass(_playClass).addClass(_pausedClass);


    // gallery control
    if(_btnPrev.length) {
      _btnPrev.bind(_controlEvent,function(){
        prevSlide();
        return false;
      });
    }
    if(_btnNext.length) {
      _btnNext.bind(_controlEvent,function(){
        nextSlide();
        return false;
      });
    }
    if(_pagerLinks.length) {
      _pagerLinks.each(function(_ind){
        jQuery(this).bind(_controlEvent,function(){
          if(_currentIndex != _ind) {
            if(_disableWhileAnimating && _anim) return;
            _prevIndex = _currentIndex;
            _currentIndex = _ind;
            switchSlide();
          }
          return false;
        });
      });
    }else{
      _this.bind(_controlEvent,function(){
        if(_disableWhileAnimating && _anim) return;
        _prevIndex = _currentIndex;
        if(_currentIndex < _slideCount-1) _currentIndex++;
        else {
          if(_noCycle) return;
          else _currentIndex = 0;
        }
        switchSlide();
      });
    }

    // play pause section
    if(_btnPlayPause.length) {
      _btnPlayPause.bind(_controlEvent,function(){
        if(_this.hasClass(_pausedClass)) {
          _this.removeClass(_pausedClass).addClass(_playClass);
          _autoRotation = true;
          autoSlide();
        } else {
          _autoRotation = false;
          if(_timer) clearTimeout(_timer);
          _this.removeClass(_playClass).addClass(_pausedClass);
        }
        return false;
      });
    }
    if(_btnPlay.length) {
      _btnPlay.bind(_controlEvent,function(){
        _this.removeClass(_pausedClass).addClass(_playClass);
        _autoRotation = true;
        autoSlide();
        return false;
      });
    }
    if(_btnPause.length) {
      _btnPause.bind(_controlEvent,function(){
        _autoRotation = false;
        if(_timer) clearTimeout(_timer);
        _this.removeClass(_playClass).addClass(_pausedClass);
        return false;
      });
    }

    // dynamic image loading (swap from ATTRIBUTE)
    function loadSlide(slide) {
      if(!slide.hasClass(_loadingClass) && !slide.hasClass(_loadedClass)) {
        var images = slide.find(_dynamicImageLoad) // pass selector here
        var imagesCount = images.length;
        if(imagesCount) {
          slide.addClass(_loadingClass);
          images.each(function(){
            var img = this;
            img.onload = function(){
              img.loaded = true;
              img.onload = null;
              setTimeout(reCalc,_duration);
            }
            img.setAttribute('src', img.getAttribute(_dynamicImageLoadAttr));
            img.setAttribute(_dynamicImageLoadAttr,'');
          }).css({opacity:0});

          function reCalc() {
            var cnt = 0;
            images.each(function(){
              if(this.loaded) cnt++;
            });
            if(cnt == imagesCount) {
              slide.removeClass(_loadingClass);
              images.animate({opacity:1},{duration:_duration,complete:function(){
                if(jQuery.browser.msie && jQuery.browser.version < 9) jQuery(this).css({opacity:'auto'})
              }});
              slide.addClass(_loadedClass)
            }
          }
        }
      }
    }

    // gallery animation
    function prevSlide() {
      if(_disableWhileAnimating && _anim) return;
      _prevIndex = _currentIndex;
      if(_currentIndex > 0) _currentIndex--;
      else {
        if(_noCycle) return;
        else _currentIndex = _slideCount-1;
      }
      switchSlide();
    }
    function nextSlide() {
      if(_disableWhileAnimating && _anim) return;
      _prevIndex = _currentIndex;
      if(_currentIndex < _slideCount-1) _currentIndex++;
      else {
        if(_noCycle) return;
        else _currentIndex = 0;
      }
      switchSlide();
    }
    function refreshStatus() {
      if(_dynamicImageLoad) loadSlide(_slides.eq(_currentIndex));
      if(_pagerLinks.length) _pagerLinks.removeClass(_activeClass).eq(_currentIndex).addClass(_activeClass);
      if(_currentNum) _currentNum.text(_currentIndex+1);
      if(_allNum) _allNum.text(_slideCount);
      _slides.eq(_prevIndex).removeClass(_activeClass);
      _slides.eq(_currentIndex).addClass(_activeClass);
      if(_noCycle) {
        if(_btnPrev.length) {
          if(_currentIndex == 0) _btnPrev.addClass(_disabledClass);
          else _btnPrev.removeClass(_disabledClass);
        }
        if(_btnNext.length) {
          if(_currentIndex == _slideCount-1) _btnNext.addClass(_disabledClass);
          else _btnNext.removeClass(_disabledClass);
        }
      }
      if(typeof _onChange === 'function') {
        _onChange(_this, _slides, _prevIndex, _currentIndex);
      }
    }
    function switchSlide() {
      _anim = true;
      if(typeof _onBeforeFade === 'function') _onBeforeFade(_this, _slides, _prevIndex, _currentIndex);
      _slides.eq(_prevIndex).fadeOut(_duration,function(){
        _anim = false;
      });
      _slides.eq(_currentIndex).fadeIn(_duration,function(){
        if(typeof _onAfterFade === 'function') _onAfterFade(_this, _slides, _prevIndex, _currentIndex);
      });
      if(_autoHeight) _slides.eq(_currentIndex).parent().animate({height:_slides.eq(_currentIndex).outerHeight(true)},{duration:_duration,queue:false});
      refreshStatus();
      autoSlide();
      changeNum();
    }

    // autoslide function
    function autoSlide() {
      if(!_autoRotation || _hover) return;
      if(_timer) clearTimeout(_timer);
      _timer = setTimeout(nextSlide,_switchTime+_duration);
    }
    if(_pauseOnHover) {
      _this.hover(function(){
        _hover = true;
        if(_timer) clearTimeout(_timer);
      },function(){
        _hover = false;
        autoSlide();
      });
    }
    jQuery(window).focus(function(){
      autoSlide();
    }).blur(function(){
      if(_timer) clearTimeout(_timer);
    });
    refreshStatus();
    autoSlide();
    
    _this.bind('setslide',function(e,h){
      if(_currentIndex != h.num) _prevIndex = _currentIndex;
      _currentIndex = h.num;
      switchSlide();
    })
  });
}

// slideShow
function initSlideShow(){
  jQuery('.item-box').each(function(){
    var _hold = jQuery(this),
      _slides = jQuery('> dl > dd', _hold).hide(),
      _prev = jQuery('.holder .gallery .link-prev', _hold),
      _next = jQuery('.holder .gallery .link-next', _hold),
      _step = _slides.filter('.active').index() != -1 ? _slides.filter('.active').index() : 0,
      _timer,
      _count = _slides.length - 1,
      _autoRotation = 3500,
      _pauseOnHover = false,
      _duration = 1000;
    _slides.eq(_step).show();
    function switchSlide(_index){
      _slides.stop().fadeOut(_duration, function(){
        _slides.eq(_index).fadeIn(_duration);
      });
    }
    function clickPrev(){
      if(_step > 0){
        _step--;
      }else{
        _step = _count;
      }
      switchSlide(_step);
      return false;
    }
    function clickNext(){
      if(_step < _count){
        _step++;
      }else{
        _step = 0;
      }
      switchSlide(_step);
      return false;
    }
    _prev.click(clickPrev);
    _next.click(clickNext);
    _hold.hover(function(){
      if(_pauseOnHover){
        clearInterval(_timer);
        _timer = false;
      }
    }, function(){
      if(_autoRotation){
        autoRotation();
      }
    });
    function autoRotation(){
      if(!_timer){
        _timer = setInterval(function(){
          clickNext();
        }, _autoRotation);
      }
    }
    if(_autoRotation){
      autoRotation();
    }
  });
}
