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,
		duration : 1000,
		event: 'click',
		circleSlide: true,
		disableClass: 'disable',
		autoSlide:false,
		onBeforeChange: null,
		onChange: null
	},_options);

	return this.each(function(){
		var _this = this;

		var _holderBlock = jQuery(_options.holderList,_this);
		var _moover = jQuery(_options.scrollElParent,_holderBlock);
		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=0;
		var _pause =  _options.pause ? jQuery(_options.pause,_this) : false;
		var _play = _options.play ? jQuery(_options.play,_this) : false;
		var _a = 0;
		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;
//prev btn
		if(jQuery(_options.btnPrev, _this)){
			jQuery(_options.btnPrev, _this).bind(_options.event, function(){
				if(!jQuery(this).hasClass(_options.disableClass)){
					jQuery(_options.btnNext,_this).removeClass(_options.disableClass);
					if(_mM - _step<0) (_mM!=0) ? _mM=0 : (_options.circleSlide ? _mM = _liSum - _gWidth : 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).bind(_options.event, function(){
				if(!jQuery(this).hasClass(_options.disableClass)){
					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);
				}
				return false;
			});
		};
//animate
		_this.rotate = function(_mM){
			if(_t) clearTimeout(_t);
			if (jQuery.isFunction(_options.onBeforeChange)) {
				_options.onBeforeChange.apply(_this);
			}
			if(_thumbs) _thumbs.removeClass('active').eq(_a).addClass('active');
			_moover.animate({marginLeft: -_mM},{duration: _options.duration, 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();
//thumbs
		_thumbs.click(function(){
			var _ind = _thumbs.index(this);
			_a = _ind;
			_thumbs.removeClass('active').eq(_a).addClass('active');
			_this.rotate(_step*_ind);
			return false;
		});
	});
};
function checkValid(el, flag){
	var _emailReg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	var _nameReg = /^([a-zA-Z\.\-])+/;
	if(flag=='undefined') flag = false;
	if (el.val()==0 || el.val()==el.attr('def')) {
		flag = true;
		if(el.next('span').length){
			el.next('span').attr('class','false');
		}else{
			el.after('<span />');
			el.next('span').attr('class','false');
		}
	} else {
		if(el.next('span').length) el.next('span').attr('class','true');
		else {
			el.after('<span />');
			el.next('span').attr('class','true');
		}
		if (el.hasClass('email')){
			if (!_emailReg.test(el.val())){
				flag = true;
				if(el.next('span').length){
					el.next('span').attr('class','false');
				}else{
					el.after('<span />');
					el.next('span').attr('class','false');
				}
			}
		};
		if (el.hasClass('name')){
			if (!_nameReg.test(el.val())){
				flag = true;
				if(el.next('span').length){
					el.next('span').attr('class','false');
				}else{
					el.after('<span />');
					el.next('span').attr('class','false');
				}
			}
		};
	};
	return flag;
}
function validate(){
	var _form = $('.validate');
	_form.each(function(){
		var _this = this;
		var _submit = $('.submit', $(this));
		var _required = $('.required', $(this));
		_required.each(function(){
			$(this).attr('def', $(this).attr('value'));
			$(this).focus(function(){
				if($(this).attr('value')==$(this).attr('def')) $(this).attr('value','');
			}).blur(function(){
				if($(this).attr('value')=='') $(this).attr('value',$(this).attr('def'));
				checkValid($(this));
			});
		})
		_submit.click(function(){
			var eror = false;
			_required.each(function(){
				eror = checkValid($(this),eror);
			});
			if (eror) return false;
			else $(_this).submit();
			return false;
		});
	})
}

$(document).ready(function(){
	jQuery('.carousel').vvGalleryScroll({
		holderList: '> div.items',
		scrollElParent: '> ul',
		scrollEl: '> li',
		duration : 1000,
		thumbs: '.pager a',
		step: false,
		autoSlide:5000
	});
	validate();
});

