jQuery(document).ready(function(){
	jQuery('div.horiz-gallery').vvGalleryScroll({
		holderList: 'div.holder',
		scrollElParent: '> ul',
		scrollEl: '> li',
		btnPrev: 'a.btn-prev',
		btnNext: 'a.btn-next',
		autoSlide:false
	});
	jQuery('div.vert-gallery').vvGalleryScrollVertical({
		holderList: 'div.holder',
		scrollElParent: '> ul',
		scrollEl: '> li',
		btnPrev: 'a.btn-up',
		btnNext: 'a.btn-down',
		count: '.gal-counter',
		autoSlide:false
	});
});


jQuery.fn.vvGalleryScroll = function(_options){
	// defaults options	
	var _options = jQuery.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,
		easing: 'linear',
		disableClass: 'disable',
		autoSlide:false,
		onBeforeChange: null,
		onChange: null
	},_options);

	return this.each(function(){
		var _this = this;

		_this.init = function(){
			var _holderBlock = jQuery(_options.holderList,_this);
			var _moover = jQuery(_options.scrollElParent,_holderBlock).css('position','relative');
			var _liWidth = jQuery(_options.scrollEl,_moover).outerWidth(true);
			var _gWidth = _holderBlock.width();
			var _liSum = jQuery(_options.scrollEl,_moover).length * _liWidth;
			var _thumbs = _options.thumbs ? (jQuery(_options.thumbs,_this).length ? jQuery(_options.thumbs,_this): false) : false;
			var _step = 0, _t = null, _mM=(_moover.css('left')=='auto') ? 0 : parseInt(_moover.css('left'),10);
			var _pause =  _options.pause ? jQuery(_options.pause,_this) : false;
			var _play = _options.play ? jQuery(_options.play,_this) : false;
			var _a = _mM/_liWidth;
			if(_options.thumbsCreate){
				var _html = '<ul>';
				for(var i=0; i<jQuery(_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) jQuery(_options.btnPrev,_this).addClass(_options.disableClass);
				else if(_mM ==_liSum-_gWidth) jQuery(_options.btnNext,_this).addClass(_options.disableClass);
			};
//prev btn
			if(jQuery(_options.btnPrev, _this)){
				jQuery(_options.btnPrev, _this).unbind(_options.event.bind).bind(_options.event, function(){
					if(!jQuery(this).hasClass(_options.disableClass)){
						jQuery(_options.btnNext,_this).removeClass(_options.disableClass);
						if(_mM - _step<0){
							if(_mM!=0){
								_mM=0;
							}else{
								if(_options.circleSlide){
									_this.ajax(false);
									_mM = _liSum - _gWidth;
								}else{
									jQuery(_options.btnPrev,_this).addClass(_options.disableClass);
								}
							}
						}else _mM -= _step;
						if(_a!= 0) _a--;
						else _a =jQuery(_options.scrollEl,_moover).length-1;
						_this.rotate(_mM);
					}
					return false;
				});
			};
//next btn
			if(jQuery(_options.btnNext, _this)){
				jQuery(_options.btnNext, _this).unbind(_options.event.bind).bind(_options.event, function(){
					if(!jQuery(this).hasClass(_options.disableClass)){
						jQuery(_options.btnPrev,_this).removeClass(_options.disableClass);
						if(_mM + _step >_liSum - _gWidth){
							if(_mM!= _liSum - _gWidth){
								_this.ajax(true);
								_mM = _liSum - _gWidth;
							}else{
								if(_options.circleSlide){
									_this.ajax(true);
									_mM = 0;
								}else{
									jQuery(_options.btnNext,_this).addClass(_options.disableClass);
								};
							};
						}else _mM += _step;
						if(_a!= jQuery(_options.scrollEl,_moover).length-1) _a++;
						else _a =0;
						_this.rotate(_mM);
					}
					return false;
				});
			};
//animate
			_this.rotate = function(_m){
				_mM = _m;
				if(_t) clearTimeout(_t);
				if (jQuery.isFunction(_options.onBeforeChange)) {
					_options.onBeforeChange.apply(_this);
				}
				if(!_options.circleSlide){
					if(_m == 0) jQuery(_options.btnPrev,_this).addClass(_options.disableClass);
					else if(_m ==_liSum-_gWidth) jQuery(_options.btnNext,_this).addClass(_options.disableClass);
				};
				if(_thumbs) _thumbs.removeClass('active').eq(_a).addClass('active');
				_moover.animate({left: -_m},{duration: _options.duration,easing:_options.easing, queue: false, complete: function(){
					if (jQuery.isFunction(_options.onChange)) {
						_options.onChange.apply(_this);
					}
					_this.autoslide();
				}});
			};
//autoslide
			_this.autoslide = function(){
				if(_options.autoSlide && _liSum >= _gWidth){
					if(_t) clearTimeout(_t);
					_t = setTimeout(function(){
						jQuery(_options.btnPrev,_this).removeClass(_options.disableClass);
						if(_mM + _step >_liSum - _gWidth) (_mM!= _liSum - _gWidth) ? (_mM = _liSum - _gWidth) : (_options.circleSlide ? _mM = 0 : jQuery(_options.btnNext,_this).addClass(_options.disableClass));
						else _mM += _step;
						if(_a!= jQuery(_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) {
				jQuery(_options.btnPrev,_this).addClass(_options.disableClass).unbind(_options.event).click(function(){return false;});
				jQuery(_options.btnNext,_this).addClass(_options.disableClass).unbind(_options.event).click(function(){return false;});
			};
//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');
					jQuery(this).addClass('active');
					if(_t) clearTimeout(_t);
					return false;
				});
			};
			if(_play && _play.length){
				_play.click(function(){
					_pause.removeClass('active');
					jQuery(this).addClass('active');
					_this.autoslide();
					return false;
				});
			};
		};
		_this.ajax = function(direct){
			var _url = $(_this).attr('title');
			var _holderBlock = jQuery(_options.holderList,_this);
			var _moover = jQuery(_options.scrollElParent,_holderBlock);
			$.ajax({
				url: _url,
				type: "POST",
				data: 'GalleryItemCount='+_moover.children().length,
				success: function(items){
					if(items == false){
						_options.circleSlide = false;
					}else{
						_moover.append($(items).html());
						setTimeout(function(){
							_this.init();
							var _liWidth = jQuery(_options.scrollEl,_moover).outerWidth(true);
							var _liSum = jQuery(_options.scrollEl,_moover).length * _liWidth;
							var _gWidth = _holderBlock.width();
							var _mM = Math.abs((_moover.css('left')=='auto') ? 0 : parseInt(_moover.css('left'),10));
							var _step = 0;
							if(typeof(_options.step)=='number') _step = _options.step;
							else if (!_options.step) _step = _gWidth; else _step = _options.step*_liWidth;
							if(direct){
								if(_mM + _step >_liSum - _gWidth){
									if(_mM!= _liSum - _gWidth){
										_mM = _liSum - _gWidth;
									}else{
										if(_options.circleSlide){
											_mM = 0;
										}else{
											jQuery(_options.btnNext,_this).addClass(_options.disableClass);
										};
									};
								}else _mM += _step;
								_this.rotate(_mM);
							}else {
								_this.rotate(_liSum - _gWidth);
							}
						},100)
					}
				},
				error: function(){
					//alert('Incorrect Path to file or file not found');
				}
			});
		}
		_this.init();
	});
};

jQuery.fn.vvGalleryScrollVertical = function(_options){
	// defaults options	
	var _options = jQuery.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,
		count: '.counter',
		disableClass: 'none-active',
		autoSlide:false,
		onBeforeChange: null,
		onChange: null
	},_options);

	return this.each(function(){
		var _this = this;
		_this.init = function(){
			var _holderBlock = jQuery(_options.holderList,_this);
			var _moover = jQuery(_options.scrollElParent,_holderBlock).css('position','relative');
			var _liWidth = jQuery(_options.scrollEl,_moover).outerHeight(true);
			var _liSum = jQuery(_options.scrollEl,_moover).length * _liWidth;
			var _gWidth = _holderBlock.height();
			var _thumbs = _options.thumbs ? (jQuery(_options.thumbs,_this).length ? jQuery(_options.thumbs,_this): false) : false;
			var _step = 0, _t = null, _mM=(_moover.css('top')=='auto') ? 0 : parseInt(_moover.css('top'),10);
			var _pause =  _options.pause ? jQuery(_options.pause,_this) : false;
			var _play = _options.play ? jQuery(_options.play,_this) : false;
			var _a = _mM/_liWidth;
			if(_options.thumbsCreate){
				var _html = '<ul>';
				for(var i=0; i<jQuery(_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) jQuery(_options.btnPrev,_this).parent().addClass(_options.disableClass);
				else if(_mM ==_liSum-_gWidth) jQuery(_options.btnNext,_this).parent().addClass(_options.disableClass);
			};
//prev btn
			if(jQuery(_options.btnPrev, _this)){
				jQuery(_options.btnPrev, _this).unbind(_options.event).bind(_options.event, function(){
					if(!jQuery(this).hasClass(_options.disableClass)){
						jQuery(_options.btnNext,_this).removeClass(_options.disableClass);
						if(_mM - _step<0){
							if(_mM!=0){
								_mM=0;
							}else{
								if(_options.circleSlide){
									_this.ajax(false);
									_mM = _liSum - _gWidth;
								}else{
									jQuery(_options.btnPrev,_this).addClass(_options.disableClass);
								}
							}
						}else _mM -= _step;
						if(_a!= 0) _a--;
						else _a =jQuery(_options.scrollEl,_moover).length-1;
						_this.rotate(_mM);
					}
					return false;
				});
			};
//next btn
			if(jQuery(_options.btnNext, _this)){
				jQuery(_options.btnNext, _this).unbind(_options.event).bind(_options.event, function(){
					if(!jQuery(this).hasClass(_options.disableClass)){
						jQuery(_options.btnPrev,_this).removeClass(_options.disableClass);
						if(_mM + _step >_liSum - _gWidth){
							if(_mM!= _liSum - _gWidth){
								_this.ajax(true);
								_mM = _liSum - _gWidth;
							}else{
								if(_options.circleSlide){
									_this.ajax(true);
									_mM = 0;
								}else{
									jQuery(_options.btnNext,_this).addClass(_options.disableClass);
								};
							};
						}else _mM += _step;
						if(_a!= jQuery(_options.scrollEl,_moover).length-1) _a++;
						else _a =0;
						_this.rotate(_mM);
					}
					return false;
				});
			};
//animate
			_this.rotate = function(_m){
				_mM = _m;
				if(_t) clearTimeout(_t);
				if (jQuery.isFunction(_options.onBeforeChange)) {
					_options.onBeforeChange.apply(_this);
				}
				if(!_options.circleSlide){
					if(_m == 0) jQuery(_options.btnPrev,_this).parent().addClass(_options.disableClass);
					else if(_m >=_liSum-_gWidth) jQuery(_options.btnNext,_this).parent().addClass(_options.disableClass);
				};
				if(_thumbs) _thumbs.removeClass('active').eq(_a).addClass('active');
				_moover.animate({top: -_m},{duration: _options.duration, queue: false, complete: function(){
					if (jQuery.isFunction(_options.onChange)) {
						_options.onChange.apply(_this);
					}
					if($(_options.count,_this).length){
						if(_m == 0) _a =0;
						$(_options.count,_this).text(jQuery(_options.scrollEl,_moover).length);
					}
					_this.autoslide();
				}});
			};
//autoslide
			_this.autoslide = function(){
				if(_options.autoSlide && _liSum >= _gWidth){
					if(_t) clearTimeout(_t);
					_t = setTimeout(function(){
						jQuery(_options.btnPrev,_this).parent().removeClass(_options.disableClass);
						if(_mM + _step >_liSum - _gWidth) (_mM!= _liSum - _gWidth && _mM<= _liSum - _gWidth) ? (_mM = _liSum - _gWidth) : (_options.circleSlide ? _mM = 0 : jQuery(_options.btnNext,_this).parent().addClass(_options.disableClass));
						else _mM += _step;
						if(_a!= jQuery(_options.scrollEl,_moover).length-1) _a++;
						else _a =0;
						_this.rotate(_mM);
					}, _options.autoSlide);
				};
			};
			_this.autoslide();
//disable btns next/prev if need
			if($(_options.count,_this).length){
				if(_mM == 0) _a =0;
				$(_options.count,_this).text(jQuery(_options.scrollEl,_moover).length);
			}
			if (_liSum <= _gWidth) {
				jQuery(_options.btnPrev,_this).parent().addClass(_options.disableClass).unbind(_options.event).click(function(){return false;});
				jQuery(_options.btnNext,_this).parent().addClass(_options.disableClass).unbind(_options.event).click(function(){return false;});
			};
//thumbs
			if(_thumbs){
				_thumbs.click(function(){
					var _ind = _thumbs.index(this);
					_a = _ind;
					_thumbs.removeClass('active').eq(_a).addClass('active');
					_this.rotate(_step*_ind);
					return false;
				});
			}
		//play|pause
			if(_pause && _pause.length){
				_pause.click(function(){
					_play.removeClass('active');
					jQuery(this).addClass('active');
					if(_t) clearTimeout(_t);
					return false;
				});
			};
			if(_play && _play.length){
				_play.click(function(){
					_pause.removeClass('active');
					jQuery(this).addClass('active');
					_this.autoslide();
					return false;
				});
			};
		};

		_this.ajax = function(direct){
			var _url = $(_this).attr('title');
			var _holderBlock = jQuery(_options.holderList,_this);
			var _moover = jQuery(_options.scrollElParent,_holderBlock);
			$.ajax({
				url: _url,
				type: "POST",
				data: 'GalleryItemCount='+_moover.children().length,
				success: function(items){
					if(items == false){
						_options.circleSlide = false;
					}else{
						_moover.append($(items).html());
						setTimeout(function(){
							_this.init();
							var _liWidth = jQuery(_options.scrollEl,_moover).outerHeight(true);
							var _liSum = jQuery(_options.scrollEl,_moover).length * _liWidth;
							var _gWidth = _holderBlock.height();
							var _mM=Math.abs((_moover.css('top')=='auto') ? 0 : parseInt(_moover.css('top'),10));
							var _step = 0;
							if(typeof(_options.step)=='number') _step = _options.step;
							else if (!_options.step) _step = _gWidth; else _step = _options.step*_liWidth;
							if(direct){
								if(_mM + _step >_liSum - _gWidth){
									if(_mM!= _liSum - _gWidth){
										_mM = _liSum - _gWidth;
									}else{
										if(_options.circleSlide){
											_mM = 0;
										}else{
											jQuery(_options.btnNext,_this).addClass(_options.disableClass);
										};
									};
								}else _mM += _step;
								_this.rotate(_mM);
							}else {
								_this.rotate(_liSum - _gWidth);
							}
						},100);
					}
				},
				error: function(){
					alert('Incorect Path to file or file not found');
				}
			});
		}
		_this.init();
	});
};
