var Errors = new Array();
var ErrorFields = new Array();
var AktDate = new Date();
var AktYear = AktDate.getFullYear();
var BgColors = new Array("#FFFFFF", "#E3E4E8");
var RadioBorders = new Array("none", "1px solid #FED080");
var ZusHidden = "Selected";
var ZusDatum = new Array("Tag", "Monat", "Jahr");
var MainSelectionValues = "Main";
var SubSelection = "Type";
var SelectionValues = "Data";
var AdditionalType = "Sonstiges";
var AdditionalValue = "Value";
var CheckValues = new Array("ja", "nein");
var ErrorBaseText = "Please fill out/correct this fields:";
var ResetText = "Reset all?";
var ReloadText = "Reset all?";

var InputWin;
var WinData = "width=350,height=140,left=300,top=400,resizable=no";
/* var WinSource = "select.php";  --> hier auf jeweiliger Formularseite deklariert */

var MinLength = 2;
var PLZ_MinLength = 1;
var PLZ_IsExact = false;
var Phone_MinLength = 3;
var Phone_Vorwahl = false;
var Fax_MinLength = 3;
var Fax_Vorwahl = false;
var Mail_MinLength = 6;
var CurrencyMode = "de";

var MaxAge = 110;
var TerminIsExact = false;                  /* Angabe Tag erforderlich */
var TerminMonths = 24;

var Numbers = "1234567890";
var Decimals = ".,-";
var Phone_AddSigns = " -/.+";
var SignsVorwahl = "+0";
var Mail_Forbidden = " ,;:/!'" + '"';
var FieldTypes = "textarea~password";
var ZusFields = "~radio~checkbox~select-one";

// Formular-Prüfung (submit)
// *************************
// Inhalt:
// - function CheckData                     - Aufruf durch submit
// - function CheckGroup
// - function IsGroupEntry
// - function CheckEntries                  - Entfernung störender Zeichen

function CheckData()
{ var i;
  var OK = true;
  if (CheckEntries())
  { Errors = new Array();
    ErrorFields = new Array();
    for (i = 0; i < FormGroups.length; i++)
    { if (FormGroups[i][3])
      { CheckGroup(i);
      }
      else if (IsGroupEntry(i))
      { CheckGroup(i);
      }
    }

    if (ErrorFields.length > 0)
    { OK = false;

     // SetErrorFocus();
      alert(GetErrorMessage());
    }
  }
  return OK
}

function CheckGroup(Nr)
{ var FldArr = eval(FormGroups[Nr][1]);
  var i, Code;
  for (i = 0; i < FldArr.length; i++)
  { Code = FldArr[i][2] + "(" + Nr.toString() + "," + i.toString() + ",true);";
     eval(Code);
  }
}

function IsGroupEntry(Nr)
{ var FldArr = eval(FormGroups[Nr][1]);
  var OK = false;
  var i, Code;
  for (i = 0; i < FldArr.length; i++)
  { Code = FldArr[i][2] + "(" + Nr.toString() + "," + i.toString() + ",false);";
    if (eval(Code))
    { OK = true;
      break;
    }
  }
  return OK
}

function CheckEntries()
{ var i, Obj, Typ, Val;
  for (i = 0; i < document.forms[0].elements.length; i++)
  { Obj = document.forms[0].elements[i];
    Typ = Obj.type;
    if (FieldTypes.indexOf(Typ) >= 0)
    { Val = Obj.value;
      if (Val.length > 0)
      { Obj.value = ReplaceChar(Val, '"', "´");
      }
    }
  }
  return true
}

// Prüf-Funktionen
// ***************
// Inhalt:
// - function TestNotEmpty                  - Eingabe vorhanden
// - function TestInteger                   - positive ganze Zahl
// - function TestPLZ                       - Postleitzahl
// - function TestPhone                     - Telefonnummer
// - function TestFax                       - Faxnummer
// - function TestDial
// - function TestMail                      - E-mail Adresse
// - function TestRadioChecked              - Radio-Button ausgewählt
// - function TestBoxChecked                - Checkbox bestätigt
// - function TestGroupSelection            - mindestens eine Checkbox angewählt
// - function TestMenuSelected              - Auswahl aus Dropdown-Liste getroffen
// - function TestAmmount                   - Kommazahl, 0 nicht möglich
// - function Test0Ammount                  - Kommazahl, 0 möglich
// - function TestCurrency
// - function TestTermin                    - vorausliegendes Datum
// - function TestDatum                     - zurückliegendes Datum
// - function TestDateEntry
// bedingte Prüfungen:
// - function TestConditionalRadio          - Abhängigkeit von Auswahl in Radio-Gruppe
// - function TestIfEntry                   - prüfen, wenn Eingabe vorhanden
// - function TestIfDateEntry               - prüfen, wenn Datums-Eingabe vorhanden

/* Prüfung Texteingabe vorhanden */
function TestNotEmpty(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var OK;
  if (Mode)
  { OK = (Inh.length >= MinLength);
    var ColNr = (OK) ? 0 : 1;
    Obj[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Prüfung auf positive ganze Zahl */
function TestInteger(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var OK;
  if (Mode)
  { OK = IsInteger(Inh, "+");
    var ColNr = (OK) ? 0 : 1;
    Obj[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Prüfung Postleitzahl */
function TestPLZ(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var OK;
  if (Mode)
  { OK = IsInteger(Inh, "+");
    if (OK)
    { if (PLZ_IsExact)
      { OK = (Inh.length == PLZ_MinLength);
      }
      else
      { OK = (Inh.length >= PLZ_MinLength);
      }
    }
    var ColNr = (OK) ? 0 : 1;
    Obj[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Prüfung Telefon- / Faxnummer */
function TestPhone(Group, Field, Mode)
{ var OK = TestDial(Group, Field, Mode, Phone_Vorwahl, Phone_MinLength);
  return OK
}

function TestFax(Group, Field, Mode)
{ var OK = TestDial(Group, Field, Mode, Fax_Vorwahl, Fax_MinLength);
  return OK
}

function TestDial(Group, Field, Mode, ZusMode, Len)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var Allowed = Numbers + Phone_AddSigns;
  var OK, i, Sig;
  if (Mode)
  { OK = (Inh.length >= Len);
    if (OK)
    { for (i= 0; i < Inh.length; i++)
      { Sig = Inh.substr(i, 1);
        if (Allowed.indexOf(Sig) < 0)
        { OK = false;
          break;
        }
      }
    }
    if (OK && ZusMode)
    { Sig = Inh.substr(0, 1);
      OK = (SignsVorwahl.indexOf(Sig) >= 0);
    }
    var ColNr = (OK) ? 0 : 1;
    Obj[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Prüfung E-mail Adresse */
function TestMail(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var OK, i, Sig;
  var Pos1, Pos2, Pos3;
  if (Mode)
  { OK = (Inh.length >= Mail_MinLength);
    if (OK)
    { for (i= 0; i < Inh.length; i++)
      { Sig = Inh.substr(i, 1);
        if (Mail_Forbidden.indexOf(Sig) >= 0)
        { OK = false;
          break;
        }
      }
    }
    if (OK)
    { Pos1 = Inh.indexOf("@");
      Pos2 = Inh.lastIndexOf("@");
      Pos3 = Inh.lastIndexOf(".");
      if (Pos1 <= 0) OK = false;
      if (Pos3 <= 0) OK = false;
      if (Pos1 != Pos2) OK = false;
      if (Pos1 > Pos3) OK = false;
      if (Inh.length - Pos3 < 3) OK = false;
    }
    var ColNr = (OK) ? 0 : 1;
    Obj[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Prüfung Radio-Buton ausgewählt */
function TestRadioChecked(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName + ZusHidden);
  var Obj2 = document.getElementsByName(FldName);
  var Inh = Obj[0].value;
  var OK = false;
  if (Mode)
  { OK = Inh.length > 0;
    var ColNr = (OK) ? 0 : 1;
    for (var i = 0; i < Obj2.length; i++)
    { Obj2[i].style.border = RadioBorders[ColNr];
    }
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName + "[0]");
    }
  }
  return OK
}

/* Prüfung Checkbox bestätigt */
function TestBoxChecked(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var OK = false;
  if (Mode)
  { OK = Obj[0].checked;
    var ColNr = (OK) ? 0 : 1;
    document.getElementById(FldName+"marker").style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { document.getElementById(FldName+"marker").style.background = RadioBorders[0];
  }
  return OK
}

/* Prüfung, ob aus einer Gruppe von Checkboxes mindestens eine ausgewählt
   Anzahl der Boxes in Gruppe definiert dur assoziatives Array 'GroupLength'
   GroupLength[Feldname] = Anzahl
   Namen der einzelnen Boxes: Feldname1, Feldname2, ... */
function TestGroupSelection(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName + ZusHidden);
  var Inh = Obj[0].value;
  var OK = false;
  var Obj2
  if (Mode)
  { OK = Inh.length > 0;
    var ColNr = (OK) ? 0 : 1;
    for (var i = 1; i <= GroupLength[FldName]; i++)
    { Obj2 = eval("document.forms[0]." + FldName + i.toString());
      Obj2.style.border = RadioBorders[ColNr];
    }
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName + "1");
    }
  }
  return OK
}

/* Prüfung Punkt aus Dropdown-Liste ausgewählt */
function TestMenuSelected(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName + ZusHidden);
  var Obj2 = document.getElementsByName(FldName);
  var Inh = Obj[0].value;
  var OK = false;
  if (Mode)
  { if (Inh.length > 0)
    { OK = (parseInt(Inh) > 0);
    }
    var ColNr = (OK) ? 0 : 1;
    Obj2[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName + "[0]");
    }
  }
  else
  { Obj2[0].style.backgroundColor = BgColors[0];
  }
  return OK
}

/* Prüfung Zahleneingabe (Währungsformat zulässig) */
function TestAmmount(Group, Field, Mode)		/* 0 nicht möglich */
{ TestCurrency(Group, Field, Mode, "+")
}

function Test0Ammount(Group, Field, Mode)		/* 0 möglich */
{ TestCurrency(Group, Field, Mode, "0")
}

function TestCurrency(Group, Field, Mode, Type)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var OK, Inh2, Sig, i;
  var Pos1, Pos2, Pos3, Pos4, Pos5;
  var stRight, Diff1, Diff2;
  if (Mode)
  { OK = (Inh.length > 0);
    if (OK)
    { Inh2 = Inh;
      for (i = 0; i < Decimals.length; i++)
      { Sig = Decimals.substr(i, 1);
        Inh2 = ReplaceChar(Inh2, Sig, "");
      }
      OK = IsInteger(Inh2, Type);
    }
    if (OK)
    { if (CurrencyMode == "de")
      { Pos1 = Inh.indexOf(",");
	    Pos2 = Inh.lastIndexOf(",");
        Pos3 = Inh.lastIndexOf(".");
        Pos4 = Inh.indexOf(".");
      }
      else
      { Pos1 = Inh.indexOf(".");
        Pos2 = Inh.lastIndexOf(".");
        Pos3 = Inh.lastIndexOf(",");
        Pos4 = Inh.indexOf(",");
      }
      Pos5 = Inh.indexOf("-");
      if (Pos1 != Pos2) OK = false;
      if ((Pos1 >= 0) && (Pos3 >= 0))
      { if (Pos1 - Pos3 != 4) OK = false;
      }
      if (Pos3 != Pos4)
      { if (Pos2 > 0)
        { stRight = Pos2;
        }
        else
        { if (Inh.slice(-2) == ".-")
          { stRight = Inh.length - 2;
          }
          else
          { stRight = Inh.length;
          }
        }
        Diff1 = stRight - Pos3;
        Diff2 = Pos3 - Pos4;
        if ((Diff1 % 4 != 0) || (Diff2 % 4 != 0)) OK = false;
      }
      if (Pos5 >= 0)
      { if (Pos5 != Inh.length - 1) OK = false;
      }
    }
    var ColNr = (OK) ? 0 : 1;
    Obj[0].style.backgroundColor = BgColors[ColNr];
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
      ErrorFields.push(FldName);
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Prüfung von Terminen (vorausliegendes Datum) */
function TestTermin(Group, Field, Mode)
{ var OK = TestDateEntry(Group, Field, Mode, "Termin");
  if (OK && Mode)
  { var FldArr = eval(FormGroups[Group][1]);
    var FldName = FldArr[Field][0] + FormGroups[Group][2];
    var Obj1 = document.getElementsByName(FldName + ZusDatum[0]);
    var Obj2 = document.getElementsByName(FldName + ZusDatum[1]);
    var Obj3 = document.getElementsByName(FldName + ZusDatum[2]);
    var Inh1 = Obj1[0].value;
    var Inh2 = Obj2[0].value;
    var Inh3 = Obj3[0].value;
    var AktDate = GetAktDate();
    var cDay = (Inh1.length > 0) ? Inh1 : "31";
    var StrSet = Inh3 + "-" + Inh2 + "-" + cDay;
    var StrAkt = AktDate[2] + "-" + AktDate[1] + "-" + AktDate[0];
    OK = (StrSet >= StrAkt);
    if (OK)
    { var nMonthSet = parseInt(Remove0(Inh2));
      var nMonthAkt = parseInt(Remove0(AktDate[1]));
      var nYearSet = parseInt(Inh3);
      var nYearAkt = parseInt(AktDate[2]);
      var nSet = 12 * nYearSet + nMonthSet;
      var nAkt = 12 * nYearAkt + nMonthAkt;
      OK = (nSet - nAkt <= TerminMonths);
    }
    if (!OK)
    { Obj1[0].style.backgroundColor = BgColors[1];
      Obj2[0].style.backgroundColor = BgColors[1];
      Obj3[0].style.backgroundColor = BgColors[1];
      ErrorFields.push(FldName + ZusDatum[0]);
      SetGroupError(Group, FldArr[Field]);
    }
  }
  return OK
}

/* Prüfung von zurückliegendem Datum */
function TestDatum(Group, Field, Mode)
{ var OK = TestDateEntry(Group, Field, Mode, "Datum");
  if (OK && Mode)
  { var FldArr = eval(FormGroups[Group][1]);
    var FldName = FldArr[Field][0] + FormGroups[Group][2];
    var Obj1 = document.getElementsByName(FldName + ZusDatum[0]);
    var Obj2 = document.getElementsByName(FldName + ZusDatum[1]);
    var Obj3 = document.getElementsByName(FldName + ZusDatum[2]);
    var Inh1 = Obj1[0].value;
    var Inh2 = Obj2[0].value;
    var Inh3 = Obj3[0].value;
    var AktDate = GetAktDate();
    var StrSet = Inh3 + "-" + Inh2 + "-" + Inh1;
    var StrAkt = AktDate[2] + "-" + AktDate[1] + "-" + AktDate[0];
    OK = (StrSet <= StrAkt);
    if (OK)
    { var nYearSet = parseInt(Inh3);
      var nYearAkt = parseInt(AktDat[2]);
      OK = (nYearAkt - nYearSet >= MaxAge);
    }
    if (!OK)
    { Obj1[0].style.backgroundColor = BgColors[1];
      Obj2[0].style.backgroundColor = BgColors[1];
      Obj3[0].style.backgroundColor = BgColors[1];
      ErrorFields.push(FldName + ZusDatum[0]);
      SetGroupError(Group, FldArr[Field]);
    }
  }
  return OK
}

/* Allgemeine Datumsprüfung */
function TestDateEntry(Group, Field, Mode, Typ)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj1 = document.getElementsByName(FldName + ZusDatum[0]);
  var Obj2 = document.getElementsByName(FldName + ZusDatum[1]);
  var Obj3 = document.getElementsByName(FldName + ZusDatum[2]);
  var Inh1 = Remove0(Trim(Obj1[0].value));
  var Inh2 = Remove0(Trim(Obj2[0].value));
  var Inh3 = Trim(Obj3[0].value);
  var OK = true;
  var OK1 = true;
  var OK2 = true;
  var OK3 = true;
  var SetDay = true;
  var BgCol, cYear;
  if (Mode)
  { if (Inh1.length == 0)                   /* Tag */
    { if ((Typ == "Termin") && !TerminIsExact)
      { Inh1 = "1";
        SetDay = false;
      }
      else
      { OK1 = false;
      }
    }
    if (OK1)
    { if (!IsInteger(Inh1, "+"))
      { OK1 = false;
      }
      else if (parseInt(Inh1) > 31)
      { OK1 = false;
      }
    }
    BgCol = (OK1) ? 0 : 1;
    Obj1[0].style.backgroundColor = BgColors[BgCol];
    if (OK1)
    { if (SetDay)
      { Obj1[0].value = Make0Str(parseInt(Inh1), 2);
      }
    }
    else
    { ErrorFields.push(FldName + ZusDatum[0]);
      OK = false;
    }
    if (!IsInteger(Inh2, "+"))              /* Monat */
    { OK2 = false;
    }
    else if (parseInt(Inh2) > 12)
    { OK2 = false;
    }
    BgCol = (OK2) ? 0 : 1;
    Obj2[0].style.backgroundColor = BgColors[BgCol];
    if (OK2)
    { Obj2[0].value = Make0Str(parseInt(Inh2), 2);
    }
    else
    { ErrorFields.push(FldName + ZusDatum[1]);
      OK = false;
    }
    if (!IsInteger(Inh3, "0"))              /* Jahr */
    { OK3 = false;
    }
    else
    { cYear = Get4StYear(Inh3, Typ)
      if (cYear.length == 0)
      { OK3 = false;
      }
    }
    BgCol = (OK3) ? 0 : 1;
    Obj3[0].style.backgroundColor = BgColors[BgCol];
    if (OK3)
    { Obj3[0].value = cYear;
    }
    else
    { ErrorFields.push(FldName + ZusDatum[2]);
      OK = false;
    }
    if (OK)                                 /* Datum */
    { if (!CheckDatum(Inh1, Inh2, cYear))
      { Obj1[0].style.backgroundColor = BgColors[1];
        Obj2[0].style.backgroundColor = BgColors[1];
        Obj3[0].style.backgroundColor = BgColors[1];
        ErrorFields.push(FldName + ZusDatum[0]);
        OK = false;
      } 
    }
    if (!OK)
    { SetGroupError(Group, FldArr[Field]);
    }
  }
  else
  { OK = ((Inh1.length > 0) || (Inh2.length > 0) || (Inh3.length > 0));
    Obj1[0].style.backgroundColor = BgColors[0];
    Obj2[0].style.backgroundColor = BgColors[0];
    Obj3[0].style.backgroundColor = BgColors[0];
  }
  return OK
}

/* Pflichtfeld abhängig von Auswahl in Radiogruppe
   Definition in assoziativem Array 'Conditional'
   Conditional[Feldname] = Array
   Array-Elemente:
   1. Name der Radio-Gruppe
   2. Auswahl, von der Prüfung / Nichtprüfung abhängt
   3. true : bei dieser Auswahl prüfen
      false: bei dieser Auswahl nicht prüfen
   4. Name der Prüf-Funktion */
function TestConditionalRadio(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldTyp = FldArr[Field][0];
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var RefField = Conditional[FldTyp][0] + FormGroups[Group][2] + ZusHidden;
  var ObjRef = document.getElementsByName(RefField);
  var OK = false;
  var InhRef, InhCond, IsCheck, Code;
  if (Mode)
  { InhRef = ObjRef[0].value;
    InhCond = Conditional[FldTyp][1];
    if (InhRef.length > 0)
    { if (Conditional[FldTyp][2])
      { IsCheck = (InhCond.indexOf(InhRef) >= 0);
      }
      else
      { IsCheck = (InhCond.indexOf(InhRef) < 0);
      }
    }
    else
    { IsCheck = false;
    }
    if (IsCheck)
    { Code = Conditional[FldTyp][3] + "(" + Group.toString() + "," + Field.toString() + ",true);";
      OK = eval(Code);
    }
    else
    { Code = Conditional[FldTyp][3] + "(" + Group.toString() + "," + Field.toString() + ",false);";
      OK = eval(Code);
    }
  }
  return OK
}

/* Nur prüfen, wenn Eintrag vorhanden */
function TestIfEntry(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldTyp = FldArr[Field][0];
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj = document.getElementsByName(FldName);
  var Inh = Trim(Obj[0].value);
  var OK = true;
  if (Mode)
  { if (Inh.length > 0)
    { var Code = Conditional[FldTyp][3] + "(" + Group.toString() + "," + Field.toString() + ",true);";
      OK = eval(Code);
    }
    else
    { Obj[0].style.backgroundColor = BgColors[0];
    }
  }
  else
  { Obj[0].style.backgroundColor = BgColors[0];
    OK = (Inh.length > 0);
  }
  return OK
}

/* Nur prüfen, wenn Datums-Eintrag vorhanden */
function TestIfDateEntry(Group, Field, Mode)
{ var FldArr = eval(FormGroups[Group][1]);
  var FldTyp = FldArr[Field][0];
  var FldName = FldArr[Field][0] + FormGroups[Group][2];
  var Obj1 = document.getElementsByName(FldName + ZusDatum[0]);
  var Obj2 = document.getElementsByName(FldName + ZusDatum[1]);
  var Obj3 = document.getElementsByName(FldName + ZusDatum[2]);
  var Inh1 = Trim(Obj1[0].value);
  var Inh2 = Trim(Obj2[0].value);
  var Inh3 = Trim(Obj3[0].value);
  var OK = true;
  if (Mode)
  { if (Inh1.length + Inh2.length + Inh3.length > 0)
    { var Code = Conditional[FldTyp][3] + "(" + Group.toString() + "," + Field.toString() + ",true);";
      OK = eval(Code);
    }
    else
    { Obj1[0].style.backgroundColor = BgColors[0];
      Obj2[0].style.backgroundColor = BgColors[0];
      Obj3[0].style.backgroundColor = BgColors[0];
    }
  }
  else
  { Obj1[0].style.backgroundColor = BgColors[0];
    Obj2[0].style.backgroundColor = BgColors[0];
    Obj3[0].style.backgroundColor = BgColors[0];
    OK = (Inh1.length + Inh2.length + Inh3.length > 0);
  }
  return OK
}

// Allgemeine Formularbehandlung
// *****************************
// Inhalt:
// - function InitForm                      - Focus auf erstes Formular-Element
// - function GetChecked                    - Checkbox / Radio-Buttons
// - function GetCheckInput                 - Checkbox-Gruppe
// - function GetSelected                   - Dropdown-Liste
// - function GetExtendedSelection          - Dropdown-Liste mit Unterauswahl
// - function GetSpecialSelection           - abhängige Dropdown-Liste
// - function GetSelectionValue             - Eingabe freie Auswahl für Dropdown-Liste
// - function ConfirmReset                  - Reset
// - function ReloadPage                    - neues leeres Formular
// - function CloseInputWin                 - Fenster für zusätzliche Eingaben

function InitForm()
{ var i, fTyp;
  if (typeof document.forms[0] == "object")			/* aus Kompatibilitätsgründen bei php-Seiten */
  { for (i = 0; i < document.forms[0].elements.length; i++)
    { fTyp = document.forms[0].elements[i].type;
      if (FieldTypes.indexOf(fTyp) >= 0)
      { document.forms[0].elements[i].focus();
        break;
      }
    }
  }
}

/* Radio-Buttons und Einzel-Checkbox */
function GetChecked(Nam, Val)
{ var Fld = eval("document.forms[0]." + Nam + ZusHidden);
  if (typeof Val != "string")						/* bei Einzel-Checkbox */
  { var Obj = eval("document.forms[0]." + Nam);
    var Ind = (Obj.checked) ? 0 : 1;
    Val = CheckValues[Ind];
  }
  Fld.value = Val;
  SetTabElements(Nam, Val);			/* Sonderfunktion Mulbrod */
}

/* Checkbox-Gruppe */
function GetCheckInput(Nam)
{ var i, Obj;
  var Inh = new Array();
  for (i = 1; i <= GroupLength[Nam]; i++)
  { Obj = eval("document.forms[0]." + Nam + i.toString());
    if (Obj.checked)
    { Inh.push(i);
    }
  }
  Obj = eval("document.forms[0]." + Nam + ZusHidden);
  Obj.value = Inh.toString();
}

/* Auswahlliste */
function GetSelected(Nam)
{ var Obj, Fld, Nr;
  var Root, MainData;
  var CallWindow = false;
  Obj = eval("document.forms[0]." + Nam);
  Fld = eval("document.forms[0]." + Nam + ZusHidden);
  Nr = Obj.selectedIndex;
  if (parseInt(Fld.value) != Nr)
  { if (Nr > 0)
    { Root = GetRootName(Nam);
      MainData = SelectListLength[Root];
      if ((Nr >= MainData) && (Nr == Obj.length - 1))
      { CallWindow = true;
      }
    }
    if (CallWindow)
    { var Src = WinSource + "?Caller=" + Nam + "&Type=" + MainSelectionValues;
      CloseInputWin();
      InputWin = window.open(Src, "Eingabe", WinData);
      Nr = 0;
      Obj.selectedIndex = Nr;
    }
  }
  Fld.value = Nr.toString();
}

function GetExtendedSelection(Nam, Mod)
{ var Obj = eval("document.forms[0]." + Nam);
  var Fld1 = eval("document.forms[0]." + Nam + ZusHidden);
  var Nr = Obj.selectedIndex;
  var SubObj, Data, i, Len, NewLen, NewOpt;
  var Fld2, Root, MainData, Src;
  var CallWindow = false;
  if (parseInt(Fld1.value) != Nr)
  { SubObj = eval("document.forms[0]." + Nam + SubSelection);
    Data = eval(GetRootName(Nam) + SelectionValues);
    SubObj.selectedIndex = 0;
    Len = SubObj.length;
    for (i = Len - 1; i > 0; i--)
    { SubObj.options[i] = null;
    }
    if (Nr > 0)
    { Root = GetRootName(Nam);
      MainData = SelectListLength[Root];
      if (Nr >= MainData)
      { NewLen = 1;
        if (Nr == Obj.length - 1)
        { CallWindow = true;
        }
      }
      else
      { NewLen = Data[Nr].length;
        for (i = 1; i < NewLen; i++)
        { NewOpt = new Option(Data[Nr][i], Data[Nr][i]);
          SubObj.options[i] = NewOpt;
        }
      }
      if (Mod)
      { NewOpt = new Option(AdditionalType, AdditionalType);
        SubObj.options[NewLen] = NewOpt;
      }
      SubObj.style.visibility = "visible";
    }
    else
    { SubObj.style.visibility = "hidden";
    }
    if (CallWindow)
    { var Src = WinSource + "?Caller=" + Nam + "&Type=" + MainSelectionValues;
      CloseInputWin();
      InputWin = window.open(Src, "Eingabe", WinData);
      Nr = 0;
      Obj.selectedIndex = Nr;
      SubObj.style.visibility = "hidden";
    }
    Fld1.value = Nr.toString();
  }
  if (Mod)
  { Fld2 = eval("document.forms[0]." + Nam + AdditionalValue);
    Fld2.value = "";
    SubObj = eval("document.forms[0]." + Nam + SubSelection + AdditionalValue);
    SubObj.value = "";
  }
}

function GetSpecialSelection(Nam)
{ var Obj = eval("document.forms[0]." + Nam);
  var Fld1 = eval("document.forms[0]." + Nam + ZusHidden);
  var Fld2 = eval("document.forms[0]." + Nam + AdditionalValue);
  var Nr = Obj.selectedIndex;
  if (Nr == Obj.length - 1)
  { var Src = WinSource + "?Caller=" + Nam + "&Type=" + SelectionValues;
    CloseInputWin();
    InputWin = window.open(Src, "Eingabe", WinData);
    Nr = 0;
    Obj.selectedIndex = Nr;
  }
  Fld1.value = Nr.toString();
  Fld2.value = "";
}

function GetSelectionValue(Nam, Val, Mod)
{ Val = Trim(Val)
  if (Val.length >= MinLength)
  { var Obj,Fld1, Fld2, Root, Line, RootObj, ID, Data, Len;
    var MainData, NewOpt, SubObj;
    Obj = eval("document.forms[0]." + Nam);
    Fld1 = eval("document.forms[0]." + Nam + ZusHidden);
    Fld2 = eval("document.forms[0]." + Nam + AdditionalValue);
    Root = GetRootName(Nam);
    MainData = SelectListLength[Root]
    if (Mod == SelectionValues)
    { Line = GetNumericID(Nam);
      RootObj = eval("document.forms[0]." + Root + Line);
      ID = RootObj.selectedIndex;
      Data = eval(Root + SelectionValues);
      if (ID < MainData)
      { Len = Data[ID].length;
      }
      else
      { Len = 1;
      }
    }
    else
    { SubObj = eval("document.forms[0]." + Nam + SubSelection);
      if (typeof SubObj == "object")
      { SubObj.style.visibility = "visible";
      }
      Len = MainData;
    }
    Obj.options[Len].text = Val;
    if (Obj.length == Len + 1)
    { NewOpt = new Option(AdditionalType, AdditionalType);
      Obj.options[Len + 1] = NewOpt;
    }
    Obj.selectedIndex = Len;
    Fld1.value = Len.toString();
    Fld2.value = Val;
  }
}

/* Sonstiges */
function ConfirmReset(Mod)
{ var Ret = confirm(ResetText);
  if (Ret && Mod)							/* Sonderbehandlung Mulbrod */
  { ResetTabStatus();
  }
  return Ret
}

function ReloadPage()
{ if (confirm(ReloadText))
  { window.location.href = PageName;
  }
}

function CloseInputWin()
{ if (typeof InputWin == "object")
  { if (!InputWin.closed)
    { InputWin.close();
    }
  }
}

// Fehlerbehandlung
// ****************
// Inhalt:
// - function SetGroupError
// - function GetErrorMessage
// - function SetErrorFocus
// - function GetGroupOutput

function SetGroupError(Group, Field)
{ var GrpName = FormGroups[Group][0] + FormGroups[Group][2];
  if (typeof Errors[GrpName] != "object")
  { Errors[GrpName] = new Array();
  }
  Errors[GrpName][Errors[GrpName].length] = Field[1];
}

function GetErrorMessage()
{ var Meld = ErrorBaseText;
  var GrpName;
  for (GrpName in Errors)
  { Meld += "\n- " + GetGroupOutput(GrpName) + Errors[GrpName].toString();
  }
  return Meld
}

function SetErrorFocus()
{ var i, fObj, fTyp, fPossible;
  for (i = 0; i < ErrorFields.length; i++)
  { fObj = eval("document.forms[0]." + ErrorFields[i]);
    fTyp = fObj.type;
    fPossible = FieldTypes + ZusFields;
    if (fPossible.indexOf(fTyp) >= 0)
    { fObj.focus();
      break;
    }
  }
}

function GetGroupOutput(Bez)
{ var Ret
  if (IsInteger(Bez.slice(-1), "+"))
  { var Pre = Bez.substr(0, Bez.length - 1);
    if (typeof Alternate[Pre] == "string")
    { Pre = Alternate[Pre];
    }
    Ret = Pre + " " + Bez.slice(-1);
  }
  else
  { if (typeof Alternate[Bez] == "string")
    { Ret = Alternate[Bez];
    }
    else
    { Ret = Bez;
    }
  }
  if (Ret.length > 0)
  { Ret += ": ";
  }
  return Ret
}

// Tools
// *****
// Inhalt:
// - function Trim                          - führende und nachfolgende Leerzeichen entfernen
// - function Make0String                   - Zahlenstring auf vorgegebene Länge vorne mit Nullen auffüllen
// - function Remove0                       - führende Nullen aus Zahlenstring entfernen
// - function ReplaceChar                   - Ersetzen eines Zeichen
// - function GetRootName                   - fester Teil des Formularfeldnamens in Formularfeldgruppen
// - function GetNumericID                  - laufende Nummer in Formularfeldgruppen
// - function IsInteger                     - Prüfung ob ganzzahlig
// - function Get4StYear                    - vierstellige Jahresangabe
// - function CheckDatum                    - Gültigkeit eines Datums
// - function GetAktDate                    - aktuelles Datum als Array (Tag, Monat, Jahr)

function Trim(cTst)
{ while ((cTst.charAt(0) == " ") && (cTst.length > 1))
  { cTst = cTst.slice(1);
  }
  while ((cTst.slice(-1) == " ") && (cTst.length > 1))
  { cTst = cTst.substr(0, cTst.length - 1);
  }
  if (cTst == " ")
  { cTst = "";
  }
  return cTst
}

function Make0Str(nInp, nLen)
{ cRet = nInp.toString();
  while (cRet.length < nLen)
  { cRet = "0" + cRet;
  }
  return cRet
}

function Remove0(cTst)
{ while ((cTst.charAt(0) == "0") && (cTst.length > 1))
  { cTst = cTst.slice(1);
  }
  return cTst
}

function ReplaceChar(cTst, cRem, cIns)
{ var cT1, cT2;
  var nPos = cTst.indexOf(cRem);
  while (nPos >= 0)
  { cT1 = (nPos == 0) ? "" : cTst.substr(0, nPos);
    cT2 = (nPos == cTst.length - 1) ? "" : cTst.slice(nPos + 1);
    cTst = cT1 + cIns + cT2;
    nPos = cTst.indexOf(cRem);
  }
  return cTst
}

function GetRootName(Inp)
{ var Ind = -1;
  var Char, Ret, i;
  for (i = 0; i < Inp.length; i++)
  { Char = Inp.substr(i, 1);
    if (Numbers.indexOf(Char) >= 0)
    { Ind = i;
      break;
    }
  }
  if (Ind >= 0)
  { Ret = Inp.substr(0, Ind);
  }
  else
  { Ret = Inp;
  }
  return Ret
}

function GetNumericID(Inp)
{ var Ret = "";
  var Root = GetRootName(Inp);
  var i, Char;
  for (i = Root.length; i < Inp.length; i++)
  { Char = Inp.substr(i, 1);
    if (Numbers.indexOf(Char) >= 0)
    { Ret += Char;
    }
    else
    { break;
    }
  }
  return Ret
}


/* Modus: "+" = nur positive ganze Zahlen
          "0" = nicht negative ganze Zahlen
		  "-" = alle ganzen Zahlen */
function IsInteger(cVar, Mod)
{ var OK = (cVar.length > 0);
  var Letter, i, rVar;
  if (OK)
  { if (cVar.substr(0, 1) == "-")
    { if (Mod == "-")
      { cVar = cVar.slice(1);
      }
      else
      { OK = false;
      }
    }
  }
  if (OK)
  { for (i = 0; i < cVar.length; i++)
    { Letter = cVar.substr(i, 1);
      if (Numbers.indexOf(Letter) < 0)
      { OK = false;
        break;
      }
    }
  }
  if (OK)
  { rVar = Remove0(cVar);
    if ((parseInt(rVar) == 0) && (Mod == "+"))
    { OK = false;
    }
  }
  return OK
}

function Get4StYear(cInp, Mod)
{ var cOut, nOut, nInp, nJh, nAbz;
  switch (cInp.length)
  { case 4:
      cOut = cInp;
      break;
    case 2:
      nInp = parseInt(Remove0(cInp));
      nJh = AktYear - (AktYear % 100);
      if (Mod == "Termin")
      { nAbz = (nInp < AktYear % 100) ? 100 : 0;
        nOut = nJh + nInp + nAbz;
      }
      else
      { nAbz = (nInp > AktYear % 100) ? 100 : 0;
        nOut = nJh + nInp - nAbz;
      }
      cOut = nOut.toString();
      break;
    default:
      cOut = "";
  }
  return cOut
}

function CheckDatum(cD, cM, cY)
{ var nD, nM, nY, nMax, OK;
  nD = parseInt(cD);
  nM = parseInt(cM);
  nY = parseInt(cY);
  switch (nM)                   /* Monat */
  { case 2:                     /* Februar => Schaltjahre! */
      if (nY % 100 == 0)
      { nMax = (nY % 400 == 0) ? 29 : 28;
      }
      else
      { nMax = (nY % 4 == 0) ? 29 : 28;
      }
      break;
    case 4:                     /* April */
      nMax = 30;
      break;
    case 6:                     /* Juni */
      nMax = 30;
      break;
    case 9:                     /* September */
      nMax = 30;
      break;
    case 11:                    /* November */
      nMax = 30;
      break;
    default:                    /* übrige Monate */
      nMax = 31;
  }
  OK = (nD <= nMax);
  return OK
}

function GetAktDate()
{ var Akt = new Date();
  var Day = Akt.getDate();
  var Month = Akt.getMonth() + 1;
  var Year = Akt.getFullYear();
  var aRet = new Array();
  aRet[0] = Make0Str(Day, 2);
  aRet[1] = Make0Str(Month, 2);
  aRet[2] = Year.toString();
  return aRet
}

// Sonderfunktionen Mulbrod
// ************************

function SetTabElements(Nam, Val)
{ if (Nam == "Typ")
  { var Anz = parseInt(document.forms[0].Zeilen.value);
    var Mod = (Val == "Auftrag") ? "visible" : "hidden";
    var Disp = (Val == "Auftrag") ? "block" : "none";
    var Obj, i;
    for (i = 0; i <= Anz; i++)
    { Obj = document.getElementById("PrTab" + i.toString());
      Obj.style.visibility = Mod;
      Obj.style.display = Disp;
    }
/*    Obj = document.getElementById("AgbTab");
    Obj.style.visibility = Mod; */
  }
}

function ResetTabStatus()
{ var Obj = document.getElementsByName("Typ");
  var OldTyp = "";
  for (var i = 0; i < Obj.length; i++)
  { if (Obj[i].defaultChecked)
    { OldTyp = Obj[i].value;
      break;
    }
  }
/*  document.forms[0].TypSelected.value = OldTyp;
  var OldAgb = (document.forms[0].AGB.defaultChecked) ? 0 : 1;
  document.forms[0].AGBSelected.value = CheckValues[OldAgb]; */
  SetTabElements("Typ", OldTyp);
}

function InsertLine()
{ document.forms[0].Demand.value = "line";
  if (CheckEntries())
  { document.forms[0].submit();
  }
}

