ValidatorStorage.prototype.types.output.alert.strings.rus.password = {
	type: "Поле {name} должно быть заполнено только латинскими буквами (и строчными, и заглавными) и цифрами",
	type1: "Поле {name} должно быть заполнено и латинскими буквами (и строчными, и заглавными), и цифрами - пропущена строчная латинская буква",
	type2: "Поле {name} должно быть заполнено и латинскими буквами (и строчными, и заглавными), и цифрами - пропущена заглавная латинская буква",
	type3: "Поле {name} должно быть заполнено и латинскими буквами (и строчными, и заглавными), и цифрами - пропущена цифра",
	interval: "В поле {name} должно быть от {min}{decline:min,str} до {max}{decline:max,str} символов",
	strongValue: "В поле {name} должно быть {min} символов",
	less: "В поле {name} не должно быть не больше {max} символов",
	greater: "В поле {name} не должно быть не меньше {min} символов"
};
ValidatorStorage.prototype.types.output.inline.strings.rus.password = {
	type: "должны содержаться только латинские буквы (и строчные, и заглавные) и цифры",
	type1: "должны содержаться и латинские буквы (и строчные, и заглавные), и цифры - пропущена строчная латинская буква",
	type2: "должны содержаться и латинские буквы (и строчные, и заглавные), и цифры - пропущена заглавная латинская буква",
	type3: "должны содержаться и латинские буквы (и строчные, и заглавные), и цифры - пропущена цифра",
	interval: "от {min}{decline:min,str} до {max}{decline:max,str} {symbols:max,str}",
	strongValue: "только {min} {symbols:max,str2}",
	less: "не более {max} {symbols:max,str}",
	greater: "не менее {min} {symbols:max,str}"
};
ValidatorStorage.prototype.types.checkers.password = function(getRole) {
	var value = getRole("value").getValue(); // получаем значение
	if (value==="") {
		// если зн-е пустое, но поле не обязательно для заполнения, ошибки нет
		if (!getRole("req") || !getRole("req").getValue()) return false;
	}
	/*if (!/[a-z]+/.test(value) || !/[A-Z]+/.test(value) || !/[0-9]+/.test(value)) {
		return new ValidatorError(["password", "type", this, getRole]);
	}*/
	if (!/[a-z]+/.test(value)) return new ValidatorError(["password", "type1", this, getRole]);
	if (!/[A-Z]+/.test(value)) return new ValidatorError(["password", "type2", this, getRole]);
	if (!/[0-9]+/.test(value)) return new ValidatorError(["password", "type3", this, getRole]);
	if (/[^a-zA-z0-9]/.test(value)) return new ValidatorError(["password", "type", this, getRole]);
	var min = getRole("min").getValue();
	var max = getRole("max").getValue();
	if (value.length < min || value.length > max) {
		return new ValidatorError(["password", min==max ? "strongValue" : min==Number.NEGATIVE_INFINITY ? "less" : max==Number.POSITIVE_INFINITY ? "greater" : "interval"], this, getRole);
	}
	return false;
};

ValidatorStorage.prototype.types.output.inline.strings.rus.dateFromNow =
{
	format: "Неверный формат даты. Правильный формат - ДД.ММ.ГГГГ.",
	inThePast: "Дата не может быть меньше текущей даты."
};

ValidatorStorage.prototype.types.checkers.dateFromNow = function(getRole)
{
	var value = getRole("value").getValue(); // получаем значение
	if (value == "")
	{
		// если зн-е пустое, но поле не обязательно для заполнения, ошибки нет
		if (!getRole("req") || !getRole("req").getValue()) return false;
	}

	var dateValue = Date.parseExact(value, "dd.MM.yyyy");
	if (dateValue == null)
	{
		return new ValidatorError(["dateFromNow", "format", this, getRole]);
	}
	else
	{
		var now = new Date();
		now.clearTime();
		
		if (dateValue < now)
		{
			return new ValidatorError(["dateFromNow", "inThePast", this, getRole]);
		}
	}

	return false;
};

ValidatorStorage.prototype.types.output.alert.strings.rus["int-chars"] = {
	type: "Поле {name} должно быть заполнено цифрами",
	interval: "В поле {name} должно быть от {min}{decline:min,str} до {max}{decline:max,str} символов",
	strongValue: "В поле {name} должно быть {min} символов",
	less: "В поле {name} не должно быть не больше {max} символов",
	greater: "В поле {name} не должно быть не меньше {min} символов"
};
ValidatorStorage.prototype.types.output.inline.strings.rus["int-chars"] = {
	type: "должны содержаться цифры",
	interval: "от {min}{decline:min,str} до {max}{decline:max,str} {symbols:max,str}",
	strongValue: "только {min} {symbols:max,str2}",
	less: "не более {max} {symbols:max,str}",
	greater: "не менее {min} {symbols:max,str}"
};
ValidatorStorage.prototype.types.checkers["int-chars"] = function(getRole) {
	var value = String(getRole("value").getValue()); // получаем значение
	if (value==="") {
		// если зн-е пустое, но поле не обязательно для заполнения, ошибки нет
		if (!getRole("req") || !getRole("req").getValue()) return false;
	}
	if (!/[0-9]+/.test(value)) return new ValidatorError(["int-chars", "type", this, getRole]);
	var min = getRole("min").getValue();
	var max = getRole("max").getValue();
	if (value.length < min || value.length > max) {
		return new ValidatorError(["int-chars", min==max ? "strongValue" : min==Number.NEGATIVE_INFINITY ? "less" : max==Number.POSITIVE_INFINITY ? "greater" : "interval"], this, getRole);
	}
	return false;
};

ValidatorOutput.prototype.inline.prototype.remError = function(num) {
	var errors = this.getAllErrors();
	if (errors[num]) {
		var item = errors[num].getItem();
		var gr = item.getRoles;
		var erNode = gr("errorTarget").getValue();
		erNode.innerHTML = "";
		$( gr("container").getValue() ).removeClass("with-error");
		
		if (item.getRoles("afterHideError")) {
			try {
				item.getRoles("afterHideError").getValue()( {
					error: errors[num],
					message: null,
					item: item,
					node: gr("node").getValue(),
					container: gr("container") ? gr("container").getValue() : false,
					errorTarget: gr("errorTarget").getValue()
				} )
			} catch(er) {}
		}
	}
	if (num<errors.length && errors.splice) errors.splice(num, 1);
	return this;
};

ValidatorOutput.prototype.inline.prototype.showError = function(error) {
	var gr = error.item.getRoles;
	var errorTarget = error.item.getRoles("errorTarget").getValue();
	gr("errorTarget").getValue().innerHTML = error.message;
	$( gr("container").getValue() ).addClass("with-error");
   
	if (error.item.getRoles("afterShowError")) {
		try {
			error.item.getRoles("afterShowError").getValue()( {
				error: error.error,
				message: error.message,
				item: error.item,
				node: gr("node").getValue(),
				container: gr("container") ? gr("container").getValue() : false,
				errorTarget: gr("errorTarget").getValue()
			} )
		} catch(er) {}
	}
	
	return this;
};