/*
form-validation.js: Defines functions and objects for validating form data submission.
Browser Compatibility: NN 4.78+, IE 5.5+, Mac 3.0+
Example:

Include on same page as form,
<script language="Javascript">
function validateLoginForm(){
  
  // Create a new JSForm object
  var myForm = new JSForm();
  myForm.addElement(new JSFormElement(document.frmLogin.userName,TEXTBOX,true, "Please enter a user name", TEXT));
  return myForm.validate();
}
</script>

Call validate function on form submit,
<form name="frmValidateLogin" onsubmit="return validateLoginForm()">
  <input type="text" name="userName">
  <input type="submit" value="Submit">
</form>
*/

// Data types
var TEXT=0, EMAIL_ADDRESS=1, NUMBER=2, POS_INT=3, NEG_INT=4, NZ_POS_INT=5, NZ_NEG_INT=6, POSTAL_CODE=7, ZIP_CODE=8, JPG=9;

// Element types
var TEXTBOX="textbox", CHECKBOX="checkbox", RADIO="radio";

/* Returns true if the value is an email address. */
function isEmailAddress(value) {
  var regex = /^[\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,3}$/;
    if (!regex.test(value)) {
      return false;
    } else {
      return true;
    }
}

/* Returns true if the value is a postal code. */
function isPostalCode(value){
  var regex = /^[a-zA-Z]\d[a-zA-Z][\s]*\d[a-zA-Z]\d$/;
  if (!regex.test(value)) {
    return false;
  } else {
    return true;
  }
}

/* Returns true if the value is a zip code. */
function isZipCode(value){
  var regex = /^[\d]{5}$/;
    if (!regex.test(value)) {
      return false;
    } else {
      return true;
  }
}

/* Returns true if the value is undefined, null, or an empty string. */
function isEmpty(value) {
  return (typeof(value) == "undefined" || (value == null) || (value == ""));
}

/* Returns true if the value is a numeric value. */
function isNumber(value) {
  var regex = /^[-]*[\d]*[\.]{0,1}[\d]*$/;
  if(!regex.test(value)) {
    return false;
  } else {
    return true;
  }
}

/* Returns true if the value ends with a specified string. */
function endsWith(value,end,ignoreCase) {
	if (value.length-end.length<0) return false;
	var ending = value.substring(value.length-end.length,value.length);

	if (ignoreCase) {
		return (ending.toUpperCase() == end.toUpperCase());
	} else {
		return (ending == end);
	}
}

/* Returns true if the value is an integer. */
function isInteger(value) {
  var regex = /^[-]*[\d]+$/;
  if(!regex.test(value)) {
    return false;
  } else {
    return true;
  }
}

/*
* Trims leading and trailing whitespace.
*/
String.prototype.trim = function() {
  var x=this;
  if(x == null) {
  	return false;
  }
  return x.replace(/(^\s+)|(\s+$)/g,"");
}


function JSForm() {
  this.elementList = new Array();

  if(typeof(_jsform_prototype_called) == "undefined") {
    _jsform_prototype_called = true;
    JSForm.prototype.validate = validate;
    JSForm.prototype.addElement = addElement;
  }

  function addElement(element) {

 	 if (typeof((new Array()).push) == "undefined") {
  		function push() {
  			for (var i = 0 ; i < arguments.length ; i++) {
           		this[this.length] = arguments[i];
            }
      	} Array.prototype.push = push;
  	 }

     this.elementList.push(element);
  }

  function validate() {
    for (i=0; i < this.elementList.length; i++) {
      element = this.elementList[i];
      if(!element.validate())
        return false;
    }

    return true;
  }

}

function JSFormElement(elementObject, elementType, required, errorMessage, dataType) {
  this.elementObject = elementObject;
  this.elementType = elementType;
  this.required = required;
  this.errorMessage = errorMessage;
  this.dataType = dataType;

  if (typeof(_formelement_prototype_called) == "undefined") {
    _jsformelement_prototype_called = true;
    JSFormElement.prototype.validate = validate;
    JSFormElement.prototype.displayError = displayError;
  }

  function validate() {
    if(this.required) {
      if(this.elementType == RADIO) {
        checked = false;

        for(j=0; j < this.elementObject.length; j++) {
          if(this.elementObject[j].checked == true) {
            checked = true;
          }
        }
        if(!checked) {
          displayError(this.errorMessage, this.elementObject);
          return false;
        }
      } else if(this.elementType == CHECKBOX) {
        if(!this.elementObject.checked) {
          displayError(this.errorMessage, this.elementObject);
          return false;
        }
      } else {
        switch(parseInt(this.dataType)) {
          case parseInt(TEXT):
            if(isEmpty(this.elementObject.value)) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(EMAIL_ADDRESS):
            if(isEmpty(this.elementObject.value) || !isEmailAddress(this.elementObject.value)) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(NUMBER):
            if(isEmpty(this.elementObject.value) || !isNumber(this.elementObject.value)) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(POS_INT):
            if(isEmpty(this.elementObject.value) || !isInteger(this.elementObject.value) || this.elementObject.value < 0) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(NZ_POS_INT):
            if(isEmpty(this.elementObject.value) || !isInteger(this.elementObject.value) || this.elementObject.value < 1) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(NEG_INT):
            if(isEmpty(this.elementObject.value) || !isInteger(this.elementObject.value) || this.elementObject.value > 0) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(NZ_NEG_INT):
            if(isEmpty(this.elementObject.value) || !isInteger(this.elementObject.value) || this.elementObject.value > 1) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(POSTAL_CODE):
            if(isEmpty(this.elementObject.value) || !isPostalCode(this.elementObject.value)) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(ZIP_CODE):
            if(isEmpty(this.elementObject.value) || !isZipCode(this.elementObject.value)) {
              displayError(this.errorMessage, this.elementObject);
              return false;
            }
            break;
          case parseInt(JPG):
            if (!endsWith(this.elementObject.value,"JPG",true)) {
             	displayError(this.errorMessage, this.elementObject);
            	return false;
            }
            break;
          default:
        }
      }
    } else {

    }

    return true;
  }
	
	/* Pops up and alert box and draws focus to element. */	
  function displayError(errorMessage, element) {
    alert(errorMessage);
    if(typeof(element.value) != "undefined")
      element.focus();
  }
}


