var REGEXP = {
	COUNT : /^[1-9]\d*$/,
	FIO : /^(?:[\wА-Яа-я]+\s+){2}[\wА-Яа-я]+$/,
	FIO_SIMPLE : /^[а-яА-Я\s]+$/,
	EMAIL : /^[_a-zA-Z\d\-_][_a-zA-Z\d\-\.]+@(?:[_a-zA-Z\d\-]+(?:\.[_a-zA-Z\d\-]+)+)$/,
	PHONE : /^[+\d]\d+$/,
	PHONE2 : /^[+\s\d()\-\.]+$/,
	DAY : /^\d{1,2}$/,
	MONTH : /^\d{1,2}$/,
	YEAR_FULL : /^\d{4}$/,
	NOT_EMPTY : /^.+$/,
	NUMBER : /^\d+$/
};

var errorClass = 'validation_error';
var passClass = 'validation_ok';

var validateInputs = {
	// отмечена хотя бы одна радио-кнопка или чекбокс
	checked : function($elems) {
		return $elems.length ? ($elems.filter(':checked').length > 0) : true;
	},
	// валидация значений regexp-ом. Возвращает функцию валидации
	regexp : function(regexp) {
		return function($elems) {
			for ( var i = 0; i < $elems.length; i++) {
				var value = $.trim($elems[i].value);
				if (!regexp.test(value)) {
					return false;
				}
			}
			return true;
		}
	}
};

function validate_item(itemParam) {
	var errorElem = itemParam.errorElem ? $(itemParam.errorElem)
			: $(itemParam.inputId);
	var elements;
	if (itemParam.inputId) {
		elements = $(itemParam.inputId);
	} else {
		elements = $(document).find('[name=' + itemParam.inputName + ']');
	}
	var passed = itemParam.validate(elements);
	if (!passed) {
		errorElem.addClass(errorClass);
		errorElem.removeClass(passClass);
	} else {
		errorElem.removeClass(errorClass);
		errorElem.addClass(passClass);
	}
	if (itemParam.callback) {
		itemParam.callback(passed);
	}
	return passed;
}

function getValidatorFunc(itemParams) {
	return function() {
		validate_item(itemParams);
	}
}

function setValidator(validateParams, from) {
	$(from).submit(function() {
		var ret = true;
		for ( var param in validateParams) {
			var itemParam = validateParams[param];
			var passed;
			try {
				passed = validate_item(itemParam);
			} catch (e) {
				passed = false;
			}
			if (!passed) {
				ret = false;
			}
		}
		return ret;
	});
	for ( var param in validateParams) {
		var itemParam = validateParams[param];		
		var validator_func = getValidatorFunc(itemParam);		
		if (itemParam.inputId) {			
			try {
				$(itemParam.inputId).change(validator_func);
				$(itemParam.inputId).keyup(validator_func);
			} catch (e) {
				alert(e);
			}
		} else {
			if (!itemParam.noEvent) {
				$elements = $(from).find('[name=' + itemParam.inputName + ']');
				$elements.each(function(i) {
					$elem = $elements.eq(i);
					$elem.change(validator_func);
				});
			}
		}
	}
}
