String.prototype.trim = function() {
  // trim leading and trailing whitespace
  return this.replace(/^\s*(\b.*\b|)\s*$/, "$1");
}

function validator(myForm, rulesArray){
  
  var validationFailed = false;
  var message = "";
  
  for(var x=0; x<rulesArray.length; x++){
    
    for(var i=0; i<myForm.length; i++){
      if(myForm.elements[i].name.indexOf(rulesArray[x].elementName) == 0){
        message = "";
        var myElement = myForm.elements[i];
        var myErrorLabel = false;
        eval('if(document.getElementById(\'' + rulesArray[x].elementName + '_msg\')) var myErrorLabel = document.getElementById(\'' + rulesArray[x].elementName + '_msg\')');
        message = rulesArray[x].errorMessage;
      }
    }
    
    // is this form element a part of an array?
    if(myElement.type == "radio" || myElement.type == "checkbox"){
      eval('var returnValue = checkArray(myForm, myElement.name);');
    }else{
      eval('var returnValue = ' + rulesArray[x].rule + '(myElement);');
    }
    
    if(!returnValue){
      if(myErrorLabel){
		myErrorLabel.innerHTML = (message + '<br />');
	  }
      else{
        myElement.style.backgroundColor = "#FFcccc";
	  }
      validationFailed = true;
  		
	}else{
      if(myElement.type == "radio" || myElement.type == "checkbox")
        myErrorLabel.innerHTML = "";
      else
        myElement.style.backgroundColor = "#FFFFFF";
    }

  }
  
  if(validationFailed){
	document.getElementById('errorMessage').innerHTML = "Your form has <strong>not</strong> been submitted.<br />Please ensure that all fields have been completed correctly.";
	document.getElementById('errorMessage').style.border = "#FF0000 solid 1px";
		document.getElementById('errorMessage').style.backgroundColor = "#FFcccc";
		document.getElementById('errorMessage').style.padding = "5px";
		document.getElementById('errorMessage').style.marginTop = "10px";
    return false;
  }
  
  return true;
  
}

function isNumeric(myElement){
  
  var myValue = new String(myElement.value);
  myValue.trim();
  
  var v = 1.0 * myElement.value ;
  if ( v == 0.0 || isNaN(v) )
    return false ;
  else
    return true ;
}

function isFilled(myElement){
  var myValue = new String(myElement.value);
  if(myValue.trim() == "" || myValue.trim() == null)
    return false;
  else
    return true;
}

function isEmail(myElement){
  var myValue = new String(myElement.value);
  myValue.trim();
  
  var reg = /^.+@.+\..{2,4}$/;
  if(myValue.match(reg))
    return true;
  else
    return false;
}

function isPhone(myElement){
  var myValue = new String(myElement.value);
  myValue.trim();
  
  var reg = /\(?\d{3}\)?([-\/\.])\d{3}\1\d{4}/;
  if(myValue.match(reg))
    return true;
  else
    return false;
}

function isChecked(myElement){
  for(var x=0; x<myElement.length; x++){
    if(myElement[x].checked)
      return true;
  }
  return false;
}

function checkArray(myForm, elementName){
  
  for(var i=0; i<myForm.length; i++){
    if(myForm.elements[i].name.indexOf(elementName) == 0){
      if(myForm.elements[i].checked)
        return true;
    }
  }
  return false;
}

function isSelected(myElement){
  if(myElement.selectedIndex > 0)
    return true;
  return false;
}

function rule(formElementName, rule, errorMessage){
  
  this.elementName = formElementName;
  this.errorMessage = errorMessage;
  //this.alertType = alertType;
  
  if(rule == "email") this.rule = "isEmail";
  if(rule == "phone") this.rule = "isPhone";
  if(rule == "notnull") this.rule = "isFilled";
  if(rule == "checked") this.rule = "isChecked";
  if(rule == "selected") this.rule = "isSelected";
  if(rule == "number") this.rule = "isNumeric";
  
}
