
function sxValidator(opts){
	
	var self = this;
	this.valid = false;
	
	this.options = opts;
	this.$form = typeof opts.$el == 'string' ? $(opts.$el) : opts.$el;
	
	this.init = function(){
		this.$form.submit(function(e){
			if(self.valid){
				//if(this.$form.hasClass('_preorder')) yandexReachGoal('zakazkorzina');
				return true;
			} 
			e.preventDefault();
			self.validate();
		});
		
		this.$form.on('click keyup', '.input-error', function(){
			self.removeError($(this));	
		});
		
	}
	
	this.validate = function(){
		var flag = true;
		this.$form.find('[data-format]').each(function(){
			var $input = $(this);
			var val = $input.val();
			var re = new RegExp($input.data('format'));
			if(re.test(val)) return;
			var msg = $input.data('notice') ? $input.data('notice') : 'Это поле необходимо заполнить';
			self.showError($input, msg);
			flag = false;
			return false;
		});
		
		if(flag){
			this.valid = true;
			this.$form.submit();
		}
	}
	
	this.showError = function($el, msg){
		$el.addClass('input-error').parents('.form-group').addClass('has-error');
		$el.popover({
			html:true,
			content: msg,
			placement: 'bottom'
		});
		$el.popover('show');
		$el.focus();
	}
	
	this.removeError = function($el){
		$el.removeClass('input-error').parents('.form-group').removeClass('has-error');
		$el.popover('destroy');
	}
	
	var __construct = function(that) {
		that.init();
	}(this);
	
}