
jQuery.fn.bindFormValidator = function(config){

		var $our_form = $(this);
		var $form_error_field = $('#' + $(this).attr('id') + '-error');
		var main_conf = config;
		
		var form = new Form();
		reloadFields();
		function reloadFields(){
			var fieldArray = Array();
			$our_form.find('.validate[rel]').each(function(){
				fieldArray[$(this).attr('name')] = $(this);	
			})
			form.setFields(fieldArray);
		}
		
		$('#addpunkt').click(function(){
			//reloadFields();
		})
		$('.addflight .close').click(function(){
			//reloadFields();
		})
		$('#trip-type').click(function(){
			//reloadFields();
		})
		
		if (main_conf.submitLink){
			$(main_conf.submitLink).click(function(){
				if(form.isValid()){
					if (main_conf.functionOnSubmit) {
						main_conf.functionOnSubmit();
					}
					else{
						$our_form.submit();
					}
				}
			});
		}
	
		$our_form.submit(function(e){
			if(!main_conf.submitLink && !form.isValid()){
				e.preventDefault();
			}
		});
		
		function Field(field){
			this.el = field;
			this.valid = true;	
			this.validators = Array(); //Валидаторы стандартные
			this.pattern = false;
			this.userValidators = Array();
			//this.require_validate = true;
			this.conf = eval('(' + $(field).attr('rel') + ')');
			this.field_error = $('#'+this.el.attr('name').replace(/\[|\]/g, "")+'-error');
			if (this.conf.errField){
				this.field_error = $('#'+this.conf.errField);
			}
			if (this.conf.validators){
				for (var key in this.conf.validators) {
					this.validators[key] = this.conf.validators[key];
				}
			}
			if (this.conf.validation){
				for (var key in this.conf.validation) {
					this.userValidators[key] = this.conf.validation[key];
				}
			}
			if (this.conf.pattern){
				this.pattern = this.conf.pattern;
			}
			
			this.require_validate = function(){
				if (this.el.hasClass('skip_validate')){
					return false;
				}
				return true;
			}
			

			this.isValid = function(){
				return this.validate();
			}
			
			//валидируем поле на основании конфигурации
			this.validate = function(userVal_only){
				if (!this.require_validate()){
					return true;
				}
				if (this.validators && !userVal_only){
					for (var key in this.validators){				
						var val = this.validators[key](this);						
						if (val !== true){
							this.showError(val);
							return false;
						}
					}
				}
				
				if (this.userValidators){
					for (var key in this.userValidators){	
						var val = main_conf.validation[this.userValidators[key]](this);	
						if (val !== true){
							this.showError(val);
							return false;
						}
					}
				}
				
				if (this.pattern && !userVal_only && getValue(this.el)){
					var val = this.pattern.test(getValue(this.el));
					message = 'Неверный формат';
					if (this.conf.patternMsg){
						message = this.conf.patternMsg;
					}
					if (!val){
						this.showError(message);
						return false;
					}
				}
				this.removeError();
				return true;
			}
			
			this.showError = function(error){
				//console.log(error);
				this.field_error.html(error).show();
			}
			
			this.removeError = function(){
				this.field_error.hide();
			}

			//валидируем при блюре и при блюре полей из списка		
			var field = this;
			
			if (!field.el.hasClass('datepicker')){
				this.el.blur(function(){
					field.validate(false);
				});
			}else{
				this.el.change(function(){
					field.validate(false);
				});	
			}
			if (this.conf.blur_fields){
				for (var key in this.conf.blur_fields){
					var name = this.conf.blur_fields[key];				
					$('input[name='+name+']').bind('blur', function(){
						field.validate(true);
					});
				}
			}
			
			if (this.conf.blur_fields_uvalidate){
				for (var key in this.conf.blur_fields_uvalidate){
					var name = this.conf.blur_fields_uvalidate[key];				
					$('input[name='+name+']').bind('blur', function(){
						field.validate(true);
					});
				}
			}
			
			//валидаторы
			function require(field){
				//console.log(field);
				var value = getValue(field.el);
				var message = 'Обязательное поле';
				if (field.conf.requireMsg){
					message = field.conf.requireMsg;
				}
				if (!value){
					return message;
				}
				return true;		
			}
			
			function getValue(field){
				var value = $.trim(field.attr("value"));
				var comment = $.trim(field.attr("comment"));
				if (value == comment){
					return '';
				}
				return value;
			}			
		}
		
		function Form(){
			this.fields = Array();
			
			this.setFields = function(fieldArray){
				this.fields = Array();
				for (var key in fieldArray){
					this.fields[fieldArray[key].attr('name')] = new Field(fieldArray[key]);
				}
				//console.log(this.fields);
			}
				
			this.isValid = function(){
				//$our_form.find('.validate').blur();	
				var valid = true;
				for (var key in this.fields){
					if (!this.fields[key].isValid()){
						valid = false;
					}
				}
				$.form_validator.valid = valid;
				return valid;
			}	
		}
		
		return form;
	};

( function ( $ ) {
	$.form_validator = {};
	//$.form_validator.config = {group:false};
	$.form_validator.submit = false;
	$.form_validator.valid = true;
})(jQuery);

