/* begin form validation */

// form validation variables
var index = 0;
validateCodes = new Array();
nameCodes = new Array();

// codes
var NONE = 0;
var NULL = 100;
var TEXT = 1;
var NUMBER = 2;
var TEXT_NUMBER = 3;
var EMAIL = 4;
var YEAR = 5;
var MONTH = 6;
var DAY = 7;
var DATE = 8;
var ZIP = 9;
var ZIP1 = 10;
var ZIP2 = 11;
var PHONE3 = 12;
var PHONE4 = 13;

function addFieldName(name,value) {
  nameCodes[index] = name;
  validateCodes[index++] = value;
}

function isText(value) {
  var i;
  for (i=0;i<value.length;i++) {
    if (!(isLetter(value.charAt(i)) || isValidSymbol(value.charAt(i)))) {
      return false;
    }
  }
  return true;
}

function isNumeric(value) {
  var i;
  for (i=0;i<value.length;i++) {
    if (!isDigit(value.charAt(i))) {
      return false;
    }
  }
  return true;
}

function isNumber(value) {
  var i;
  for (i=0;i<value.length;i++) {
    if (!(isDigit(value.charAt(i))/* || value.charAt(i) == '.'*/)) {
      return false;
    }
  }
  return true;
}

function isTextNumeric(value) {
  var i;
  for (i=0;i<value.length;i++) {
    if (!(isLetter(value.charAt(i)) || isValidSymbol(value.charAt(i)) ||
      isDigit(value.charAt(i)))) {
      return false;
    }
  }
  return true;
}

function isEmail(value) {
  atFound = false;
  dotFound = false;
  var i;

  for (i=0; i<value.length; i++) {
    if (value.charAt(i) == '@') {
      atFound = true;
      i++;
      break;
    }
    if (!isNameSymbol(value.charAt(i))) {
      return false;
    }
  }
  if (!atFound || i >= value.length) {
    return false;
  }
  if (!isNameSymbol(value.charAt(i++))) {
    return false;
  }
  for (; i<value.length; i++) {
    if (value.charAt(i) == '.') {
      dotFound = true;
      i++;
      break;
    }
    if (!isNameSymbol(value.charAt(i))) {
      return false;
    }
  }
  if (!dotFound || i >= value.length) {
    return false;
  }
  if (!isNameSymbol(value.charAt(i++))) {
    return false;
  }
  for (; i<value.length; i++) {
    if (!isNameSymbol(value.charAt(i))) {
      return false;
    }
  }
  return true;    
}

function isDigit(value) {
  switch (value) {
    case '0': case '1': case '2': case '3': case '4': case '5': case '6':
    case '7': case '8': case '9': return true;
    default: return false;
  }
}

function isLetter(value) {
  switch (value) {
    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': 
    case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': 
    case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': 
    case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': 
    case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': 
    case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': 
    case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': 
    case 'X': case 'Y': case 'Z': return true;
    default: return false;
  }
}

function isNameSymbol(value) {
  if (isLetter(value) || isDigit(value))
    return true;
  switch (value) {
    case '-': case '.': case '_': return true;
    default: return false;
  }
}

function isValidSymbol(value) {
  switch (value) {
    case '-': case '@': case '#': case '%': case '&': case '*': case '(':
    case ')': case '_': case '+': case '=': case '{': case '}': case '[':
    case ']': case '?': case '.': case ' ': case '/': case '\'': case '\\':
    case ',': case '$': case ':': return true;
    default: return false;
  }
}

function checkForm (form) {
  for (var i=0; i < index; i++) {
    var codeName = nameCodes[i];
    var code = validateCodes[i];
    var field = eval("form.elements[\"" + codeName + "\"]");
    if (!checkField(field,code)) {
      return false;
    }
  }
  return true;
}

function checkField(field,code) {
  var value = field.value;
  if (code >= parseInt(NULL)) {
    if (value.length <= 0) {
      return incorrectField(field,"The selected field must contain a value.");
    } else {
      code -= parseInt(NULL);
    }
  } else {
    if (value.length <= 0) {
      return true;
    }
  }

  if (TEXT == code) {
      if (!isText(value)) {
        return incorrectField(field,"The selected field contains invalid characters.");
      }
  } else if (NUMBER == code) {
      if (!isNumber(value)) {
        return incorrectField(field,"The selected field may only contain numeric characters.");
      }
  } else if (TEXT_NUMBER == code) {
      if (!isTextNumeric(value)) {
        return incorrectField(field,"The selected field contains invalid characters.");
      }
  } else if (EMAIL == code) {
      if (!isEmail(value)) {
        return incorrectField(field,"The selected field contains an invalid email address.\n" +
          "An example of a valid address is 'jon@domain.com'.");
      }
  } else if (YEAR == code) {
      if (!(isNumeric(value) && value.length == 4)) {
        return incorrectField(field,"The selected year field must be four digits.");
      }
  } else if (MONTH == code) {
      if (!(isNumeric(value) && value.length == 2)) {
        return incorrectField(field,"The selected month field must be two digits.");
      } else if (parseInt(value,10) < 1 || parseInt(value,10) > 12) {
        return incorrectField(field,"The selected month field must be between 01 and 12.");
      }
  } else if (DAY == code) {
      if (!(isNumeric(value) && value.length == 2)) {
        return incorrectField(field,"The selected day field must be two digits.");
      } else if (parseInt(value,10) < 1 || parseInt(value,10) > 31) {
        return incorrectField(field,"The selected day field must be between 01 and 31.");
      }
  } else if (ZIP == code) {
      if (!(isNumeric(value) && value.length == 9)) {
        return incorrectField(field,"The selected zip code field must be nine digits.");
      }
  } else if (ZIP1 == code) {
      if (!(isNumeric(value) && value.length == 5)) {
        return incorrectField(field,"The selected zip code field must be five digits.");
      }
  } else if (ZIP2 == code) {
      if (!(isNumeric(value) && value.length == 4)) {
        return incorrectField(field,"The selected zip code field must be four digits.");
      }
  } else if (PHONE3 == code) {
      if (!(isNumeric(value) && value.length == 3)) {
        return incorrectField(field,"The selected phone field must be three digits.");
      }
  } else if (PHONE4 == code) {
      if (!(isNumeric(value) && value.length == 4)) {
        return incorrectField(field,"The selected phone field must be four digits.");
      }
  }
  return true;
}

function checkFormRange(form,start,length) {
  for (var i=start; i < parseInt(start)+parseInt(length); i++) {
    var codeName = nameCodes[i];
    var code = validateCodes[i];
    var field = eval("form.elements[\"" + codeName + "\"]");
    if (!checkField(field,code)) {
      return false;
    }
  }
  return true;
}

function incorrectField(field,msg) {
  window.alert(msg);
  field.focus();
  field.select();
  return false;
}

/* end form validation */
