﻿var Validation = {
	Triggers: {
		Required: '*[required]',
		FullName: '.name input',
		Street: '.street input',
		CityStateZip: '.city-state-zip input',
		Email: '.email input',
		UniqueEmail: '.unique-email input',
		Phone: '.phone input',
		URL: '.url input'
	},
	Classes: {
		Null: 'null-value',
		Invalid: 'invalid-value'
	},
	FormElements: {
		PersonId: '#personID',
		ErrorMessage: '#reserved-email-error',
		NonUniqueEmail: '#email-entered'
	}
};

function attachValidationEventHandlers() {
	$(Validation.Triggers.Required).change(function () {
		var input = $(this);
		if (isNullOrEmpty(input.val())) {
			input.addClass(Validation.Classes.Null);
		}
		else {
			input.removeClass(Validation.Classes.Null);
			$(this).next('input').focus();
		}
		return false;
	});
	$(Validation.Triggers.FullName).change(function () {
		var input = $(this);
		CallPageMethod("FormatName", onDefaultValidation, onScriptError,
			"id", input.attr('ID'),
			"value", input.val());
		return false;
	});
	$(Validation.Triggers.Street).change(function () {
		var input = $(this);
		CallPageMethod("CorrectStreet", onDefaultValidation, onScriptError,
			"id", input.attr('ID'),
			"value", input.val());
		return false;
	});
	$(Validation.Triggers.CityStateZip).change(function () {
		var input = $(this);

		CallPageMethod("CorrectCityStateZip", onDefaultValidation, onScriptError,
			"id", input.attr('ID'),
			"value", input.val());
		return false;
	});
	$(Validation.Triggers.Email).change(function () {
		var input = $(this);
		CallPageMethod("ValidateEmail", onDefaultValidation, onScriptError,
			"id", input.attr('ID'),
			"value", stripHtml(input.val()));
		return false;
	});
	$(Validation.Triggers.UniqueEmail).change(function () {
		var input = $(this);
		var personID = $(Validation.FormElements.PersonId).val();
		CallPageMethod("ValidateUniqueEmail", onUniqueEmailValidation, onScriptError,
			"id", input.attr('ID'),
			"value", stripHtml(input.val()),
			"personID", personID);
		return false;
	});
	$(Validation.Triggers.Phone).change(function () {
		var input = $(this);
		CallPageMethod("FormatPhone", onDefaultValidation, onScriptError,
			"id", input.attr('ID'),
			"value", input.val());
		return false;
	});
	$(Validation.Triggers.URL).change(function () {
		var input = $(this);
		CallPageMethod("FormatURL", onDefaultValidation, onScriptError,
			"id", input.attr('ID'),
			"value", stripHtml(input.val()));
		return false;
	});
	$('input').keyup(function () {
		var input = $(this);
		input.removeAttr('invalid');
	});
}

function onDefaultValidation(data) {
	var resp = jsonToObject(data);
	var input = jSelect(resp.ElementId);

	if (!resp.IsValid) {
		input.attr('invalid', 'invalid');
		input.addClass(Validation.Classes.Invalid);
	}
	else {
		input.removeAttr('invalid');
		input.removeClass(Validation.Classes.Invalid);
		$(this).next('input:visible').focus();
	}
	input.val(resp.Value);
}

function onUniqueEmailValidation(data) {
	var resp = jsonToObject(data);

	var input = jSelect(resp.ElementId);
	var valMsg = $(Validation.FormElements.ErrorMessage);
	var varLbl = $(Validation.FormElements.NonUniqueEmail);

	if (!resp.IsValid) {
		input.attr('invalid', 'invalid');
		input.addClass(Validation.Classes.Invalid);
		valMsg.hide();
	}
	else if (!resp.IsUnique) {
		input.attr('invalid', 'invalid');
		input.addClass(Validation.Classes.Invalid);
		valMsg.show();
		varLbl.html(resp.Value);
	}
	else {
		input.removeAttr('invalid');
		input.removeClass(Validation.Classes.Invalid);
		valMsg.hide();
		$(this).next('input:visible').focus();
	}

	input.val(resp.Value);
}

function preValidateRequiredFields() {
	$(Validation.Triggers.Required).each(function () {
		var input = $(this);
		if (isNullOrEmpty(input.val()) && !input.attr('disabled')) {
			input.addClass(Validation.Classes.Null);
			hideWatermark(input);
		}
		else {
			input.removeClass(Validation.Classes.Null);
		}
	});
}

function validateField(sender, args) {
	var inputId = sender.controltovalidate;
	args.IsValid = !isInValid(inputId);
	return false;
}

function Page_ClientValidate(validationGroup) {
	preValidateRequiredFields();
	Page_InvalidControlToBeFocused = null;
	if (typeof (Page_Validators) == "undefined") {
		return true;
	}
	var i;
	for (i = 0; i < Page_Validators.length; i++) {
		ValidatorValidate(Page_Validators[i], validationGroup, null);
	}
	ValidatorUpdateIsValid();
	ValidationSummaryOnSubmit(validationGroup);
	Page_BlockSubmit = !Page_IsValid;
	return Page_IsValid;
}
