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 = "";
  var messages = "";
  
  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){
        var myElement = myForm.elements[i];
        eval('var myElementLabel = document.getElementById(\'' + rulesArray[x].elementName + '_label\')');
        eval('var myErrorLabel = document.getElementById(\'' + rulesArray[x].elementName + '_msg\')');
        if(rulesArray[x].alertType == "alert"){
          messages += rulesArray[x].errorMessage + "\n";
        }else{
          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(rulesArray[x].alertType == "label")
        myErrorLabel.innerHTML = message;
      if(rulesArray[x].alertType == "highlight")
        myElement.style.backgroundColor = "#FBFCBE";
      validationFailed = true;
    }else{
      if(rulesArray[x].alertType == "label")
        myErrorLabel.innerHTML = "";
      if(rulesArray[x].alertType == "highlight")
        myElement.style.backgroundColor = "#FFFFFF";
    }
  }
  
  if(validationFailed){
    if(messages != "")
      alert(messages);
    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, alertType, 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";
  
}
