
var fadeAutoplay;

jQuery.fn.fadeGallery = function(_options){
    _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',
        btnDisable:'a.disable',
        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,
        pauseOnMouseEnter: 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(idx){
        // 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 _btnDisable = jQuery(_options.btnDisable);
        var _pauseOnHover = _options.pauseOnHover;
        var _pauseOnMouseEnter = _options.pauseOnMouseEnter;
        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;

            var curIndNum;
            changeNum();
            function changeNum(){
                if(_currentNumSlide.length){
                    if(_alwaysPutZero == false){
                        _currentNumSlide.text(_currentIndex + 1);
                    }else{
                        if(_currentIndex + 1 < 10){
                            curIndNum = '0' + (_currentIndex + 1);
                            _currentNumSlide.text(curIndNum);
                        }
                    }
                }
                if(_indexOfNumsSlides){
                    if(_alwaysPutZero == false){
                        _indexOfNumsSlides.text(_slides.length);
                    }else{
                        if(_slides.length < 10){
                            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 false;
                            _prevIndex = _currentIndex;
                            _currentIndex = _ind;
                            switchSlide();
                        }
                        return false;
                    });
                });
            }

            // play pause section
            if(_btnPlayPause.length) {
                _btnPlayPause.bind(_controlEvent,function(){
                    if(_this.hasClass(_pausedClass)) {
                        _this.removeClass(_pausedClass).addClass(_playClass);
                        _autoRotation = true;
                        fadeAutoplay = true;
                        // instantly go to the next slide as soon as play control is hit.
                        nextSlide();
//                        autoSlide();
                    } else {
                        _autoRotation = false;
                        fadeAutoplay = 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;
                    fadeAutoplay = true;
                    autoSlide();
                    return false;
                });
            }
            if(_btnPause.length) {
                _btnPause.bind(_controlEvent,function(){
                    _autoRotation = false;
                    fadeAutoplay = false;
                    if(_timer) clearTimeout(_timer);
                    _this.removeClass(_playClass).addClass(_pausedClass);
                    return false;
                });
            }
            
            /* Attach disabled handler */
           
            if(_btnDisable.length) {
               _btnDisable.bind('mouseleave',function(){
                   //console.log('leave');
//               _btnDisable.bind('mouseout',function(){

                    // Unblur
                    //unblurHeroImage(_slides.eq(_currentIndex), _currentIndex)

                    _this.removeClass(_pausedClass).addClass(_playClass);
                    //_this.removeClass('gallery-disabled');
                    _autoRotation = true;
                    fadeAutoplay = true;
                    autoSlide();
                    
                    return false;
               });
               
               // pause rotation. blur image.
               _btnDisable.bind('mouseenter',function(){
//               _btnDisable.bind('mouseover',function(){
                    //console.log('enter');
                   
                    _autoRotation = false;
                    fadeAutoplay = false;
                    if(_timer) clearTimeout(_timer);
                    _this.removeClass(_playClass).addClass(_pausedClass);
                    //_this.addClass('gallery-disabled');
                    
                    // Blur
                    //blurHeroImage(_slides.eq(_currentIndex), _currentIndex);
                    return false;
                });
            }
            
            this.disable = function(){
                _autoRotation = false;
                fadeAutoplay = false;
                if(_timer) clearTimeout(_timer);
                _this.removeClass(_playClass).addClass(_pausedClass);
                _this.addClass('gallery-disabled');
            }

            // 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();
                });
            }
            if(_pauseOnMouseEnter) {
                _this.bind('mouseenter', function(){
                    _hover = true;
                    if(_timer) clearTimeout(_timer);
                },function(){
                    _hover = false;
                    autoSlide();
                });
            }
            refreshStatus();
            autoSlide();
		
            _this.bind('setslide',function(e,h){
                if(_currentIndex != h.num) _prevIndex = _currentIndex;
                _currentIndex = h.num;
                switchSlide();
            })
        });
    }
