jQuery.fn.vvGalleryScroll = function(_options){
	// defaults options	
	var _options = $.extend({
		btnPrev: 'a.link-prev',
		btnNext: 'a.link-next',
		holderList: 'div',
		scrollElParent: 'ul',
		scrollEl: 'li',
		thumbs: false,
		thumbsCreate: false,
		duration : 700,
		step: false,
		pause: false,
		event: 'click',
		circleSlide: true,
		disableClass: 'disable',
		autoSlide:false,
		onBeforeChange: null,
		onBuild: null,
		onChange: null
	},_options);

	return this.each(function(){
		var _this = this;

		var _holderBlock = $(_options.holderList,_this);
		var _moover = $(_options.scrollElParent,_holderBlock).css('position','relative');
		var _liWidth = $(_options.scrollEl,_moover).outerWidth(true);
		var _gWidth = _holderBlock.width();
		var _liSum = $(_options.scrollEl,_moover).length * _liWidth;
		var _thumbs = _options.thumbs ? ($(_options.thumbs,_this).length ? $(_options.thumbs,_this): false) : false;
		var _step = 0, _t = null, _mM=0;
		var _pause =  _options.pause ? $(_options.pause,_this) : false;
		var _play = _options.play ? $(_options.play,_this) : false;
		var _a = 0;
		if(_options.thumbsCreate){
			var _html = '<ul>';
			for(var i=0; i<$(_options.scrollEl,_moover).length; i++) {
				_html+='<li><a href="#">'+(i+1)+'</a></li>';
			};
			_html += '</ul>';
			_thumbs.html(_html);
			_thumbs = _thumbs.find('a');
		}
		if(_thumbs) _thumbs.removeClass('active').eq(_a).addClass('active');
//step
		if(typeof(_options.step)=='number') _step = _options.step;
		else if (!_options.step) _step = _gWidth; else _step = _options.step*_liWidth;
		if(!_options.circleSlide){
			if(_mM == 0) $(_options.btnPrev,_this).addClass(_options.disableClass);
			else if(_mM ==_liSum-_gWidth) $(_options.btnNext,_this).addClass(_options.disableClass);
		};
//prev btn
		if($(_options.btnPrev, _this)){
			$(_options.btnPrev, _this).bind(_options.event, function(){
				if(!$(this).hasClass(_options.disableClass)){
					$(_options.btnNext,_this).removeClass(_options.disableClass);
					if(_mM - _step<0) (_mM!=0) ? _mM=0 : (_options.circleSlide ? _mM = _liSum - _gWidth : $(_options.btnPrev,_this).addClass(_options.disableClass));
					else _mM -= _step;
					if(_a!= 0) _a--;
					else _a =$(_options.scrollEl,_moover).length-1;
					_this.rotate(_mM);
				}
				return false;
			});
		};
//next btn
		if($(_options.btnNext, _this)){
			$(_options.btnNext, _this).bind(_options.event, function(){
				if(!$(this).hasClass(_options.disableClass)){
					$(_options.btnPrev,_this).removeClass(_options.disableClass);
					if(_mM + _step >_liSum - _gWidth) (_mM!= _liSum - _gWidth) ? (_mM = _liSum - _gWidth) : (_options.circleSlide ? _mM = 0 : $(_options.btnNext,_this).addClass(_options.disableClass));
					else _mM += _step;
					if(_a!= $(_options.scrollEl,_moover).length-1) _a++;
					else _a =0;
					_this.rotate(_mM);
				}
				return false;
			});
		};
//animate
		_this.rotate = function(_mM){
			if(_t) clearTimeout(_t);
			if ($.isFunction(_options.onBeforeChange)) {
				_options.onBeforeChange.apply(_this);
			}
			if(!_options.circleSlide){
				if(_mM == 0) $(_options.btnPrev,_this).addClass(_options.disableClass);
				else if(_mM ==_liSum-_gWidth) $(_options.btnNext,_this).addClass(_options.disableClass);
			};
			if(_thumbs) _thumbs.removeClass('active').eq(_a).addClass('active');
			_moover.animate({left: -_mM},{duration: _options.duration, queue: false, complete: function(){
				if ($.isFunction(_options.onChange)) {
					_options.onChange.apply([_this, $(_options.scrollEl,_moover), _a]);
				}
				_this.autoslide();
			}});
		};
//autoslide
		_this.autoslide = function(){
			if(_options.autoSlide && _liSum >= _gWidth){
				if(_t) clearTimeout(_t);
				_t = setTimeout(function(){
					$(_options.btnPrev,_this).removeClass(_options.disableClass);
					if(_mM + _step >_liSum - _gWidth) (_mM!= _liSum - _gWidth) ? (_mM = _liSum - _gWidth) : (_options.circleSlide ? _mM = 0 : $(_options.btnNext,_this).addClass(_options.disableClass));
					else _mM += _step;
					if(_a!= $(_options.scrollEl,_moover).length-1) _a++;
					else _a =0;
					_this.rotate(_mM);
				}, _options.autoSlide);
			};
		};
		_this.autoslide();
//disable btns next/prev if need
		if (_liSum <= _gWidth) {
			$(_options.btnPrev,_this).addClass(_options.disableClass).unbind(_options.event).click(function(){return false;});
			$(_options.btnNext,_this).addClass(_options.disableClass).unbind(_options.event).click(function(){return false;});
		};
		if ($.isFunction(_options.onBuild)) {
			_options.onBuild.apply([_this, $(_options.scrollEl,_moover), _a]);
		}
//thumbs
		if(_thumbs){
			_thumbs.click(function(){
				var _ind = _thumbs.index(this);
				_a = _ind;
				_thumbs.removeClass('active').eq(_a).addClass('active');
				_mM = _step*_ind;
				_this.rotate(_mM);
				return false;
			});
		}
	//play|pause
		if(_pause && _pause.length){
			_pause.click(function(){
				_play.removeClass('active');
				$(this).addClass('active');
				if(_t) clearTimeout(_t);
				return false;
			});
		};
		if(_play && _play.length){
			_play.click(function(){
				_pause.removeClass('active');
				$(this).addClass('active');
				_this.autoslide();
				return false;
			});
		};
	});
};

$(document).ready(function(){
	$('div.gallery').vvGalleryScroll({
		holderList: 'div.gallery-holder',
		scrollElParent: '> ul',
		scrollEl: '> li',
		btnPrev: '.back a',
		btnNext: '.forward a',
		onChange: function(){
			var _ar = this;
			var _hold = _ar[0];
			var _els = _ar[1];
			var _a = _ar[2];
			$(_hold).find('.switcher li').html(_els.eq(_a).find('.slide-title').html());
		},
		onBuild: function(){
			var _ar = this;
			var _hold = _ar[0];
			var _els = _ar[1];
			var _a = _ar[2];
			$(_hold).find('.switcher li').html(_els.eq(_a).find('.slide-title').html());
		}
	});
});
