﻿function FormAnt(options) {
	if (options.validate) {
		this.formValidators = options.validate;
	}
	if (options.debug) {
		this.debug = options.debug;
	}
}
FormAnt.prototype.GetObject = function(form) {
	var formAnt = this;

	var obj = {};
	$(".form").filter("." + form + "Form").find(".control").each(function() {
		var jEl = $(this);
		var propertyName = formAnt.GetPropertyName(jEl);
		if (propertyName) {
			obj[propertyName] = jEl.val();
		}
	});

	if (this.debug) {
		for (var p in obj) {
			alert(p + ": " + obj[p]);
		}
	}

	return obj;
}
FormAnt.prototype.GetPropertyName = function(jEl) {
	var classNames = jEl.getClassNames();
	for (var i = 0; i < classNames.length; i++) {
		if (classNames[i].indexOf("Control") > -1) {
			return classNames[i].replace("Control", "");
		}
	}
	return false;
}


//	Валидаторы

FormAnt.prototype.Validate = function(formId) {
	if (!this.formValidators) return true;

	this.RemoveAllValidationMessages();

	var numMessages = 0;
	for (var i = 0; i < this.formValidators[formId].length; i++) {
		var fieldObj = this.formValidators[formId][i];
		for (var j = 0; j < fieldObj.validators.length; j++) {
			var validator = fieldObj.validators[j];
			var jField = $(fieldObj.field);
			if (!this.IsValid(jField, validator)) {
				this.ShowValidatorMessage(formId, jField, validator);
				numMessages++;
			}
		}
	}

	return (numMessages == 0);
}
FormAnt.prototype.RemoveAllValidationMessages = function() {
	$(".notValidated").removeClass("notValidated");
	$(".validator").empty().hide();
}
FormAnt.prototype.IsValid = function(jField, validator) {
	var fieldValue = jField.val();
	switch (validator.type) {
		case "option":
			return (fieldValue != 0);
		case "length":
			return (fieldValue.length >= validator.min && fieldValue.length <= validator.max);
		case "chars":
			return (validator.regex.test(fieldValue));
		case "url":
			return (validator.regex.test(fieldValue));
		case "check":
			return (jField.is(":checked"));
		case "identic":
			return (fieldValue == $(validator.field2).val());
		case "function":
			return validator.func();
		default:
			return false;
	}
}
FormAnt.prototype.ShowValidatorMessage = function(formId, jField, validator) {
	var message = this.GetValidatorMessage(validator);
	jField.parent().addClass("notValidated");
	this.GetValidatorMessagePlace(formId, jField).show().append(message);
}
FormAnt.prototype.GetValidatorMessage = function(validator) {
	var message = this.GetMessageTemplate(validator);
	for (var property in validator) {
		message = message.replace("{" + property + "}", validator[property]);
	}
	return $("<p>").text(message);
}
FormAnt.prototype.GetMessageTemplate = function(validator) {
	switch (validator.type) {
		case "option":
			return "Пожалуйста, выберите {option}.";
		case "length":
			return "Значение должно быть от {min} до {max} знаков.";
		case "chars":
			return "Значение должно состоять из {chars}.";
		case "identic":
			return "{fields} не совпадают. Пожалуйста, повторите набор.";
		default:
			return "{message}";
	}
}
FormAnt.prototype.GetValidatorMessagePlace = function(formId, jField) {
	var validatorName = this.GetPropertyName(jField);
	return $("." + validatorName + "Validator");
}
FormAnt.prototype.HideValidatorMessages = function(formId, jField) {
	jField.parent().each(function() {
		var jThis = $(this);
		jThis.removeClass("errorcell");
		jThis.nextAll().filter(".errorcell").empty().hide();
	});
}
FormAnt.prototype.GetFieldValidators = function(formId, field) {
	for (var i = 0; i < this.formValidators[formId].length; i++) {
		var fieldObj = this.formValidators[formId][i];
		if (fieldObj.field == field) {
			return fieldObj.validators;
		}
	}
	return new Array();
}
FormAnt.prototype.ShowServerValidationMessage = function(className, d) {
	var j = $("." + className + " .inputcell");
	j.addClass("errorcell");
	j.nextAll().filter(".errorcell").each(function() {
		$(this).show().empty().append($("<p>").text(d));
	});
}
FormAnt.prototype.IsFieldValid = function(formId, field) {
	var fieldIsValid = true;

	this.HideValidatorMessages(formId, $(field));

	var fieldValidators = this.GetFieldValidators(formId, field);
	for (var i = 0; i < fieldValidators.length; i++) {
		if (!this.IsValid($(field), fieldValidators[i])) {
			this.ShowValidatorMessage(formId, $(field), fieldValidators[i]);
			fieldIsValid = false;
		}
	}

	return fieldIsValid;
}
FormAnt.prototype.ShowHint = function(className) {
	$("." + className + " .hintcell").show();
	$("." + className + " .inputcell").addClass("hintcell");
}
FormAnt.prototype.HideHint = function(className) {
	$("." + className + " .inputcell").removeClass("hintcell");
	$("." + className + " .hintcell").hide();
}