jQuery(function(){
    initGalleries();
});

// init gallery
function initGalleries(){
    $('.carousel').scrollGallery({
        autoRotation:true,
        switchTime:5000,
        duration:650
    });
    $('.slider-gallery').fadeGallery({
        autoRotation:true,
        switchTime:3000,
        duration:650
    });
}

// slideshow plugin
jQuery.fn.fadeGallery = function(_options){
    var _options = jQuery.extend({
        slideElements:'.slider > li',
        pagerLinks:'div.switcher li',
        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',
        currentNum:false,
        allNum:false,
        startSlide:0,
        noCircle:false,
        pauseOnHover:true,
        autoRotation:false,
        autoHeight: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 _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 _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 _disableWhileAnimating = _options.disableWhileAnimating;

        // gallery init
        var _anim = false;
        var _hover = false;
        var _prevIndex = 0;
        var _currentIndex = 0;
        var _slideCount = _slides.length;
        var _timer;
        if(_slideCount < 2) return;

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

        // 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).stop().animate({opacity:0},{
                duration:_duration,
                complete:function(){
                    _anim = false;
                    _slides.eq(_prevIndex).hide();
                }
            });
            _slides.eq(_currentIndex).css({display:'block',opacity:0}).stop().animate({opacity:1},{
                duration:_duration,
                complete: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();
        }

        // autoslide function
        function autoSlide() {
            if(!_autoRotation || _hover) return;
            if(_timer) clearTimeout(_timer);
            _timer = setTimeout(nextSlide,_switchTime+_duration);
        }
        if(_pauseOnHover) {
            _pagerLinks.hover(function(){
                _hover = true;
                if(_timer) clearTimeout(_timer);
            },function(){
                _hover = false;
                autoSlide();
            });
            _this.hover(function(){
                _hover = true;
                if(_timer) clearTimeout(_timer);
            },function(){
                _hover = false;
                autoSlide();
            });
        }
        refreshStatus();
        autoSlide();
    });
}

// scrolling gallery plugin
jQuery.fn.scrollGallery = function(_options){
    var _options = jQuery.extend({
        sliderHolder: '.holder',
        slider:'>ul',
        slides: '>li',
        pagerLinks:'div.pager a',
        btnPrev:'a.prev',
        btnNext:'a.next',
        activeClass:'active',
        disabledClass:'disabled',
        generatePagination:'div.pg-holder',
        curNum:'em.scur-num',
        allNum:'em.sall-num',
        circleSlide:true,
        pauseClass:'gallery-paused',
        pauseButton:'none',
        pauseOnHover:true,
        autoRotation:true,
        stopAfterClick:false,
        switchTime:5000,
        duration:650,
        easing:'swing',
        event:'click',
        splitCount:false,
        afterInit:false,
        vertical:false,
        step:false
    },_options);

    return this.each(function(){
        // gallery options
        var _this = jQuery(this);
        var _sliderHolder = jQuery(_options.sliderHolder, _this);
        var _slider = jQuery(_options.slider, _sliderHolder);
        var _slides = jQuery(_options.slides, _slider);
        var _btnPrev = jQuery(_options.btnPrev, _this);
        var _btnNext = jQuery(_options.btnNext, _this);
        var _pagerLinks = jQuery(_options.pagerLinks, _this);
        var _generatePagination = jQuery(_options.generatePagination, _this);
        var _curNum = jQuery(_options.curNum, _this);
        var _allNum = jQuery(_options.allNum, _this);
        var _pauseButton = jQuery(_options.pauseButton, _this);
        var _pauseOnHover = _options.pauseOnHover;
        var _pauseClass = _options.pauseClass;
        var _autoRotation = _options.autoRotation;
        var _activeClass = _options.activeClass;
        var _disabledClass = _options.disabledClass;
        var _easing = _options.easing;
        var _duration = _options.duration;
        var _switchTime = _options.switchTime;
        var _controlEvent = _options.event;
        var _step = _options.step;
        var _vertical = _options.vertical;
        var _circleSlide = _options.circleSlide;
        var _stopAfterClick = _options.stopAfterClick;
        var _afterInit = _options.afterInit;
        var _splitCount = _options.splitCount;

        // gallery init
        if(!_slides.length) return;

        if(_splitCount) {
            var curStep = 0;
            var newSlide = $('<slide>').addClass('split-slide');
            _slides.each(function(){
                newSlide.append(this);
                curStep++;
                if(curStep > _splitCount-1) {
                    curStep = 0;
                    _slider.append(newSlide);
                    newSlide = $('<slide>').addClass('split-slide');
                }
            });
            if(curStep) _slider.append(newSlide);
            _slides = _slider.children();
        }

        var _currentStep = 0;
        var _sumWidth = 0;
        var _sumHeight = 0;
        var _hover = false;
        var _stepWidth;
        var _stepHeight;
        var _stepCount;
        var _offset;
        var _timer;

        _slides.each(function(){
            _sumWidth+=$(this).outerWidth(true);
            _sumHeight+=$(this).outerHeight(true);
        });

        // calculate gallery offset
        function recalcOffsets() {
            if(_vertical) {
                if(_step) {
                    _stepHeight = _slides.eq(_currentStep).outerHeight(true);
                    _stepCount = Math.ceil((_sumHeight-_sliderHolder.height())/_stepHeight)+1;
                    _offset = -_stepHeight*_currentStep;
                } else {
                    _stepHeight = _sliderHolder.height();
                    _stepCount = Math.ceil(_sumHeight/_stepHeight);
                    _offset = -_stepHeight*_currentStep;
                    if(_offset < _stepHeight-_sumHeight) _offset = _stepHeight-_sumHeight;
                }
            } else {
                if(_step) {
                    _stepWidth = _slides.eq(_currentStep).outerWidth(true)*_step;
                    _stepCount = Math.ceil((_sumWidth-_sliderHolder.width())/_stepWidth)+1;
                    _offset = -_stepWidth*_currentStep;
                    if(_offset < _sliderHolder.width()-_sumWidth) _offset = _sliderHolder.width()-_sumWidth;
                } else {
                    _stepWidth = _sliderHolder.width();
                    _stepCount = Math.ceil(_sumWidth/_stepWidth);
                    _offset = -_stepWidth*_currentStep;
                    if(_offset < _stepWidth-_sumWidth) _offset = _stepWidth-_sumWidth;
                }
            }
        }

        // gallery control
        if(_btnPrev.length) {
            _btnPrev.bind(_controlEvent,function(){
                if(_stopAfterClick) stopAutoSlide();
                prevSlide();
                return false;
            });
        }
        if(_btnNext.length) {
            _btnNext.bind(_controlEvent,function(){
                if(_stopAfterClick) stopAutoSlide();
                nextSlide();
                return false;
            });
        }
        if(_generatePagination.length) {
            _generatePagination.empty();
            recalcOffsets();
            var _list = $('<ul />');
            for(var i=0; i<_stepCount; i++) $('<li><a href="#">'+(i+1)+'</a></li>').appendTo(_list);
            _list.appendTo(_generatePagination);
            _pagerLinks = _list.children();
        }
        if(_pagerLinks.length) {
            _pagerLinks.each(function(_ind){
                jQuery(this).bind(_controlEvent,function(){
                    if(_currentStep != _ind) {
                        if(_stopAfterClick) stopAutoSlide();
                        _currentStep = _ind;
                        switchSlide();
                    }
                    return false;
                });
            });
        }

        // gallery animation
        function prevSlide() {
            recalcOffsets();
            if(_currentStep > 0) _currentStep--;
            else if(_circleSlide) _currentStep = _stepCount-1;
            switchSlide();
        }
        function nextSlide() {
            recalcOffsets();
            if(_currentStep < _stepCount-1) _currentStep++;
            else if(_circleSlide) _currentStep = 0;
            switchSlide();
        }
        function refreshStatus() {
            if(_pagerLinks.length) _pagerLinks.removeClass(_activeClass).eq(_currentStep).addClass(_activeClass);
            if(!_circleSlide) {
                _btnPrev.removeClass(_disabledClass);
                _btnNext.removeClass(_disabledClass);
                if(_currentStep == 0) _btnPrev.addClass(_disabledClass);
                if(_currentStep == _stepCount-1) _btnNext.addClass(_disabledClass);
            }
            if(_curNum.length) _curNum.text(_currentStep+1);
            if(_allNum.length) _allNum.text(_stepCount);
        }
        function switchSlide() {
            recalcOffsets();
            if(_vertical) _slider.animate({marginTop:_offset},{duration:_duration,queue:false,easing:_easing});
            else _slider.animate({marginLeft:_offset},{duration:_duration,queue:false,easing:_easing});
            refreshStatus();
            autoSlide();
        }

        // autoslide function
        function stopAutoSlide() {
            if(_timer) clearTimeout(_timer);
            _autoRotation = false;
        }
        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();
            });
        }
        recalcOffsets();
        refreshStatus();
        autoSlide();

        // pause buttton
        if(_pauseButton.length) {
            _pauseButton.click(function(){
                if(_this.hasClass(_pauseClass)) {
                    _this.removeClass(_pauseClass);
                    _autoRotation = true;
                    autoSlide();
                } else {
                    _this.addClass(_pauseClass);
                    stopAutoSlide();
                }
                return false;
            });
        }

        if(_afterInit && typeof _afterInit === 'function') _afterInit(_this, _slides);
    });
}

// browser detect script
browserDetect = {
    matchGroups: [
        [
            {uaString:'win', className:'win'},
            {uaString:'mac', className:'mac'},
            {uaString:['linux','x11'], className:'linux'}
        ],
        [
            {uaString:'msie', className:'trident'},
            {uaString:'applewebkit', className:'webkit'},
            {uaString:'gecko', className:'gecko'},
            {uaString:'opera', className:'presto'}
        ],
        [
            {uaString:'msie 9.0', className:'ie'},
            {uaString:'msie 8.0', className:'ie'},
            {uaString:'msie 7.0', className:'ie'},
            {uaString:'msie 6.0', className:'ie6'},
            {uaString:'firefox/2', className:'ff2'},
            {uaString:'firefox/3', className:'ff3'},
            {uaString:'firefox/4', className:'ff4'},
            {uaString:['opera','version/11'], className:'opera11'},
            {uaString:['opera','version/10'], className:'opera10'},
            {uaString:'opera/9', className:'opera9'},
            {uaString:['safari','version/3'], className:'safari3'},
            {uaString:['safari','version/4'], className:'safari4'},
            {uaString:['safari','version/5'], className:'safari5'},
            {uaString:'chrome', className:'chrome'},
            {uaString:'safari', className:'safari2'},
            {uaString:'unknown', className:'unknown'}
        ]
    ],
    init: function() {
        this.detect();
        return this;
    },
    addClass: function(className) {
        this.pageHolder = document.documentElement;
        document.documentElement.className += ' '+className;
    },
    detect: function() {
        for(var i = 0, curGroup; i < this.matchGroups.length; i++) {
            curGroup = this.matchGroups[i];
            for(var j = 0, curItem; j < curGroup.length; j++) {
                curItem = curGroup[j];
                if(typeof curItem.uaString === 'string') {
                    if(this.uaMatch(curItem.uaString)) {
                        this.addClass(curItem.className);
                        break;
                    }
                } else {
                    for(var k = 0, allMatch = true; k < curItem.uaString.length; k++) {
                        if(!this.uaMatch(curItem.uaString[k])) {
                            allMatch = false;
                            break;
                        }
                    }
                    if(allMatch) {
                        this.addClass(curItem.className);
                        break;
                    }
                }
            }
        }
    },
    uaMatch: function(s) {
        if(!this.ua) {
            this.ua = navigator.userAgent.toLowerCase();
        }
        return this.ua.indexOf(s) != -1;
    }
}.init();
// mobile browsers detect
browserPlatform = {
    platforms: [
        { uaString:['symbian','midp'], cssFile:'symbian.css' }, // Symbian phones
        { uaString:['opera','mobi'], cssFile:'opera.css' }, // Opera Mobile
        { uaString:['msie','ppc'], cssFile:'ieppc.css' }, // IE Mobile <6
        { uaString:'iemobile', cssFile:'iemobile.css' }, // IE Mobile 6+
        { uaString:'webos', cssFile:'webos.css' }, // Palm WebOS
        { uaString:'Android', cssFile:'android.css' }, // Android
        { uaString:['BlackBerry','/6.0','mobi'], cssFile:'blackberry6.css' },    // Blackberry 6
        { uaString:['BlackBerry','/7.0','mobi'], cssFile:'blackberry7.css' },    // Blackberry 7+
        { uaString:'ipad', cssFile:'ipad.css', miscHead:'<meta name="viewport" content="width=device-width" />' }, // iPad
        { uaString:['safari','mobi'], cssFile:'safari.css', miscHead:'<meta name="viewport" content="width=device-width" />' } // iPhone and other webkit browsers
    ],
    options: {
        cssPath:'css/',
        mobileCSS:'allmobile.css'
    },
    init:function(){
        this.checkMobile();
        this.parsePlatforms();
        return this;
    },
    checkMobile: function() {
        if(this.uaMatch('mobi') || this.uaMatch('midp') || this.uaMatch('ppc') || this.uaMatch('webos')) {
            this.attachStyles({cssFile:this.options.mobileCSS});
        }
    },
    parsePlatforms: function() {
        for(var i = 0; i < this.platforms.length; i++) {
            if(typeof this.platforms[i].uaString === 'string') {
                if(this.uaMatch(this.platforms[i].uaString)) {
                    this.attachStyles(this.platforms[i]);
                    break;
                }
            } else {
                for(var j = 0, allMatch = true; j < this.platforms[i].uaString.length; j++) {
                    if(!this.uaMatch(this.platforms[i].uaString[j])) {
                        allMatch = false;
                    }
                }
                if(allMatch) {
                    this.attachStyles(this.platforms[i]);
                    break;
                }
            }
        }
    },
    attachStyles: function(platform) {
        var head = document.getElementsByTagName('head')[0], fragment;
        var cssText = '<link rel="stylesheet" href="' + this.options.cssPath + platform.cssFile + '" type="text/css"/>';
        var miscText = platform.miscHead;
        if(platform.cssFile) {
            if(document.body) {
                fragment = document.createElement('div');
                fragment.innerHTML = cssText;
                head.appendChild(fragment.childNodes[0]);
            } else {
                document.write(cssText);
            }
        }
        if(platform.miscHead) {
            if(document.body) {
                fragment = document.createElement('div');
                fragment.innerHTML = miscText;
                head.appendChild(fragment.childNodes[0]);
            } else {
                document.write(miscText);
            }
        }
    },
    uaMatch:function(str) {
        if(!this.ua) {
            this.ua = navigator.userAgent.toLowerCase();
        }
        return this.ua.indexOf(str.toLowerCase()) != -1;
    }
}.init();
