/* ------------------------------------------------------------
 * PROJECT        : Ships Watch Association, Inc.
 * FILENAME       : jqforms.js
 * ------------------------------------------------------------
 * DATE CREATED   : 12 May 2008
 * LAST UPDATED   : 29 Jul 2008
 * ------------------------------------------------------------
 * AUTHOR(S)      : Kevin Scholl (http://www.ksscholl.com/)
 * ------------------------------------------------------------ */
 
/* ------------------------------------------------------------
 * JQUERY PLUGINS
 * ------------------------------------------------------------ */

// toggle default value and coloring on form field focus/blur
// usage: $("#elementID").toggleActive(settings);
jQuery.fn.toggleActive = function(settings) {
	settings = jQuery.extend({
		focusBG   : "#F5FFF5",
		focusFG   : "#000",
		blurBG    : "#FFF",
		blurFG    : "#666",
		toggleVal :  false
		}, settings);
	this.each(function() {
		$(this)
		  .css("border","1px solid #7F9DB9")
			.focus(function() {
				$(this).css({ backgroundColor: settings.focusBG, color: settings.focusFG });
				if (settings.toggleVal == true && this.value == this.defaultValue && this.value != "http://") {
					this.value = "";
					}
				})
			.blur(function() {
				$(this).css({ backgroundColor: settings.blurBG, color: settings.blurFG });
				if (settings.toggleVal == true && this.value == "") {
					this.value = this.defaultValue;
					}
				});
		if ($(this).is("select"))
		  $(this).css("padding","1px")
		});
	};

/* ------------------------------------------------------------
 * FORM VALIDATION
 * ------------------------------------------------------------ */

function jqResetForm(frm) {
	$(":text, :password, textarea, select").css("borderColor","#7F9DB9");
	$("#vMessages p").remove();
	$("span.msgLevelError, span.msgLevelWarn").remove();
	$("label.valid").removeClass("valid");
	$("fieldset ol li, td").removeClass("errorRow warningRow");
	}

var HAS_ERRORS   = false;
var HAS_WARNINGS = false;
	
function displayError(theField, theMsg) {
	$(theField).siblings("span.msgLevelError, span.msgLevelWarn").remove();
	$(theField).css("borderColor","#C33")
		.siblings().not(".noValidation").css("borderColor","#C33")
		.parent("li").addClass("errorRow").append(theMsg);
	HAS_ERRORS = true;
	}

function displayWarning(theField, theMsg) {
	$(theField).parent("li").addClass("warningRow").append("<span class=\"msgLevelWarn\">" + theMsg + "</span>");
	$(theField).css("borderColor","#FF8E00").siblings("input").css("borderColor","#FF8E00");
	HAS_WARNINGS = true;
	}

// validate fields before submitting, display any errors/warnings
// usage: $("#elementID").jqValidateForm(settings);
jQuery.fn.jqValidateForm = function(settings) {
	settings = jQuery.extend({
		dFormat      : "mm/dd/yyyy",
		passMin      :  8,
		msg_error    : "Please address the errors noted below...",
		msg_warning  : "Please address the warnings noted below...",
		msg_required : "ERROR: Required field.",
		msg_format   : "WARNING: Incorrect format."
		}, settings);
	this.submit(function() {
											 
		var frm          = $(this).attr("id");

		var FIELD_ID     = "";

		HAS_ERRORS       = false;
		HAS_WARNINGS     = false;
		
		var MSG_ERROR    = "<p class=\"systemMessage msgLevelError\">" + settings.msg_error + "</p>";
		var MSG_WARNING  = "<p class=\"systemMessage msgLevelWarn\">" + settings.msg_warning + "</p>";
		var MSG_REQUIRED = "<span class=\"msgLevelError\">" + settings.msg_required + "</span>";
		var MSG_FORMAT   = "<span class=\"msgLevelWarn\">" + settings.msg_format + "</span>";
		
    // reset all error messages and indications
		jqResetForm(frm);
	
		// radio buttons errors
		$("#" + frm).find(":radio").each(function(){
			if ($(this).siblings("label").attr("class") == "required") {
				rGrpName  = $(this).attr("name");
				rGrpValue = $("input[name='" + rGrpName + "']:checked").val();
				if (rGrpValue == "" || rGrpValue == null) {
					$(this).siblings("span.msgLevelError, span.msgLevelWarn").remove();
					$(this).parent("li").addClass("errorRow").append(MSG_REQUIRED);
					HAS_ERRORS = true;
					}
				else {
					$(this).siblings("label").addClass("valid")
					}
				}
      });

		// select box errors
		$("#" + frm).find("select").each(function(){
			if ($(this).siblings("label").attr("class") == "required") {
				selValue = $(this).find("option:selected").val();
				if (selValue == "" || selValue == null)
					displayError($(this),MSG_REQUIRED);
				else
					$(this).siblings("label").addClass("valid")
				}
      });

		// text, password, and textarea field errors
		$("#" + frm).find(":text, :password, textarea").not(".noValidation").each(function(){	
			$(this).val($.trim($(this).val()));
			var labelText = $(this).parents("li").find("label").text();
			
			// begin Date
			if (labelText.indexOf('Date') != -1) {
				var dt = $(this).val();
				if (dt != "")	{ // if data is entered, check validity and formatting
					switch (settings.dFormat) {
						case "mm-dd-yyyy":  // format mm-dd-yyyy, ex. 02-06-2008
							datereg = /[0-9]{2}\-[0-9]{2}\-[0-9]{4}$/;
							break;
						case "m/d/y":  // format m/d/y, ex. 2/6/08
							datereg = /[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2}$/;
							break;
						case "m-d-y":  // format m-d-y, ex. 2-6-08
							datereg = /[0-9]{1,2}\-[0-9]{1,2}\-[0-9]{2}$/;
							break;
						default:       // format mm/dd/yyyy, ex. 02/06/2008
							datereg = /[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
							break;
						}
					if (!datereg.exec(dt)) {
						displayWarning($(this),"Date must be formatted as " + settings.dFormat + ".");
						}
					else
					  $(this).siblings("label").addClass("valid");
				  }				
				else { // if no data, check if field is required
				  if ($(this).siblings("label").attr("class") == "required")
						displayError($(this),MSG_REQUIRED);
					}				
				} // end Date

			// begin E-mail
			else if (labelText.indexOf('E-mail') != -1 || labelText.indexOf('Email') != -1) {
				emailLegal   = /[\s\(\)\<\>\,\;\:\\\/\"\[\]]/;
				emailValid   = /^.+@.+\..{2,}$/;
				var curr_eml = $(this).val();
				var prev_eml = curr_eml;
				var prev_lbl = $(this).parents("li").prev().find("label").html()
				if (prev_lbl.indexOf("Email") != -1 || prev_lbl.indexOf("E-mail") != -1)
					prev_eml = $(this).parents("li").prev().find("input").val();
				
				if (curr_eml != "")	{ // if data is entered, check validity and formatting
					$(this).siblings("span.msgLevelError, span.msgLevelWarn").remove();
					if (emailLegal.exec(curr_eml)) { // check fior illegal characters
						displayWarning($(this),"E-mail address contains illegal character(s).");
						}
					else if (!emailValid.exec(curr_eml)) { // check for proper formatting
						displayWarning($(this),"E-mail address must be of valid format.");
						}
					else
					  $(this).siblings("label").addClass("valid");
					}
				else { // if no data, check if field is required
				  if ($(this).siblings("label").attr("class") == "required")
						displayError($(this),MSG_REQUIRED);
					}
				if (   $(this).siblings("label").hasClass("valid") 
					  && $(this).parent("li").prev().find("label").hasClass("valid") 
					  && curr_eml != prev_eml) { // check that passwords match
					$(this).siblings("label").removeClass("valid");
					$(this).parent("li").prev().find("label").removeClass("valid");
					displayError($(this),"<span class=\"msgLevelError\">ERROR: E-mail entries must match.</span>");
					$(this).parent("li").prev().addClass("errorRow");
					$(this).parent("li").prev().find("input").css("borderColor","#C33").siblings("input").css("borderColor","#C33");
					}
				} // end E-mail

      // begin Social Security
			else if (labelText.indexOf('SSN') != -1 || labelText.indexOf('Social Security') != -1) {
				var ssn = "" 
				  + $(this).parent().children("input")[0].value 
					+ $(this).parent().children("input")[1].value 
					+ $(this).parent().children("input")[2].value;
        // populate (optional) hidden field with concatenated data
				if ($(this).parent().children("input")[3])
				  $(this).parent().children("input")[3].value = ssn;
				if (ssn != "")	{ // if data is entered, check formatting
					$(this).siblings("span.msgLevelError, span.msgLevelWarn").remove();
					if (ssn.length != 9 || isNaN(ssn)) {
						displayWarning($(this),"SSN must contain 9 numbers.");
						}
					else
					  $(this).siblings("label").addClass("valid");
					}
				else { // if no data, check if field is required
				  if ($(this).siblings("label").attr("class") == "required")
						displayError($(this),MSG_REQUIRED);
					}
			  } // end Social Security
				
      // begin Telephone and Fax
			else if (labelText.indexOf('Telephone') != -1 || labelText.indexOf('Phone') != -1 || labelText.indexOf('Facsimile') != -1 || labelText.indexOf('Fax') != -1) {
				var tel = "" 
				  + $(this).parent().children("input")[0].value 
					+ $(this).parent().children("input")[1].value 
					+ $(this).parent().children("input")[2].value;
				var tel2 = tel + $(this).parent().children("input")[3].value;
        // populate (optional) hidden field with concatenated data
				if ($(this).parent().children("input")[4])
				  $(this).parent().children("input")[4].value = tel2;
				if (tel != "")	{ // if data is entered, check formatting
					$(this).siblings("span.msgLevelError, span.msgLevelWarn").remove();
					if (isNaN(tel2)) {
						displayWarning($(this),"Number cannot contain alpha character(s).");
						}
					else if (tel.length != 10) {
						displayWarning($(this),"Number must be at least 10 digits (incl. area code).");
						}
					else
					  $(this).siblings("label").addClass("valid");
					}
				else { // if no data, check if field is required
				  if ($(this).siblings("label").attr("class") == "required")
						displayError($(this),MSG_REQUIRED);
					}
			  } // end Telephone and Fax
				
      // begin ZIP Code
			else if (labelText.indexOf('Zip') != -1 || labelText.indexOf('Postal') != -1) {
				var zip = "" 
				  + $(this).parent().children("input")[0].value 
					+ $(this).parent().children("input")[1].value 
        // populate (optional) hidden field with concatenated data
				if ($(this).parent().children("input")[2])
				  $(this).parent().children("input")[2].value = zip;
				if (zip != "")	{ // if data is entered, check formatting
					$(this).siblings("span.msgLevelError, span.msgLevelWarn").remove();
					if (isNaN(zip)) {
						displayWarning($(this),"Zip code must be numeric.");
						}
					else if (zip.length != 5 && zip.length != 9) {
						displayWarning($(this),"Zip code must contain 5 or 9 numbers.");
						}
					else
					  $(this).siblings("label").addClass("valid");
					}
				else { // if no data, check if field is required
				  if ($(this).siblings("label").attr("class") == "required")
						displayError($(this),MSG_REQUIRED);
					}
			  } // end ZIP Code
				
			// begin passwords
			else if (labelText.indexOf('Password') != -1) {
  			passMin      = settings.passMin || 6; // default minimum number of characters
				var curr_pw  = $(this).val();
				var prev_pw  = curr_pw;
				var prev_lbl = $(this).parents("li").prev().find("label").html()
				if (prev_lbl.indexOf("Password") != -1)
					prev_pw    = $(this).parents("li").prev().find("input").val();
				
				if (curr_pw != "")	{ // if data is entered, check validity and formatting
					$(this).siblings("span.msgLevelError, span.msgLevelWarn").remove();
					if (curr_pw.length < passMin) { // check password length
						displayWarning($(this),"Password must be at least " + passMin + " characters.");
						}
					else
					  $(this).siblings("label").addClass("valid");
					}
				else { // if no data, check if field is required
				  if ($(this).siblings("label").attr("class") == "required")
						displayError($(this),MSG_REQUIRED);
					}				
				if (   $(this).siblings("label").hasClass("valid") 
					  && $(this).parent("li").prev().find("label").hasClass("valid") 
					  && curr_pw != prev_pw) { // check that passwords match
					$(this).siblings("label").removeClass("valid");
					$(this).parent("li").prev().find("label").removeClass("valid");
					displayError($(this),"<span class=\"msgLevelError\">ERROR: Password entries must match.</span>");
					$(this).parent("li").prev().addClass("errorRow");
					$(this).parent("li").prev().find("input").css("borderColor","#C33").siblings("input").css("borderColor","#C33");
					}
				} // end passwords

			// begin default
			else {
				if ($(this).siblings("label").attr("class") == "required") {
					if ($(this).val() == "")
						displayError($(this),MSG_REQUIRED);
					else
					  $(this).siblings("label").addClass("valid");					
					}
				} // end default
				
      });

		// return or submit			
		if (!HAS_ERRORS && !HAS_WARNINGS) {
			// alert("Validation passed!"); return false;
			return true;
			}
		else {
			if (HAS_ERRORS)
				$("#vMessages").append(MSG_ERROR);
			if (HAS_WARNINGS)
				$("#vMessages").append(MSG_WARNING);
			window.scrollTo(0,0);
			return false;
			}
		});
	};

/* ------------------------------------------------------------
 * INITIALIZE
 * ------------------------------------------------------------ */

$(document).ready(function(){
													 
	// define the border for input elements
	$("fieldset ol li").each(function(){
  	$("input[type='text'], input[type='password'], textarea")
		  .css("border","1px solid #7F9DB9");
  	$("select")
		  .css({border: "1px solid #7F9DB9", padding: "1px"});
		});

	}); // end ready function
