/*
 * jValidation
 * Written by: Joseph Morris (joe.morris@10thstreetsolutions.com)
 * Requires: jQuery (www.jquery.com)
 */


 /* **** Alert Msgs **** */
var form_alert = "Please complete all required fields.";
var req_alert = "Requires input.";
var date_alert = "Please enter a properly formatted date, e.g. 4/15/2006.";
var name_alert = "Proper name required.";
var email_alert = "Please provide a valid email address.";
var phone_alert = "Please enter a valid phone number, e.g. (555) 555-5555.";
var address_alert = "Please provide your address.";
var city_alert = "Please provide your city.";
var state_alert = "Please select yoru state.";
var zipcode_alert = "Please enter a valid zip code.";
var comments_alert = "Please provide come comments.";
var checkbox_alert = "Selection is required.";
var ssn_alert = "Please enter a properly formatted SSN, e.g. 000-00-0000.";
var phone_alert = "Error, 000-000-0000.";
var year_alert = "Please enter a four digit year.";
var number_alert = "Please enter a number.";
var website_alert = "Error, http://wwww.somewebsite.com";



/* **** Regular Expression Patterns **** */
var date_RegExPattern = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
var name_RegExPattern = /^\s*[a-zA-Z,\s]+\s*$/;
var email_RegExPattern = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/;
var phone_RegExPattern = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/;
var address_RegExPattern = /^[a-zA-Z0-9\s.\-]+$/;
var city_RegExPattern = /^\s*[a-zA-Z,\s]+\s*$/;
var state_RegExPattern = /^\s*[a-zA-Z,\s]+\s*$/;
var zipcode_RegExPattern = /^\d{5}$/;
var number_RegExPattern = /^[0-9\s.\-]+$/;
var year_RegExPattern = /^\d{4}$/;
var ssn_RegExPattern = /^\d{3}-\d{2}-\d{4}$/;
var comments_RegExPattern = /^\s*[a-zA-Z,\s]+\s*$/;
var website_RegExPattern = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/;


/*
 * Must initialize the HTML when loaded dynamically.
 * Easiest to do this on page load and when loading a dynamically created form.
 */
/* *** Initialize Form Validation *** */
$(function() {
	intValidation();
});

function intValidation() {
    /* **** Element Focus Coloring **** */
    $("form").children().children("input,select,textarea").focus(function() {
		$(this).not("[@type='checkbox'][@type='radio'][@type='button'][@type='reset']").addClass("Act");
    });
    $("input,select,textarea").blur(function() {
		$(this).not("[@type='submit']").removeClass("Act");
    });
	
	/* **** Add Required Notation to Labels **** */
	$("input,textarea,select").each(function() {
		if ( $(this).hasClass("jRequired") ) {
			$(this).siblings(".Label").append("<div class=\"Req-Notation\">*</div");
		}
	});
	
    /* **** Form Validation **** */
    $("input,textarea").change(function() {
		if ($(this).hasClass("jValidate")) {
			var cName = $(this).attr("class");
			var cNames = cName.split(" ");
			for (i = 0; i < cNames.length; i++) {
				if ( cNames[i].indexOf("jValidate_") > -1 ) {
					cName = cNames[i];
				}
			}
			var cName = cName.split("_");
			validateValue(this,cName[1]);
		}
    });

    /* **** Verfy Req Fields **** */
    $("form#contact").submit(function() {
		var f = $(this).parents("form");
		var reqCount = 0;
		var reqLength = $(".jRequired").length;
		$(".jRequired").each(function() {
			if (checkReq(this)) {
				reqCount++;
			}
		});
		if (reqCount != reqLength || $("span[@id$='_error']:visible").length > 0) {
			alert(form_alert);
			return false;
		} else {
			/* *** Call form processing function *** */
			//alert("Valid Form");
			//$("form.contact").submit();
			return true;
		}
    });
    /* **** Form Reset **** */
    $("input:reset").click(function() {
		$("span[@id$='_error']:visible").fadeOut("slow");
    });
}

/* **** Function for validating element values **** */
function validateValue(e,v) {
    valid = false;
    if(!$(e).val().match(eval(v.toLowerCase() + "_RegExPattern")) && $(e).val().length > 0) {
		if (!document.getElementById($(e).attr("name") + "_error")) {
			$("span#error").clone().insertAfter(e).attr("id",$(e).attr("name") + "_error");
		}
		$("span#" + $(e).attr("name") + "_error:hidden").fadeIn("slow").html(eval(v.toLowerCase() + "_alert"));
	} else {
		if (document.getElementById($(e).attr("name") + "_error")) {
			$("span#" + $(e).attr("name") + "_error:visible").fadeOut("slow");
		}
		valid = true;
    }
    return valid;
}

function checkReq(e) {
    var valid = false;
    /* **** Check req on text and text area **** */
    if ($(e).is("select")) {
		if(e.options[e.selectedIndex].value.length > 0) {
			valid = true;
		}
    }
    if ($(e).is("input[@type='checkbox']")) {
		if ($(e).is(":checked")) {
			valid = true;
		}
    }
    if ($(e).is("input:text") || $(e).is("textarea")) {
		if ($(e).val().length > 0) {;
			valid = true;
		}
    }
    return valid;
}