var errorMessage = "";
var errorFocus = null;

function validateEmailOrEmpty(formField, fieldName) {
  var valid = true;
  if (!isEmpty(formField)) {
    email = formField.value;
    var firstAtSign = email.indexOf('@');
    var lastDot = email.lastIndexOf('.');

    valid = (
      lastDot > (firstAtSign + 1)
      && lastDot < (email.length - 1)
      && firstAtSign > 0
    )
  }

  if (!valid) {
    addError(formField, fieldName + " must be a valid email address (or blank)");
  }
  return valid;
}

function validateEmail(formField, fieldName) {

  var valid = false;
  if (!isEmpty(formField)) {
    email = formField.value;
    var firstAtSign = email.indexOf('@');
    var lastDot = email.lastIndexOf('.');

    valid = (
      lastDot > (firstAtSign + 1)
      && lastDot < (email.length - 1)
      && firstAtSign > 0
    )
  }

  if (!valid) {
    addError(formField, fieldName + " must be a valid email address");
  }
  return valid;
}

function validateMultiRadio(form, startIndex, endIndex, fieldRealName, requiredValue, requiredName) {
/*
  var selection = false;

  for (var i = startIndex; i <= endIndex; i++) {
    var radio = form[i];
    if (radio.checked && radio.value == requiredValue) {
      selection = true;
    }
  }

  if (selection == false) {
    addError(form[startIndex], "at least one " + fieldRealName + " must be marked \"" + requiredName + "\"");
  }

  return selection;
*/
  return true;
}

function validateRadio(formField, fieldName) {
  for (var i = 0; i < formField.length; i++) {
    if (formField[i].checked) {
      return true;
    }
  }

  addError(formField[0], "at least one " + fieldName + " must be checked");

  return false;
}

function validateSelect(formField, fieldName) {
  var selected = formField.selectedIndex;
  if (selected == -1 || formField.options[selected].value == "") {
    addError(formField, "a " + fieldName + " must be selected");
    return false;
  }

  return true;
}

function validateNumeric(formField, fieldName) {
  var valid = false;
  if(!isEmpty(formField)) {
    valid = !isNaN(formField.value);
  }

  if (!valid) {
    addError(formField, fieldName + " must be numeric (should not contain commas, $'s, etc.)");
    return false;
  }
  return true;
}

function validateNumericOrEmpty(formField, fieldName) {
  var valid = true;
  if(isEmpty(formField)) {
    valid = !isNaN(formField.value);
  }

  if (!valid) {
    addError(formField, fieldName + " must be numeric");
    return false;
  }
  return true;
}

function validateNumericLength(formField, fieldName, fieldLength) {
  if (formField.value.length != fieldLength) {
    addError(formField, fieldName + " must contain " + fieldLength + " digits");
    return false;
  }

  return validateNumeric(formField, fieldName);
}

function validateNumericLengthOrEmpty(formField, fieldName, fieldLength) {
  if (isEmpty(formField)) {
    return true;
  } else {
    valid = validateNumericLength(formField, fieldName, fieldLength);
    if (!valid) {
      errorMessage += " (or be blank)";
    }
    return valid;
  }
}

function validateText(formField, fieldName) {
  if (isEmpty(formField)) {
    addError(formField, fieldName + " must be specified");
    return false;
  } else {
    return true;
  }
}

function validateConfirmText(formField, formFieldConfirm, fieldName) {
  if (isEmpty(formField)) {
    addError(formField, fieldName + " must be specified");
    return false;
  } else if (isEmpty(formFieldConfirm)) {
    addError(formFieldConfirm, fieldName + " confirmation must be specified");
    return false;
  } else if (formField.value != formFieldConfirm.value) {
    addError(formField, fieldName + " confirmation must match " + fieldName);
    return false;
  } else {
    return true;
  }
}

function isEmpty(formField) {
  if (formField.value.length == 0) {
    return true;
  }
  for (var i = 0; i < formField.value.length; i++) {
    var c = formField.value.charAt(i);
    if (c != ' ' && c != '\t' && c != '\r' && c != '\n') {
      return false;
    }
  }

  formField.value = "";
  return true;
}

function addError(formField, message) {
  if (errorFocus == null) {
    errorFocus = formField;
  }

  errorMessage += ("\n   * " + message);
}

function writeErrorMessage() {
  if (errorMessage != "") {
    message = "Please check the form:";
    message += errorMessage;

    alert(message);
    errorFocus.focus();

    return false;
  } else {
    return true;
  }
}

function clearValidate() {
  errorMessage = "";
  errorFocus = null;
}

function validatePositiveOrEmpty(formField, fieldName) {
  if (formField.value != "") {
    if (!validateNumeric(formField, fieldName)) {
      return false;
    }
    
    if (formField.value < 0) {
      addError(formField, fieldName + " can not be negative");
      return false;
    }
  }
  
  return true;
}

function validateNumericGreaterThanOrEqualOrEmpty(gtField, ltField, gtName, ltName) {
  if ((gtField.value == "" && ltField.value != "") || (gtField.value != "" && ltField.value == "")) {
    addError(ltField, ltName + " and " + gtName + " must both be completed (or blank)");
    return false;
  } else if (gtField.value == "" && ltField.value == "") {
    return true;
  } else if (!validateNumeric(gtField, gtName) || !validateNumeric(ltField, ltName)) {
    return false;
  }

  if (gtField.value >= ltField.value) {
    return true;
  } else {
    addError(ltField, gtName + " must be greater than or equal to " + ltName);
    return false;
  }
}

function validateSelectGreaterThanOrEmpty(gtSelect, ltSelect, gtName, ltName) {
  var ltGreatestSelected = -1;
  var gtLeastSelected = 99999999999;
  
  for (var i = 0; i < ltSelect.options.length; i++) {
    if (ltSelect.options[i].selected && (ltSelect.options[i].value != "") && (ltSelect.options[i].value > ltGreatestSelected)) {
      ltGreatestSelected = ltSelect.options[i].value;
    }
  }
  
  for (var i = 0; i < gtSelect.options.length; i++) {
    if (gtSelect.options[i].selected && (gtSelect.options[i].value != "") && (gtSelect.options[i].value < gtLeastSelected)) {
      gtLeastSelected = gtSelect.options[i].value;
    }
  }
  
  if (ltGreatestSelected != -1 && gtLeastSelected != -1) {
    if (gtLeastSelected <= ltGreatestSelected) {
      addError(ltSelect, gtName + " must be greater than " + ltName);
      return false;
    }
  }

  return true;
}
