// Functions used site-wide

function showSnippet(id) {
	var el = document.getElementById(id);
	el.style.display = (el.style.display == "none") ? "block" : "none";
}

function trim(str) {
    var trimmed = str.replace(/^\s+|\s+$/g, '') ;
    return trimmed;
}

function replaceString(sString, sReplaceThis, sWithThis) { 
    if (sReplaceThis != "" && sReplaceThis != sWithThis) {
      var counter = 0;
      var start = 0;
      var before = "";
      var after = "";
      while (counter<sString.length) {
        start = sString.indexOf(sReplaceThis, counter);
        if (start == -1){
         break;
         } else {
           before = sString.substr(0, start);
           after = sString.substr(start + sReplaceThis.length, sString.length);
           sString = before + sWithThis + after;
           counter = before.length + sWithThis.length;
          }
        }
      }
   return sString;
  }
  
/* ------------------------------------------------------------------------------
 * FORM VALIDATION FUNCTIONS
 * ------------------------------------------------------------------------------
 * Various functions to check fields identified within the calling FORM tag for
 * non-blank values, email and password formats, and comparisons such as
 * 'password' and 'confirm password' fields.
 *
 * Use the following FORM tag syntax to validate/check fields.
 * Modify the onsubmit event handler to include the name of each form  
 * field to be checked, as well as the corresponding message to display
 * if the field is blank.

 *  <form name="lookup" method="POST" action="/cgi/processing-script.jsp" 
 *		  onSubmit="this.name.required = true;
 *					this.name.message = 'Your name';
 *					this.email.required = true;
 *					this.email.message = 'Your email address';
 *					this.email.checkEmail = true;
 *					this.password.checkPassword = true;
 *					this.password.compareFields = this.confirm_password;
 *					this.confirm_password.required = true;
 *					this.confirm_password.message = 'Your password confirmation';
 *					return validateForm(this);">
 * ------------------------------------------------------------------------------*/

// BEGIN FORM VALIDATION FUNCTIONS

// Check email input for proper format:  a@a.aa
function validateEmail(e) {
	var error = "";
	var usEmail = true;
	var str = e.value;
	var lenSuffix = (usEmail) ? 3 : 3;
	var goodAddr = false;
	var ndxAt = ndxDot = 0;

	ndxAt	= str.indexOf("@");
	ndxDot	= str.indexOf(".");
	ndxDot2	= str.lastIndexOf(".");

	// Test field if non-blank continuous character string only
	if (str != "") {
		if ( (str != trim(str)) || (ndxDot < 0) || (ndxAt < 0) || (ndxAt < 1) || ((ndxDot2 - 1) <= ndxAt) || ( str.length < (ndxDot2 + lenSuffix)) ) {
			error = "<br \/> - Please enter a valid email address";
		}
	}
	return error; 
}

// Validate state and zip code fields as appropriate for US / Canada / all other countries
function validateUSFields(formName, countryField, stateField, postalField) {
	if (document.forms[formName].elements[countryField].options[document.forms[formName].elements[countryField].selectedIndex].value == 'us') {
		document.forms[formName].elements[stateField].required = true;
		document.forms[formName].elements[stateField].message = 'Your state';
		document.forms[formName].elements[postalField].required = true;
		document.forms[formName].elements[postalField].message = 'Your zip code'; 	
		document.forms[formName].elements[postalField].checkZipCode = true;
	} else if (document.forms[formName].elements[countryField].options[document.forms[formName].elements[countryField].selectedIndex].value == 'ca') {
		document.forms[formName].elements[stateField].required = true;
		document.forms[formName].elements[stateField].message = 'Your province';
		document.forms[formName].elements[postalField].required = true;
		document.forms[formName].elements[postalField].message = 'Your postal code'; 	
		document.forms[formName].elements[postalField].checkZipCode = false;				
	} else {
		document.forms[formName].elements[stateField].required = false;
		document.forms[formName].elements[postalField].required = false;
		document.forms[formName].elements[postalField].checkZipCode = false;				
	}
}

// Check password input for proper format:  7-15 characters, a-zA-Z0-9 with at least one 0-9
function validatePassword(e) {
    var error = "";
	var pwd = e.value;
	var illegalChars = /[\W_]/; // allow only letters and numbers 
 
 	if (!isblank(pwd)) {
		if ( ((pwd.length < 7) || (pwd.length > 15)) ) {
	        error = "<br \/> - The password must contain 7 to 15 characters (letters and numbers only)";
	    } else if (illegalChars.test(pwd)) {
	    	error = "<br \/> - The password contains illegal characters (use uppercase and lowercase letters and at least one number)";
	    } else if (!( ((pwd.search(/[a-z]+/) > -1) || (pwd.search(/[A-Z]+/) > -1)) && (pwd.search(/[0-9]+/) > -1))) {
		  	error = "<br \/> - The password must contain at least one uppercase or lowercase letter, and one number";
		}
	}
	return error;
}  
  
// Check input fields for blank entries (called by 'verify' function)
function isblank(s) {
	for (var i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if ((c != ' ') && (c != '\n') && (c != '\t')) {
			return false;
		}
	}
	return true;
}

// Check if phone format matches us phone
function isPhoneNumber(s) {
	var objRegExp  =/(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
	
	if (!objRegExp.test( s ))
	 	return "<br \/> - The phone number format is wrong"
	return "";
}

function validateUSZip(s) {
	var error = "";
	// var reZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/); 
	// var reZip = new RegExp(/(^\d{5}$)|(^\d{6}$)|(^\d{7}$)|(^\d{8}$)|(^\d{9}$)/);
	// var reZip = new RegExp(/(^\d{5}$)|(^\d{9}$)/);
	var reZip = new RegExp(/^\d{5}([\-]\d{4})?$/);
	if (!reZip.test(s)) {
		error = "<br \/> - Zip code format must be XXXXX or XXXXX-XXXX";
	}
	return error;
}

function validateSecCode(s) {
	var error = "";
  	if( s.match(/^\d\d\d$/) == null && s.match(/^\d\d\d\d$/) == null ) {
  		error = "<br \/> - Credit card security code must be 3 or 4 digits";
  	}
 	return error;
}

// Check all form fields listed in onSubmit handler
function validateForm(f) {
	var msg;
	var empty_fields = "";
	var typeCC = "";
	var month = "";
	var year = "";
	
	for (var i = 0; i < f.length; i++) {
		var e = f.elements[i];

		if (e.required) {
		
			if ( (e.value == null) || (e.value == "") || (isblank(e.value))  
			     || (e.type == "checkbox" && !e.checked) || (e.type == "radio" && !e.checked) 
			     || e.selectedIndex == "" || e.selectedIndex == 0 ) {

				empty_fields += "<br \/> - " + e.message;
			}
		}

		if (e.checkEmail) {
			empty_fields += validateEmail(e);
		}
		
		if (e.checkPassword) {
			empty_fields += validatePassword(e);
		}

		if (e.name == "credit_card_type"){
	    	typeCC = e.value;
		}
		
		if (e.checkCreditCard) {
			// empty_fields += checkCard(e.value, typeCC);
			empty_fields += checkCardValidation(e.value, typeCC);
		}	
		
		if (e.checkCCSecCode) {		
			empty_fields += validateSecCode(e.value);
		}
		
		if (e.checkPhone) {
			empty_fields += isPhoneNumber(e.value);
		}	

		if (e.checkZipCode) {
			empty_fields += validateUSZip(e.value);
		}	
				
		if (e.name == "pp_expMonth"){
	    	month = e.value;
		}
		if (e.name == "pp_expYear"){
	    	year = e.value;
		}
		
		if (e.checkExpDate) {
			empty_fields += ValidCCExpDate(month, year);
		}	
		
		if (e.compareFields) {
			if (e.value != e.compareFields.value) {
				empty_fields += "<br \/> - " + e.message + " confirmation does not match";
			}
		}
	}	

	// if required fields all validate correctly, then return and submit form
	if (isblank(empty_fields)) {
		document.getElementById("form_status").innerHTML = "<i>Submitting form...</i>";
		document.getElementById("form_status").style.display = "block";
		return true;
	} else {
		msg = "<b>Please complete the following:</b>" + empty_fields + "<br \/>";
    }

	// alert user
	document.getElementById("form_status").innerHTML = msg;
	document.getElementById("form_status").style.display = "block";
	document.getElementById("form_status").focus();

// stop form submission
	return false;
}
