// JavaScript Document - Form check v1.0

FC_CHECKBOX = "isChecked";
FC_RADIO = "isChecked";
FC_SELECT = "isSelected";
FC_SELECTV = "isSelectedValue";

FC_EMAIL = "isEmail";
FC_INTEGER = "isInteger";
FC_DECIMAL = "isDecimal";
FC_DATE = "isDate";
FC_IP = "isIP";
FC_PATH = "isPath";

FC_BOOLEAN = "booleanPatch";

FC_COMPULSORY = true;
FC_OPTIONAL = false;

function FormChecker() {
  this.fcFirstError = false;
  this.fcShowError = true;
  this.fcSelectControl = false;
  this.fcNullValueSelect = "";
}

function checkForm_FormChecker(pattern, f) {
  this.pattern = pattern;
  this.fcErrMsg = "";
  this.fcErrField = new Array();

  var bools = new Array();
  for (var c = 0; c < pattern.length; c++) {
    id = pattern[c][0];
    name = pattern[c][1];
    checkMethod = pattern[c][2];
    isCompulsory = pattern[c][3];
    fField = f.elements[id];
      if (fField.tagName != undefined) {
         if ((fField.tagName.toLowerCase() == 'input') && (fField.type.toLowerCase() == 'text')) fField.className = 'text';
         else if (fField.tagName.toLowerCase() == 'textarea') fField.className = 'form_textarea';
      }
     if (isUndefined(fField)) {
      info_box("'" + id + "' " + fcErrorMsgFieldNoDefined(), "");
      return false;
    } else {
      if (checkMethod == FC_BOOLEAN) {
        if (!fField.checked) bools[bools.length] = id;
        continue;
      }
      fieldType = (isDefined(fField.type)) ? fField.type : fField[0].type;
      switch (fieldType) {
       case "select-one":
       case "select-multiple":
        if (isUndefined(checkMethod)) checkMethod = FC_SELECT;
        break;
       case "checkbox":
       case "radio":
        if (isUndefined(checkMethod)) checkMethod = FC_CHECKBOX;
        break;
       default:
        if (isUndefined(isCompulsory)) isCompulsory = FC_COMPULSORY;
        if (isEmpty(fField)) {
          if (isCompulsory && this.formError(fField, name, "compulsory")) return false;
          continue;
        }
        break;
      }
  
      if (isDefined(checkMethod)) {
        checkCommand = checkMethod + "(fField";
        moreArgs = "";
        for (var n = 4; n < pattern[c].length; n++) {
          if (moreArgs != "") moreArgs += ", ";
          moreArgs += "this.pattern[" + c + "][" + n + "]";
        }
        if (moreArgs != "") checkCommand += ", " + moreArgs;
        checkCommand += ")";
        if (!eval(checkCommand)) {
          if (this.formError(fField, name, checkMethod, moreArgs)) return false;
        }
      }
    }
  }

  if (this.fcErrMsg != "") {
    this.showError(true);
    return false;
  }

  //Boolean Patch
  for (var c = 0; c < bools.length; c++) {
    var hiddenValue = document.createElement("input");
    hiddenValue.type = "hidden";
    hiddenValue.name = bools[c];
    hiddenValue.value = 0;
    f.appendChild(hiddenValue);
  }
  return true;
}

function formError_FormChecker(field, name, checkMethod, moreArgs) {
	if (fField.tagName != undefined) {
		if ((fField.tagName.toLowerCase() == 'input') && ((fField.type.toLowerCase() == 'text') || (fField.type.toLowerCase() == 'password'))) fField.className = 'text_invalid';
		else if (fField.tagName.toLowerCase() == 'textarea') fField.className = 'form_textarea_invalid';
	}
  this.fcErrMsg += this.getErrorText(name, checkMethod, moreArgs) + "<br />";
  this.fcErrField[this.fcErrField.length] = field;
  if (this.fcFirstError) this.showError(true);
  return this.fcFirstError;
}

function getErrorText_FormChecker(name, checkMethod, moreArgs) {
  return "'" + name + "' : " + eval("fcErrorMsg_" + checkMethod + "(" + moreArgs + ")");
}

function showError_FormChecker(modeCheck) {
  if (this.fcShowError || !modeCheck) info_box(this.fcErrMsg, fcErrorMsgHeader());
  if (this.fcErrField.length > 0 && this.fcSelectControl) selectControl(this.fcErrField[0]);
}

FormChecker.prototype.checkForm = checkForm_FormChecker;
FormChecker.prototype.formError = formError_FormChecker;
FormChecker.prototype.getErrorText = getErrorText_FormChecker;
FormChecker.prototype.showError = showError_FormChecker;
