function GP_besteht_aus(s, erlaubt) {
  for (var i=0; i<s.length; i++) 
    if (erlaubt.indexOf(s.charAt(i)) == -1) 
      return false;
  return true;
}

function GP_nur_ziffern(s) {
  return GP_besteht_aus(s, "0123456789");
}

function GP_nicht_negativ(s) {
  var keine_nuller = (s=="0" || (s+" ").charAt(0)!="0");
  return (GP_nur_ziffern(s) && keine_nuller);
}

function GP_positiv(s) {
  var keine_null = ((s+" ").charAt(0)!="0");
  return (GP_nur_ziffern(s) && keine_null);
}

function GP_ganzzahlig(s) {
  if (s == "") 
    return false;
  if (s.charAt(0)=="+" || s.charAt(0)=="-")
    return GP_nicht_negativ(s.substring(1, s.length));
  else
    return GP_nicht_negativ(s);
}

function GP_fliesskommazahl(s) {
  if (s == "") 
    return false;
  var s1 = s;
  if (s1.charAt(0)=="+" || s1.charAt(0)=="-")
    s1 = s1.substring(1, s1.length);
  var komma = s1.indexOf(","); //erstes Komma
  var punkt = s1.indexOf("."); //erster Punkt
  if (komma==-1 && punkt==-1)
    return GP_nicht_negativ(s1);
  else {
    if (komma == -1)  //wo ist der Trennpunkt
      var punktkomma = punkt;
    else if (punkt == -1)
      var punktkomma = komma;
    else
      var punktkomma = Math.min(punkt, komma);
    var v = s1.substring(1, punktkomma); //vor dem "."/","
    var h = s1.substring(punktkomma+1, s1.length); //hinten
    return (GP_nicht_negativ(v) && GP_nur_ziffern(h));
  }
}

function GP_postleitzahl(s) {
  return (s.length==5 && GP_nur_ziffern(s));
}

function GP_telefonnummer(s) {
  return GP_besteht_aus(s, "0123456789()[]+-/ ");
}

function GP_ermittle_wert_2(s) {
  if (s.length<1 || s.length>2)
    return 0;
  if (!GP_nur_ziffern(s))
    return 0;
  var s1 = s;
  if (s1.length == 1)
    s1 = "0"+s1;
  var zehner = parseInt(s1.charAt(0));
  var einer = parseInt(s1.charAt(1));
  return 10*zehner + einer;
}

function GP_ist_tag(s) {
  var tag = GP_ermittle_wert_2(s);
  return (tag>=1 && tag <=31);
}

function GP_ist_monat(s) {
  var tag = GP_ermittle_wert_2(s);
  return (tag>=1 && tag <=12);
}

function GP_ist_jahr(s) {
  if (!GP_nur_ziffern(s))
    return false;
  if (s.length == 2)
    return true; //wenn nur Ziffern, dann immer Jahr!
  if (s.length == 4) {
    var jahr = parseInt(s);
    return (jahr>=1901 && jahr<=2001);
  }
}

function GP_schaltjahr(x) {
  return (x%4==0 && (x%100>0 || x%400==1));
}

function GP_geburtsdatum(s) {
  var ttmmjj = s.split(".");
  if (ttmmjj.length != 3)
    return false;
  var tag = ttmmjj[0];
  var monat = ttmmjj[1];
  var jahr = ttmmjj[2];
  if (jahr.length == 2)
    jahr = "19" + jahr;
  //Überprüfung Monat
  if (!GP_ist_monat(monat))
    return false;
  //Überprüfung Jahr
  if (!GP_ist_jahr(jahr))
    return false;
  //Überprüfung auf gültiges Datum
  var anzahltage = new Array(0, 31, 28, 31, 30, 31, 30, 
                                31, 31, 30, 31, 30, 31);
  if (GP_schaltjahr(parseInt(jahr)))
    anzahltage[2] = 29;
  if (parseInt(tag) > anzahltage[parseInt(monat)])
    return false;
  //kein Fehler gefunden, alles in Ordnung
  return true;
}

function GP_email(s) {
  var abisz = "abcdefghijklmnopqrstuvwyz";
  abisz += abisz.toUpperCase();
  var ziffern = "0123456789";
  if (s.length<7)
    return false;
  if (s.split("@").length != 2)  //0 oder mehr als 2 Mal @
    return false;
  var vorne = s.substring(0, s.indexOf("@"));
  var hinten = s.substring(s.indexOf("@")+1, s.length);
  // vor dem @ mindestens ein Zeichen:
  if (vorne == 0)
    return false;
  // vorne nur Buchstaben, Zahlen, - und _:
  if (!GP_besteht_aus(vorne, abisz+ziffern+"-_"))
    return false;
  // hinten nur Punkte und Buchstaben
  if (!GP_besteht_aus(hinten, abisz+ziffern+"."))
    return false;
  // hinten mindestens ein Punkt, danach 
  // zwei bis vier Buchstaben:
  var punkt = hinten.lastIndexOf(".");
  if (punkt <= 0 || punkt >= hinten.length-2 || 
                    punkt < hinten.length-5)
    return false;
  // links vom letzten Punkt mindestens zwei Zeichen
  if (!GP_besteht_aus(hinten.substring(punkt-2, punkt), 
                      abisz+ziffern))
    return false;
  // kein ".."
  if (hinten.indexOf("..") > -1)
    return false;
  // keine Fehler, alles in Ordnung
  return true;
}


