﻿/// <reference path="jquery-1.4.1-vsdoc.js" />
/*================================*\
// Created by JMC in January 2010
// validates all required fields
// validates non-required fields when regex validators applied
// handles input fields with watermark class applied
\*================================*/

function ValidateForm(container){
	//clear old errors in form
	container.find(".error").removeClass("error");
	
	ClearWatermarkedDefaultValues(container);

	container.find("label.required").each(function () {
		var inputControl;
		var inputName = $(this).attr("for");

		if (inputName == "") {
			//if label contains input instead of using for attribute
			inputControl = $(this).children("input,textarea");
		}
		else {
			inputControl = $("[name=" + inputName + "]", container);
		}

		//validate required text fields that are empty
		if (inputControl.is(":text")) {
			if (inputControl.val() == "" && inputControl.is(":visible")) {
				inputControl.addClass("error");
				$(this).addClass("error");
			}
		}

		//validate password fields and textareas
		if (inputControl.is(":password")
			|| inputControl.is("textarea")) {
			if (inputControl.val() == "") {
				inputControl.addClass("error");
				$(this).addClass("error");
			}
		}

		if (inputControl.is("select")) {
			if (inputControl.val() == inputControl.find("option:eq(0)").val()) {
				inputControl.addClass("error");
				$(this).addClass("error");
			}
		}

		//validate checkbox is checked or radio button is checked
		if (inputControl.is(":radio")
			|| inputControl.is(":checkbox")) {
			if (!inputControl.is(":checked")) {
				$(this).addClass("error");
			}
		}
	});

	//run regex validation
	$(".isValidEmail").each(function() {
		var inputName = $(this).attr("for");
		var inputControl = $("[name=" + inputName + "]", container);

		if (! $(this).hasClass("error") && inputControl.val() != "") {
			if (!isValidEmailAddress(inputControl.val())) {
				$(this).addClass("error");
				inputControl.addClass("error");
			}
		}
	});

	$(".isValidUrl").each(function() {
		var inputName = $(this).attr("for");
		var inputControl = $("[name=" + inputName + "]", container);

		if (!$(this).hasClass("error") && inputControl.val() != "") {
			if (!isValidUrl(inputControl.val())) {
				$(this).addClass("error");
				inputControl.addClass("error");
			}
		}
	});
	
	ReplaceWatermarkedDefaultValues(container);
	
	//if errors found don't submit
	if ($(container).find("label.error").size() > 0) {
		return (false);
	}
	return (true);	
}

function HandleWatermarks(){
	//save default value
	$("input.watermark").each(function() {
		$(this).data("defaultValue", $(this).val());
	});
	//handle focus event...
	$("input.watermark").focus(function() {
		if ($(this).val() == $(this).data("defaultValue")) {
			$(this).val("");
			$(this).addClass("changed");
		}	//...and blur event
	}).blur(function() {
		if ($(this).val() == "") {
			$(this).removeClass("changed");
			$(this).val($(this).data("defaultValue"));
		}
	});
}

function ClearWatermarkedDefaultValues(container) {
	container.find("input.watermark").each(function() {
		var inputControl = $(this);

		if (inputControl.val() == inputControl.data("defaultValue")) {
			inputControl.val("");
		}
	});
}

function ReplaceWatermarkedDefaultValues(container) {
	container.find("input.watermark").each(function() {
		var inputControl = $(this);

		if (inputControl.val() == "") {
			inputControl.val(inputControl.data("defaultValue"));
		}
	});
}

function isValidPhoneNumber(input) {
	//ddd-ddd-dddd or (ddd) ddd-dddd (us domestic)
	//dd-d-ddd-ddd-dddd (us intl)?
	alert("not yet implemented error");
	return false;
}

function isValidSocialSecurityNumber(input) {
	//ddd-dd-dddd
	alert("not yet implemented error");
	return false;
}

function isValidCreditCardNumber(input) {
	//dddd dddd dddd dddd (mc/v) or dddd dddddd ddddd (amex)
	alert("not yet implemented error");
	return false;
}

function isValidEmailAddress(input) {
	//not perfect, but not bad
	//todo: http://en.wikipedia.org/wiki/E-mail_address#RFC_invalid_e-mail_addresses
	//Abc.example.com (character @ is missing)
	//Abc.@example.com (character dot(.) is last in local part)
	//Abc..123@example.com (character dot(.) is double)
	//A@b@c@example.com (only one @ is allowed outside quotations marks)
	//()[]\;:,<>@example.com (none of the characters before the @ in this example are allowed outside quotation marks)

	if (input.length <= 0)
		return false;
	//pattern = /^([a-zA-Z0-9])+([\.\+a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]{2,6})+$/i;
    pattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/i;
	if (!pattern.test(input))
		return false;
	return true;
}

function isValidUrl(input) {
	if (input.length <= 0)
		return (false);
	pattern = /^http:\/\/([a-zA-Z0-9])+(\.[a-zA-Z]+)(\/?.)+$/i;
	if (!pattern.test(input))
		return (false);
	return (true);
}

///TODO: how to validate minimum length of input field?


