function validateEmail (s) {
  var patDomain = /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
  var patEmail = /^(.+)@(.+)$/;
  var charsSpecial = "\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
  var charsValid = "\[^\\s" + charsSpecial + "\]";
  var quoted = "(\"[^\"]*\")";
  var patIP = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
  var atom = charsValid + "+";
  var word = "(" + atom + "|" + quoted + ")";
  var patUser = new RegExp ("^" + word + "(\\." + word + ")*$");
  var patDomain = new RegExp ("^" + atom + "(\\." + atom + ")*$");
  var match = s.match (patEmail);
  
  if (match == null)
    return false;
  
  var user = match [1];
  var domain = match [2];
  
  for (var i = 0; i < user.length; i++)
    if (user.charCodeAt (i) > 127)
      return false;
  
  for (var i = 0; i < domain.length; i++)
    if (domain.charCodeAt (i) > 127)
      return false;
  
  if (user.match (patUser) == null)
    return false;
  
  var ip = domain.match (patIP);
  if (ip != null) {
    for (var i = 1; i <= 4; i++)
      if (ip [i] > 255)
        return false
    return false;
  }
  
  var patAtom = new RegExp ("^" + atom + "$");
  var dom = domain.split (".");
  var len = dom.length;
  
  for (var i = 0; i < len; i++)
    if (dom [i].search (patAtom) == -1)
      return false;
  
/*
  if (checkTLD && dom [dom.length - 1].length != 2 && dom [dom.length - 1].search (patDomain) == -1)
    return false;
*/

  if (len < 2)
    return false;
  
  return true;
}

function validateForm () {
  var p, q, fieldName, test, num, min, max, errors = "", args = validateForm.arguments;
  var fields;
  
  if (args.length > 0)
    fields = args [0];
  for (var i = 0; i < fields.length; i++) {
    fieldName = fields [i][2];
    test = fields [i][1];
    val = findObject (fields [i][0]);
    if (val) {
      if ((val = val.value) != "") {
        if (test.indexOf ("isEmail") != -1) {
          if (!validateEmail (val))
            errors += "- " + fieldName + " must contact an email address.\n";
        }
        else if (test != "R") {
          num = parseFloat (val);
          if (isNaN (val))
            errors += "- " + fieldName + " must contain a number.\n";
          if (test.indexOf ("inRange") != -1) {
            p = test.indexOf (":");
            min = test.substring (8, p);
            max = test.substring (p + 1);
            if (num < min || max < num)
              errors += "- " + fieldName + " must contain a number between " + min + " and " + max + ".\n";
          }
        }
      }
      else if (test.charAt (0) == 'R')
        errors += "- " + fieldName + " is required.\n";
    }
  }
  if (errors)
    alert ("The following error(s) occurred:\n" + errors);
  return (errors == "");
}

var checkTLD = true;