var errorFields = [];

function bvError(ret, name, field) {
	if (ret.errors) {
		msg = ret.errors[0][0] + " " + ret.errors[0][1];
		addValidated(name, field, 0);
		showError(field, msg);
	} else {
		addValidated(name, field, "1");
		removeError(field);
	}
}

function checkNAdd(field, content) {
	if ($(field).length > 0) {
		if ($(field).is(":input")) {
			$(field).val(content);
		} else {
			$(field).html(content);
		}
		return true;
	} else {
		return false;
	}
}

function showError(field, msg) {
	errField = $(field).attr('id') + "Error";
	errorFields.push($(field).attr('id'));
	if (!checkNAdd($("#" + errField), msg)) {
		$(field).after("<div id='" + errField + "' class='errorMsg'>" + msg + "</div>");
		$("#" + errField).hide();
	}
}

function hideError(field) {
	$(field).removeClass("errorField");
	fieldName = $(field).attr('id') + "Error";
	$("#" + fieldName).hide();
}

function removeError(field) {
	errorFields.splice(errorFields.indexOf($(field).attr('id')));
	errField = $(field).attr('id') + "Error";
	$("#" + errField).remove();
}

function addValidated(name, field, val) {
	fName = $(field).attr('id') + "Valid";
	newField = $("#" + fName);
	if (!checkNAdd(newField, val)) {
		$(field).closest("form").append("<input type='hidden' disabled='disabled' class='validatingField' name='isValid" +
			name + "' id='" + $(field).attr('id') + "Valid' value='" + val + "' />");
	}
}

function bvInit() {
	$("input[name*=Email]").blur(function() {
		validateEmail($(this));
	});
	$("input[name*=Phone]").blur(function() {
		validatePhone($(this));
	});
	$(":input").focus(function(){
		hideError($(this));
	});

	$("form").submit(function() {

		numFields = $(this).find("input[name*=Email], input[name*=Phone], :input[class=required]").length;
		if (numFields > 0) {
			if ($('.validatingField').length == numFields) {
				return checkValidationStatus();
			} else {
				reqs = $(this).find(":input.required");
				reqs.each(function() {
					validateField($(this));
				});
				$(this).find("input[name*=Email][type=text]").each(function() {
					validateEmail($(this));
				});
				$(this).find("input[name*=Phone]").each(function() {
					validatePhone($(this));
				});
				return checkValidationStatus();
			}
		}

	});
}

function checkValidationStatus() {
	var canSubmit = true;
	$('.validatingField').each(function(i) {
		if ($(this).val() == 0) {
			if (i == 0) {
				msg = "<div class='formErrorMsg'>Please fix the errors below:</div>";
				if (!checkNAdd($(".formErrorMsg"), msg)) {
					$(this).closest("form").prepend(msg);
				}
			}
			canSubmit = false;
			fieldName = $(this).attr('id').replace(/Valid/, "Error");
			$.each(errorFields, function(i, v) {
				$("#" + v).addClass("errorField");
			});
			$('.errorMsg').show();
		}
	});

	return canSubmit;
}

function validatePhone(phone) {
	pNum = $(phone).val().replace(/[()\-\s]/g, "");
	if(pNum.length == 11 && pNum.substr(0,1) == "1" || (pNum.length == 10 && pNum.substr(0,1) == "0")){
		pNum = pNum.substr(1,11);
	}
	if (pNum.length == 10 && !checkValidationField(phone)) {
		$.briteVerify.phone(pNum, function(ret) {
			bvError(ret, "phone", phone);
		});
	} else if (pNum < 10) {
		addValidated("phone", $(phone), 0);
		showError(phone, "Please enter a valid phone number");
	}
}

function validateEmail(email) {
	if ($(email).val().length > 0 && !checkValidationField(email)) {
		$.briteVerify.email($(email).val(), function(ret) {
			bvError(ret, "email", email);
		});
	} else if($(email).val().length == 0){
		addValidated("email", $(email), 0);
		showError(email, "Please enter a valid email address");
	}
}

function validateField(field) {
	if ($(field).val() == "") {
		addValidated($(field).attr('name'), $(field), 0);
		showError(field, "This field cannot be left blank");
	}else{
		addValidated($(field).attr('name'), $(field), 1);
		removeError(field);
	}
}

function checkValidationField(field) {
	fName = $(field).attr('name') + "Valid";
	return $("#" + fName).val() == 1;
}
