function validateForm(frm) {
  var errorstr = "";
  var tempArray = new Array;
  var data;
  var re_ws = /\s/;
  var re_num = /^(\+|-)?(\d*\.\d*|\d+|\.\d*|\d*\.)$/;
  var re_abc = /^[A-Za-z \t]*$/;
  var re_an = /^[A-Za-z \t0-9]*$/;
  var re_email = /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+.*$/;
  var re_url = /^(http:\/\/|ftp:\/\/)?[A-Za-z0-9_]+\.[A-Za-z0-9_]+.*$/;

  password = '';
  for (var i = 0; i < frm.elements.length; i++) {
    if (frm.elements[i].name.indexOf("VALIDATOR") != -1) {
      fieldName = frm.elements[i].name.substring(9);  // Get name of field to validate
      infoString = frm.elements[i].value;
      caption = frm.elements["CAPTION" + fieldName].value;
      tempArray = infoString.split("_");
      fieldType = tempArray[0];    // Get type of field to validate
      flags = tempArray[1];        // Get flags determining valid values
      
      mandatory = (flags.indexOf("YES") == -1) ? 0 : 1;   // Field mandatory?
      alphanumeric = (flags.indexOf("ALPHANUMERIC") == -1) ? 0 : 1;   // Can contain alphanumeric characters?
      nowhitespace = (flags.indexOf("NOWHITESPACE") == -1) ? 0 : 1;   // Allow whitespace?
      numbersOnly = (flags.indexOf("NUMBERS") == -1) ? 0 : 1;   // Allow numbers and +-. only?
      alphaOnly = (flags.indexOf("ALPHABETIC") == -1) ? 0 : 1;   // Allow a-z, A-Z only?
      URL = (flags.indexOf("URL") == -1) ? 0 : 1;   // Allow valid URL only?
      email = (flags.indexOf("EMAIL") == -1) ? 0 : 1;   // Allow valid email address only?
      
      data = "";
      errorField = fieldName;   // Field to focus on when an error flagged
      if (fieldType == "TEXTAREA")
        RegExp.multiline = true;
      
      if (fieldType == 'TIME') {
        errorField = '';
        hour = frm.elements[fieldName + "_hour"].value;
        minute = frm.elements[fieldName + "_minute"].value;
        second = frm.elements[fieldName + "_second"].value;
        minute = (minute == '') ? '0' : minute;
        second = (second == '') ? '0' : second;
        if (hour == '' && !mandatory)
          continue;
       // if (hour == '' && minute == '' && second == '' && !mandatory)
        //  continue;
        if (hour.search(re_num) != -1) {
          if (minute.search(re_num) != -1) {
            if (second.search(re_num) != -1) {
              if (hour >= 0 && hour < 24) {
                if (minute >= 0 && minute < 60) {
                  if (second >= 0 && second < 24) {
                  
                  } else
                    errorField = fieldName + "_second";
                } else
                  errorField = fieldName + "_minute";
              } else
                errorField = fieldName + "_hour";
            } else
              errorField = fieldName + "_second";
          } else
            errorField = fieldName + "_minute";
        } else 
          errorField = fieldName + "_hour";
        
        if (errorField != '') {
          errorstr += caption + " (time not filled in correctly)\n";
          break;
        } else
          continue;
      }
      
      if (fieldType == 'DATE') {
        if (!mandatory && frm.elements[fieldName + "_day"].value == '' && frm.elements[fieldName + "_month"].value == '' && frm.elements[fieldName + "_year"].value == '')
          continue;
        ok = 1;  
        if (frm.elements[fieldName + "_day"].value.search(re_num) != -1) {
           if (frm.elements[fieldName + "_day"].value < 0 || frm.elements[fieldName + "_day"].value > 31) {
             ok = 0;
             errorField = fieldName + "_day";
           }
        } else 
          ok = 0;
        if (frm.elements[fieldName + "_month"].value.search(re_num) != -1) {
           if (frm.elements[fieldName + "_month"].value < 0 || frm.elements[fieldName + "_month"].value > 12) {
             ok = 0;
             errorField = fieldName + "_month";
           }
        } else 
          ok = 0;
                if (frm.elements[fieldName + "_year"].value.search(re_num) != -1) {
           if (frm.elements[fieldName + "_year"].value < 0 || frm.elements[fieldName + "_year"].value > 2030) {
             ok = 0;
             errorField = fieldName + "_year"
           }
        } else {
          ok = 0;
          errorField = fieldName + "_day";
        }
          
        if (!ok) {
          errorstr += caption + " (date not filled in correctly)\n";
          break;
        }
        continue;
      } else
        data = frm.elements[fieldName].value;
      
      if (!data) 
        data = "";

      if (!mandatory && data == "") {
        continue;
      }
              
      if (fieldType == 'SELECT')
        data = frm.elements[fieldName].options[frm.elements[fieldName].selectedIndex].value;
        
      if (fieldType == 'RADIO') {
        for (var i2 = 0; i2 < frm.elements[fieldName].length; i2++) {
          if (frm.elements[fieldName][i2].checked)
            data = "avalue";
        }
      }
      
      if (fieldType == 'PASSWORD') 
        password = data;
      if (mandatory && data == "") {
        errorstr += caption + " (must contain a value)\n";
        break;
      }
      if (nowhitespace && data.search(re_ws) != -1) {
        errorstr += caption + " (may not contain spaces)\n";
        break;
      }
      if (numbersOnly && data.search(re_num) == -1) {
        errorstr += caption + " (may only contain numbers)\n";
        break;
      }
      if (alphaOnly && data.search(re_abc) == -1) {
        errorstr += caption + " (may only contain alphabetic characters)\n";
        break;
      }
      if (alphanumeric && data.search(re_an) == -1) {
        errorstr += caption + " (may only contain alphanumeric characters)\n";
        break;
      }
      if (email && ((data.search(re_email) == -1) || (data.search(re_ws) != -1))) { // Check for whitespace by default
        errorstr += caption + " (must be a valid email address)\n";
        break;
      }
      if (URL && ((data.search(re_url) == -1) || (data.search(re_ws) != -1))) { // Check for whitespace by default
        errorstr += caption + " (must be a valid URL)\n";
        break;
      }
      if (URL && (data.substr(0,7) != 'http://')) {
        data = 'http://' + data;
      }
      if (fieldType == "TEXTAREA")
        RegExp.multiline = false;
    }
  }

  if(errorstr == "") {
    if (password != '') {
      pass2 = prompt("Please retype your password to confirm", '');
      if (pass2 != password) {
        alert("The passwords you have supplied do not match.\nPlease try again.");
        return false;
      }
    }
    //frm.submit();
    //return false;
		return true;
  }
  alert("You must enter the following fields correctly before proceeding:\n\n" + errorstr + "\n");
  frm.elements[errorField].focus();
  return false;
}

function checkTextfieldLength(src, dst, maxLength)
{
  fieldLength = src.value.length;
  if (fieldLength >= maxLength) {
    if (document.all)
      src.value = src.value.substring(0, maxLength);
    charsRemaining = ' NO';
  } else
    charsRemaining = maxLength - fieldLength;
  dst.value = charsRemaining;
}
