/*
	************* OPTIONS ************************************** default ****************
	btPrev         - link for previos [selector]    	btPrev: 'a.link-prev'
	btNext         - link for next [selector]		btNext: 'a.link-next'
	holderList     - image list holder [Tag name]		holderList: 'div'
	scrollElParent - list [Tag name]			scrollElParent: 'ul'
	scrollEl       - list element [Tag name]		scrollEl: 'li'
	slideNum       - view slide numbers [boolean]		slideNum: false
	duration       - duration slide [1000 - 1sec]		duration : 1000
	step           - slide step [int]			step: false
	circleSlide    - slide circle [boolean]			circleSlide: true
	disableClass   - class for disable link	[string] 	disableClass: 'disable'
	funcOnclick    - callback function			funcOnclick: null
	innerMargin    - inner margin, use width step [px]      innerMargin:0
	autoSlide      - auto slide [1000 - 1sec]               autoSlide:false
	*************************************************************************************
*/
jQuery.fn.galleryScroll = function(_options) {
    // defaults options	
    var _options = jQuery.extend({
        btPrev: 'a.link-prev',
        btNext: 'a.link-next',
        holderList: 'div',
        scrollElParent: 'ul',
        scrollEl: 'li',
        slideNum: false,
        duration: 1000,
        step: false,
        circleSlide: true,
        disableClass: 'disable',
        funcOnclick: null,
        autoSlide: false,
        innerMargin: 0,
        stepWidth: false,
        randomStep: true
    }, _options);

    return this.each(function() {
        var _this = jQuery(this);

        //if (_options.randomStep)
        //    _options.step = Math.floor(Math.random() * (jQuery(_options.scrollEl, _this).length + 1));
        
        var _gWidth = jQuery(_options.holderList, _this).width();
        var _liWidth = jQuery(_options.scrollEl, _this).outerWidth(true);
        var _liSum = jQuery(_options.scrollEl, _this).length * _liWidth;
        var _margin = -_options.innerMargin;
        var f = 0;
        var _step = 0;
        var _autoSlide = _options.autoSlide;
        var _timerSlide = null;
        if (!_options.step) _step = _gWidth; else _step = _options.step * _liWidth;
        if (_options.stepWidth) _step = _options.stepWidth;

        if (!_options.circleSlide) {
            if (_options.innerMargin == _margin)
                jQuery(_options.btPrev, _this).addClass(_options.disableClass);
        }
        if (_options.slideNum && !_options.step) {
            var _lastSection = 0;
            var _sectionWidth = 0;
            while (_sectionWidth < _liSum) {
                _sectionWidth = _sectionWidth + _gWidth;
                if (_sectionWidth > _liSum) {
                    _lastSection = _sectionWidth - _liSum;
                }
            }
        }
        if (_autoSlide) {
            _timerSlide = setTimeout(function() {
                autoSlide(_autoSlide);
            }, _autoSlide);
            jQuery(_options.scrollElParent, _this).hover(function() {
                clearTimeout(_timerSlide);
            }, function() {
                _timerSlide = setTimeout(function() {
                    autoSlide(_autoSlide)
                }, _autoSlide);
            });
        }

        // click button 'Next'
        jQuery(_options.btNext, _this).bind('click', function() {
            jQuery(_options.btPrev, _this).removeClass(_options.disableClass);
            if (!_options.circleSlide) {
                if (_margin + _step > _liSum - _gWidth - _options.innerMargin) {
                    if (_margin != _liSum - _gWidth - _options.innerMargin) {
                        _margin = _liSum - _gWidth + _options.innerMargin;
                        jQuery(_options.btNext, _this).addClass(_options.disableClass);
                        _f2 = 0;
                    }
                } else {
                    _margin = _margin + _step;
                    if (_margin == _liSum - _gWidth - _options.innerMargin) {
                        jQuery(_options.btNext, _this).addClass(_options.disableClass); _f2 = 0;
                    }
                }
            } else {
                if (_margin + _step > _liSum - _gWidth + _options.innerMargin) {
                    if (_margin != _liSum - _gWidth + _options.innerMargin) {
                        _margin = _liSum - _gWidth + _options.innerMargin;
                    } else {
                        _f2 = 1;
                        _margin = -_options.innerMargin;
                    }
                } else {
                    _margin = _margin + _step;
                    _f2 = 0;
                }
            }

            jQuery(_options.scrollElParent, _this).animate({ marginLeft: -_margin + "px" }, { queue: false, duration: _options.duration });

            if (_timerSlide) {
                clearTimeout(_timerSlide);
                _timerSlide = setTimeout(function() {
                    autoSlide(_options.autoSlide)
                }, _options.autoSlide);
            }

            if (_options.slideNum && !_options.step) jQuery.fn.galleryScroll.numListActive(_margin, jQuery(_options.slideNum, _this), _gWidth, _lastSection);
            if (jQuery.isFunction(_options.funcOnclick)) {
                _options.funcOnclick.apply(_this);
            }
            return false;
        });
        // click button 'Prev'
        var _f2 = 1;
        jQuery(_options.btPrev, _this).bind('click', function() {
            jQuery(_options.btNext, _this).removeClass(_options.disableClass);
            if (_margin - _step >= -_step - _options.innerMargin && _margin - _step <= -_options.innerMargin) {
                if (_f2 != 1) {
                    _margin = -_options.innerMargin;
                    _f2 = 1;
                } else {
                    if (_options.circleSlide) {
                        _margin = _liSum - _gWidth + _options.innerMargin;
                        f = 1; _f2 = 0;
                    } else {
                        _margin = -_options.innerMargin
                    }
                }
            } else if (_margin - _step < -_step + _options.innerMargin) {
                _margin = _margin - _step;
                f = 0;
            }
            else { _margin = _margin - _step; f = 0; };

            if (!_options.circleSlide && _margin == _options.innerMargin) {
                jQuery(this).addClass(_options.disableClass);
                _f2 = 0;
            }

            if (!_options.circleSlide && _margin == -_options.innerMargin) jQuery(this).addClass(_options.disableClass);
            jQuery(_options.scrollElParent, _this).animate({ marginLeft: -_margin + "px" }, { queue: false, duration: _options.duration });

            if (_options.slideNum && !_options.step) jQuery.fn.galleryScroll.numListActive(_margin, jQuery(_options.slideNum, _this), _gWidth, _lastSection);

            if (_timerSlide) {
                clearTimeout(_timerSlide);
                _timerSlide = setTimeout(function() {
                    autoSlide(_options.autoSlide)
                }, _options.autoSlide);
            }

            if (jQuery.isFunction(_options.funcOnclick)) {
                _options.funcOnclick.apply(_this);
            }
            return false;
        });

        if (_liSum <= _gWidth) {
            jQuery(_options.btPrev, _this).addClass(_options.disableClass).unbind('click');
            jQuery(_options.btNext, _this).addClass(_options.disableClass).unbind('click');
        }
        // auto slide
        function autoSlide(autoSlideDuration) {
            //if (_options.circleSlide) {
            if (_liSum - _step <= _margin + _step - _options.innerMargin) {
                if (f == 0) {
                    _margin = _liSum - _gWidth + _options.innerMargin;
                    f = 1; _f2 = 0;
                    if (!_options.circleSlide)
                        jQuery(_options.btPrev, _this).addClass(_options.disableClass);
                }
                else {
                    if (_options.circleSlide)
                        _margin = _options.innerMargin;
                    f = 0; _f2 = 0;
                }
            } else _margin = _margin + _step;

            jQuery(_options.scrollElParent, _this).animate({ marginLeft: -_margin + "px" }, { queue: false, duration: _options.duration });

            _timerSlide = setTimeout(function() {
                autoSlide(_options.autoSlide)
            }, _options.autoSlide);
            jQuery.fn.galleryScroll.numListActive(_margin, jQuery(_options.slideNum, _this), _gWidth, _lastSection);
            //}
        };
        // Number list
        jQuery.fn.galleryScroll.numListCreate = function(_elNumList, _liSumWidth, _width, _section) {
            var _numListElC = '';
            var _num = 1;
            var _difference = _liSumWidth + _section;
            while (_difference > 0) {
                _numListElC += '<li><a href=""><span>' + _num + '</span></a></li>';
                _num++;
                _difference = _difference - _width;
            }
            jQuery(_elNumList).html('<ul class="slide-arrow">' + _numListElC + '</ul>');
        };
        jQuery.fn.galleryScroll.numListActive = function(_marginEl, _slideNum, _width, _section) {
            if (_slideNum) {
                jQuery('a', _slideNum).parent().removeClass('active');
                var _activeRange = _width - _section - 1;
                var _n = 0;
                if (_marginEl != 0) {
                    while (_marginEl > _activeRange) {
                        _activeRange = (_n * _width) - _section - 1 + _options.innerMargin;
                        _n++;
                    }
                }
                var _a = (_activeRange + _section + 1 + _options.innerMargin) / _width - 1;
                jQuery('a', _slideNum).eq(_a).parent().addClass('active');
            }
        };
        if (_options.slideNum && !_options.step) {
            jQuery.fn.galleryScroll.numListCreate(jQuery(_options.slideNum, _this), _liSum, _gWidth, _lastSection);
            jQuery.fn.galleryScroll.numListActive(_margin, jQuery(_options.slideNum, _this), _gWidth, _lastSection);
            numClick();
        };
        function numClick() {
            jQuery(_options.slideNum, _this).find('a').click(function() {
                jQuery(_options.btPrev, _this).removeClass(_options.disableClass);
                jQuery(_options.btNext, _this).removeClass(_options.disableClass);

                var _indexNum = jQuery(_options.slideNum, _this).find('a').index(jQuery(this));
                _margin = (_step * _indexNum) - _options.innerMargin;
                f = 0; _f2 = 0;
                if (_indexNum == 0) _f2 = 1;
                if (_margin + _step > _liSum) {
                    _margin = _margin - (_margin - _liSum) - _step + _options.innerMargin;
                    if (!_options.circleSlide) jQuery(_options.btNext, _this).addClass(_options.disableClass);
                }
                jQuery(_options.scrollElParent, _this).animate({ marginLeft: -_margin + "px" }, { queue: false, duration: _options.duration });

                if (!_options.circleSlide && _margin == 0) jQuery(_options.btPrev, _this).addClass(_options.disableClass);
                jQuery.fn.galleryScroll.numListActive(_margin, jQuery(_options.slideNum, _this), _gWidth, _lastSection);

                if (_timerSlide) {
                    clearTimeout(_timerSlide);
                    _timerSlide = setTimeout(function() {
                        autoSlide(_options.autoSlide)
                    }, _options.autoSlide);
                }
                return false;
            });
        };
        jQuery(window).resize(function() {
            _gWidth = jQuery(_options.holderList, _this).width();
            _liWidth = jQuery(_options.scrollEl, _this).outerWidth(true);
            _liSum = jQuery(_options.scrollEl, _this).length * _liWidth;
            if (!_options.step) _step = _gWidth; else _step = _options.step * _liWidth;
            if (_options.slideNum && !_options.step) {
                var _lastSection = 0;
                var _sectionWidth = 0;
                while (_sectionWidth < _liSum) {
                    _sectionWidth = _sectionWidth + _gWidth;
                    if (_sectionWidth > _liSum) {
                        _lastSection = _sectionWidth - _liSum;
                    }
                };
                jQuery.fn.galleryScroll.numListCreate(jQuery(_options.slideNum, _this), _liSum, _gWidth, _lastSection);
                jQuery.fn.galleryScroll.numListActive(_margin, jQuery(_options.slideNum, _this), _gWidth, _lastSection);
                numClick();
            };
            if (_margin == _options.innerMargin) jQuery(this).addClass(_options.disableClass);
            if (_liSum - _gWidth < _margin - _options.innerMargin) {
                if (!_options.circleSlide) jQuery(_options.btNext, _this).addClass(_options.disableClass);
                jQuery(_options.scrollElParent, _this).animate({ marginLeft: -(_liSum - _gWidth + _options.innerMargin) + "px" }, { queue: false, duration: _options.duration });
            };
        });
    });
}


