/* Script for basic form field validation */

/*Object Definitions*/
function validation( inFieldName, inTextName, inScrubs ) {
  this.fieldName = inFieldName;
  this.textName = inTextName;
  this.scrubs = inScrubs;
}

function scrub( inScrubName, inErrString, inRegexp) {
  this.scrubName = inScrubName;
  this.regexp = inRegexp;
  this.errString = inErrString;
}

function FormValidations() {
	this.validations_array = new Array();
	this.addValidation = addValidation;
	this.getValidations = getValidations;
  this.getValidationByFieldName = getValidationByFieldName;
  
  this.scrub_types_array = new Array();
  this.addScrubType = addScrubType;
  this.getScrubTypes = getScrubTypes;
}

function addValidation( inValidation ) {
	var len = this.validations_array.length;
	if ( len == null || len < 0 ) len=0;
	this.validations_array[len] = inValidation;
}

function getValidations() { 
	return this.validations_array;
}

function getValidationByFieldName( inFieldName ) {
  var valArray = this.getValidations();
  for (var i=0; i < valArray.length; i++) {
    if (valArray[i].fieldName == inFieldName) {
      return valArray[i];
    }
  }
}

function addScrubType( inScrubName, inErrString, inRegexp ) {
  var thescrub = new scrub(inScrubName, inErrString, inRegexp);
  var len = this.scrub_types_array.length;
	if ( len == null || len < 0 ) len=0;
	this.scrub_types_array[len] = thescrub;
}

function getScrubTypes() {
  return this.scrub_types_array;
}


//Setup variables required for operation
var formValidations = new FormValidations(); //the full list of validations for each form field
var errorString=""; //String of errors returned
var errorStringBase="";
var errorRequired = "{v} is required";
var errorChars = "{v} contains non-valid characters";
var errorCharsUnderscore = "{v} can contain only letters, numbers, and underscores (_)";
var errorNumbers = "{v} must be only numbers";
var errorLetters = "{v} must be only letters";
var errorEmail = "{v} must be a valid email address";
var errorCharSmall = "{v} cannot be less than {n} characters";
var errorCharLarge = "{v} cannot be more than {n} characters";
var errorCharRange = "{v} must be between {n1} and {n2} characters";
var errorNumSmall = "{v} must be greater than {n}";
var errorNumLarge = "{v} must be less than {n}";

//Add Standard scrub types
formValidations.addScrubType('alpha', 'errorChars', /^[a-zA-Z\s\.\-\'\,\_]+$/ );
formValidations.addScrubType('alphaonly', 'errorLetters', /^[a-zA-Z]+$/ );
formValidations.addScrubType('numeric', 'errorNumbers',  /^\d+$/ );
formValidations.addScrubType('numericdash', 'errorNumbers',  /^[\d\-]+$/ );
formValidations.addScrubType('alphanumeric', 'errorChars', /^[a-zA-Z0-9\s\.\-\'\,\_]+$/ );
formValidations.addScrubType('alphanumericunderscore',  'errorCharsUnderscore', /^[a-zA-Z0-9\_]+$/ );
formValidations.addScrubType('email', 'errorEmail', /^[\w\.\-]+\@{1}[\w\.\-]+\.{1}[\w]+$/ );

//Example validation definitions
//formValidations.addValidation(new validation("memberName", "First name", "Alpha|Max=29"));
//formValidations.addValidation(new validation("memberEmailAddress", "Email address", "Email"));
//formValidations.addValidation(new validation("memberCountry", "Country", "required"));
//formValidations.addValidation(new validation("memberPhone", "Phone number", "Numeric|Min=3|Max=29"));
//you can use a * at the beginning of the fieldname -- "*memberPhone" in the last example

/*
To override the default scrubbing values listed above, add a hidden field on a specific form with the scrub value.

<input type="text" maxlength="10" name="member_name" value="" />
<input type="hidden" name="js_member_name" value="AlphaNumeric|Max=256">

*/

function findForm(inInput) {
  for (var i=0;i<document.forms.length;i++) {
    for (var j=0; j<document.forms[i].length; j++) {
      if (inInput == document.forms[i].elements[j]) {
            return document.forms[i];
      }
    }
  }
}

function validateThisForm(inForm, scrollWhenDone) {
  return validateForm(inForm.name, scrollWhenDone); 
}

function validateForm( formName) {
  var errmsg = errorString + "\n\n";
	var errors=0;
	
	for (var i=0; i<document.forms[formName].length; i++) {
		 
		var key = document.forms[formName].elements[i].name;
		
        var val = document.forms[formName].elements[i].value;
		var js_key = "js_" + key;
		var js_val = "";
		if (document.forms[formName].elements[js_key] != null) {
			js_val = document.forms[formName].elements[js_key].value;
		}
		
		if (document.forms[formName].elements[i].type == "radio") {
			var radioname = document.forms[formName].elements[i].name;
			key = radioname;
			val = "";
			for (var z=0; z<document.forms[formName].elements[radioname].length; z++) {
				if (document.forms[formName].elements[radioname][z].checked == true) {
					val =  document.forms[formName].elements[radioname][z].value;
				} 
				if ((document.forms[formName].elements[radioname][z] == document.forms[formName].elements[i]) && (z >0)) {
				    key = key + "OFF";
				}
			}
		}
        if ((document.forms[formName].elements[i].type == "checkbox") && !(document.forms[formName].elements[i].checked)) {
          val = null;
        }
		
        var validationsArray = formValidations.getValidations();

		for (var e=0; e<validationsArray.length; e++) {
      
			if ((key == validationsArray[e].fieldName) || (validationsArray[e].fieldName.indexOf("*")==0 && key.search(validationsArray[e].fieldName.replace("*",""))==key.length-validationsArray[e].fieldName.replace("*","").length)){
                var fieldErrmsg = new Array();
				var scrubVal = "";
				if (js_val == "" || js_val == null) {
					scrubVal = validationsArray[e].scrubs.split('|');
				} else {
					scrubVal = js_val.split('|');
				}
				var s=0;
				for (s=0; s<scrubVal.length; s++) {
					var scrub = "";
					var arg = "";
					if ( scrubVal[s].indexOf('=') ) {
						var tmp = scrubVal[s].split('=');
						scrub = tmp[0];
						arg = tmp[1];
					} else {
						scrub = scrubVal[s];
					}

					if ((val == null || val == "") && (scrubVal.join().search(/optional/) < 0) && (scrubVal.join().search(/hiderequirederror/) < 0)) {
					    fieldErrmsg.push(errorRequired.replace('{v}', validationsArray[e].textName));
					    errors++;
					    s = scrubVal.length + 1; 
					} else if (val != null && val != "" || (scrubVal.join().search(/hiderequirederror/) >= 0)) {
                        //loop through standard and custom validations
                        if (val == null) { val = ""; }
                        var scrubSet = formValidations.getScrubTypes();
                        for (var q=0; q < scrubSet.length; q++) {
                          if ((scrubSet[q].scrubName == scrub.toLowerCase()) && (val.match(scrubSet[q].regexp) == null)) {
                            fieldErrmsg.push(eval(scrubSet[q].errString).replace('{v}', validationsArray[e].textName));
							errors++;
                          }
                        }
            
						switch ( scrub.toLowerCase() ) {
							case 'min':
								if (val.length < arg) {
                                    var thisError = errorCharSmall.replace('{v}', validationsArray[e].textName);
                                    thisError = thisError.replace('{n}', arg);
									fieldErrmsg.push(thisError);
									errors++;
								}
								break;
							case 'max':
								if (val.length > arg) {
									var thisError = errorCharLarge.replace('{v}', validationsArray[e].textName);
                                    thisError = thisError.replace('{n}', arg);
									fieldErrmsg.push(thisError);
									errors++;
								}
								break;
                            case 'lenrange':
                                var tmp = arg.split('-');
						        var argMin = tmp[0];
						        var argMax = tmp[1];
								if (val.length < argMin || val.length > argMax) {
									var thisError = errorCharRange.replace('{v}', validationsArray[e].textName);
                                    thisError = thisError.replace('{n1}', argMin);
                                    thisError = thisError.replace('{n2}', argMax);
									fieldErrmsg.push(thisError);
									errors++;
								}
								break;
							case 'gt':
								if (val <= arg) {
								    var thisError = errorNumSmall.replace('{v}', validationsArray[e].textName);
                                    thisError = thisError.replace('{n}', arg);
									fieldErrmsg.push(thisError);
									errors++;
								}
								break;
							case 'lt':
								if (val >= arg) {
								    var thisError = errorNumLarge.replace('{v}', validationsArray[e].textName);
                                    thisError = thisError.replace('{n}', arg);
									fieldErrmsg.push(thisError);
									errors++;
								}
								break;
							case 'optional':
								// do nothing its optional
								break;
						} // end case
					} // end if
				} //end scrubVal loop
        
               
                if ((fieldErrmsg.join() != "") && (fieldErrmsg.join() != null)) {
                  errmsg += "<li>" + fieldErrmsg.join() + "</li>";
                } 
			} //end if key==
		} // validationsArray loop
	} // form loop


	if (errors <= 0) {
		return true;
	}

	//alert(errmsg);
    if (arguments[1] != false) { window.scrollTo(0,0); }
	if (errmsg != null && document.getElementById('error') != null) {
		document.getElementById('error').innerHTML = "<ul>" + errmsg + "</ul>";
	}
	return false;
}

