var formularmapping = new Array();
var zeit = new Date();

$(document).ready(function() {
  // Länderauswahl
  $(".europa").focus( function() {
    $("#landpulldown").removeAttr("disabled");
    $(".anderelaender:hidden").fadeIn("slow");
  });
  $(".atchde").focus( function() {
    $(".anderelaender:visible").fadeOut("slow", function() { $("#landpulldown").attr("disabled", "disabled"); });
  });
  
  if (submit && submit.length>0) {
    $("#"+submit).click(checkSubmit);
    $("#"+submit).attr("disabled", "disabled");
    $("#"+submit).addClass("disabled");
  }
  
  for(var i=0; i<pruefung.length; i++) {
    var eintrag = pruefung[i];
    var felder = new Array();
    if (eintrag[1]!==null) {
      felder = eintrag[1].split(",");
      for (var j=0; j<felder.length; j++) {
        $("#"+felder[j]).bind("click change focus blur keyup", function() { validate($(this).attr("id")); checkSubmit(); });
      }
    }
    else {
      $("#"+eintrag[0]).bind("click change focus blur keyup", function() { validate($(this).attr("id")); checkSubmit(); });
    }
    
    if (eintrag[3] && eintrag[3].indexOf("pflicht")>-1) {
      if (eintrag[4].indexOf(",")>-1) {
        var fehlerfelder = eintrag[4].split(",");
        for (var k=0; k<fehlerfelder.length; k++) {
          $("#"+fehlerfelder[k]).addClass("pflicht");
          $("#"+fehlerfelder[k]+"text").html(meldung["pflicht"]);
        }
      }
      else {
        $("#"+eintrag[4]).addClass("pflicht");
        $("#"+eintrag[4]+"text").html(meldung["pflicht"]);
      }
    }
  }
});

var CheckTemp = new Array();

function checkSubmit() {
  var ok = true;
  for(var i=0; i<pruefung.length; i++) {
    var eintrag = pruefung[i];
    if ($.inArray(eintrag[0], CheckTemp)<0 && eintrag[3] && eintrag[3].indexOf("pflicht")>-1) {
      ok = false;
    }
  }
  
  if (ok == true && submit && submit.length>0) {
    $("#"+submit).removeAttr("disabled");
    $("#"+submit).removeClass("disabled");
  }
  else if(submit && submit.length>0) {
    $("#"+submit).attr("disabled", "disabled");
    $("#"+submit).addClass("disabled");
  }
  
  return ok;
}

function validate(id) {
  var felder = new Array();
  var pflicht = false;
  
  var regelid = "";
  var eintrag = new Array();
  for (var i=0; i<pruefung.length; i++) {
    if(pruefung[i][0] == id) {
      regelid = pruefung[i][0];
      eintrag = pruefung[i];
    }
    if (pruefung[i][1]!==null) {
      felder = pruefung[i][1].split(",");
      for (var j=0; j<felder.length; j++) {
        if (felder[j]==id) {
          regelid = pruefung[i][0];
          eintrag = pruefung[i];
          break;
        }
      }
    }
    if (regelid != "") {
      break;
    }
  }
  
  var fehler = new Array();
  var meldungen = new Array();
  var regeln = eintrag[3]!==null && $.trim(eintrag[3])!="" && eintrag[3].length>0?eintrag[3].split(","):new Array();
  
  var wert = "";
  if (eintrag[2]!==null) {
    var concatfelder = eintrag[2].split(",");
    for (var i=0; i<concatfelder.length; i+=2) {
      var trenner = concatfelder[i+1]&&concatfelder[i+1].length>0?concatfelder[i+1]:"";
      if (getValue(concatfelder[i])!="" && getValue(concatfelder[i])!="NULL") {
        wert = wert + getValue(concatfelder[i]) + trenner;
      }
    }
  }
  else {
    wert = getValue(eintrag[0]);
  }
  
  wert = $.trim(wert);
  
  for (var i=0; i<regeln.length; i++) {
    if (regeln[i].indexOf("_")>-1) {
      regeln[i] = regeln[i].split("_");
    }
    
    if(regeln[i] == "pflicht" && $.trim(wert) == "") {
      meldungen.push(meldung["pflicht"]);
      pflicht = true;
    }
    else if(regeln[i] == "email" && wert!="" && !checkEmail(wert)) {
      meldungen.push(meldung["email"]);
    }
    else if(regeln[i] == "nickname" && !checkNickname(wert)) {
      meldungen.push(meldung["nickname"]);
    }
    else if(regeln[i] == "datum" && checkDatum(wert)<=0) {
      meldungen.push(meldung["datum"]);
    }
    else if(regeln[i] == "isnumeric") {
      if (!isNumeric(wert)) {
        meldungen.push(meldung["isnumeric"]);
      }
    }
    else if(regeln[i][0] == "minalter" && checkDatum(wert)<regeln[i][1]) {
      meldungen.push(meldung["minalter"].replace(/#WERT#/, regeln[i][1]));
      pflicht = true;
    }
    else if(regeln[i][0] == "maxalter" && checkDatum(wert)>regeln[i][1]) {
      meldungen.push(meldung["maxalter"].replace(/#WERT#/, regeln[i][1]));
    }
    else if(regeln[i][0] == "minlength" && wert.length<regeln[i][1]) {
      meldungen.push(meldung["minlength"].replace(/#WERT#/, regeln[i][1]));
    }
    else if(regeln[i][0] == "maxlength" && wert.length>regeln[i][1]) {
      meldungen.push(meldung["maxlength"].replace(/#WERT#/, regeln[i][1]));
    }
    else if(regeln[i][0] == "filetype") {
      filetypeok = false;
      erweiterungen = new Array();
      dateierweiterung = wert.substr(wert.lastIndexOf(".")+1);
      for (var j=1; j<regeln[i].length; j++) {
        erweiterungen.push(regeln[i][j]);
        if (dateierweiterung.toLowerCase() == regeln[i][j]) {
          filetypeok = true;
        }
      }
      if (filetypeok == false) {
        meldungen.push(meldung["filetype"].replace(/#WERT#/, erweiterungen.join(", ")));
      }
    }
    else if(regeln[i][0] == "wiederholen") {
      if ($.trim($("#"+regeln[i][1]).val())!=wert && !(wert=="" && $.trim($("#"+regeln[i][1]).val())=="")) {
        meldungen.push(meldung["wiederholen"]);
      }
    }
    else if(regeln[i][0] == "between") {
      if (wert < Number(regeln[i][1]) || wert > Number(regeln[i][2])) {
        meldungen.push(meldung["between"].replace(/#WERT#/, regeln[i][1] + '-' + regeln[i][2]));
      }
    }
    // 0    1      2
    // ajax_<code>_<url>
    else if(regeln[i][0] == "ajax" && meldungen.length==0) {
        if ($("#jq_ajax_"+id+"_a").text() == wert && $("#jq_ajax_"+id+"_b").text() == 1) {
            meldungen.push(meldung[regeln[i][1]]);
        }
        else if ($("#jq_ajax_"+id+"_a").text() != wert) {
            meldungen.push(meldung[regeln[i][1]]);
            $.get(regeln[i][2]+"?d="+zeit.getMilliseconds(), { wert: wert },
                function(data){
                    $("#jq_ajax_"+id+"_a").remove();
                    $("#jq_ajax_"+id+"_b").remove();
                    $("#formular").append('<span id="jq_ajax_'+id+'_a" class="versteckt">'+$.trim(wert)+'</span>');
                    $("#formular").append('<span id="jq_ajax_'+id+'_b" class="versteckt">'+$.trim(data)+'</span>');
                    validate(id);
                    checkSubmit();
                });
        }
    }
    else if(regeln[i][0] == "nicknamevergeben" && meldungen.length==0) {
      if ($("#jq_nicknamevergeben1").text() == wert && $("#jq_nicknamevergeben2").text() == 1) {
        meldungen.push(meldung["nicknamevergeben"]);
      }
      else if ($("#jq_nicknamevergeben1").text() != wert) {
        meldungen.push(meldung["nicknamevergeben"]);
        $.get(regeln[i][1]+"?d="+zeit.getMilliseconds(), { nickname: wert },
          function(data){
            $("#jq_nicknamevergeben1").remove();
            $("#jq_nicknamevergeben2").remove();
            $("#formular").append('<span id="jq_nicknamevergeben1" class="versteckt">'+$.trim(wert)+'</span>');
            $("#formular").append('<span id="jq_nicknamevergeben2" class="versteckt">'+$.trim(data)+'</span>');
            validate(id);
            checkSubmit();
          });
      }
    }
    else if(regeln[i][0] == "emailvergeben" && meldungen.length==0) {
      if ($("#jq_emailvergeben1").text() == wert && $("#jq_emailvergeben2").text() == 1) {
        meldungen.push(meldung["emailvergeben"]);
      }
      else if ($("#jq_emailvergeben1").text() != wert) {
        meldungen.push(meldung["emailvergeben"]);
        $.get(regeln[i][1]+"?d="+zeit.getMilliseconds(), { email: wert },
          function(data){
            $("#jq_emailvergeben1").remove();
            $("#jq_emailvergeben2").remove();
            $("#formular").append('<span id="jq_emailvergeben1" class="versteckt">'+$.trim(wert)+'</span>');
            $("#formular").append('<span id="jq_emailvergeben2" class="versteckt">'+$.trim(data)+'</span>');
            validate(id);
            checkSubmit();
          });
      }
    }
  }
  
  if (wert.length>0 && meldungen.length==0) {
    setStatus(eintrag[4], meldung["ok"]);
    CheckTemp.push(eintrag[0]);
  }
  else if ((wert.length>0 || $.inArray(meldung["wiederholen"], meldungen)>-1) && meldungen.length>0) {
    setStatus(eintrag[4], meldungen.join("\n"));
    CheckTemp = $.grep(CheckTemp, function(a) {
      return a==eintrag[0];
    }, true);
  }
  else {
    setStatus(eintrag[4], "");
    CheckTemp = $.grep(CheckTemp, function(a) {
      return a==eintrag[0];
    }, true);
  }
  
  return pflicht==false || (pflicht==true&&wert.length>0&&meldungen.length==0)?true:false;
}

function setStatus(feld, nachricht) {
  var fehlerfeld = "";
  if(feld.indexOf(",")>-1) {
    feld = feld.split(",");
    fehlerfeld = "#"+feld.join("text, #") + "text";
    feld = "#"+feld.join(", #");
  }
  else {
    feld = "#"+feld;
    fehlerfeld = feld + "text";
  }
  
  $(feld).removeClass("ok");
  $(feld).removeClass("fehler");
  $(fehlerfeld).html("&nbsp;")
  
  if (nachricht && nachricht.length>0) {
    if(nachricht == meldung["ok"]) {
      $(feld).addClass("ok");
      nachricht = nachricht.split("\n");
      $(fehlerfeld).html("<ul><li>" + nachricht.join("</li><li>") + "</li></ul>");
    }
    else {
      $(feld).addClass("fehler");
      nachricht = nachricht.split("\n");
      $(fehlerfeld).html("<ul><li>" + nachricht.join("</li><li>") + "</li></ul>");
    }
  }
  else {
    $(feld+"[class*=pflicht]").each( function() { $("#"+this.id+"text").html(meldung["pflicht"]) } );
  }
}

function getValue(name) {
  var wert = "";
  
  $("*[name="+name+"]:enabled").each( function() {
    var value = $(this).val();
    
    if (this.tagName == "INPUT" && $(this).attr("type") == "radio" && $(this).attr("checked") == true) {
      wert = value;
    }
    if (this.tagName == "INPUT" && $(this).attr("type") == "checkbox" && $(this).attr("checked") == true) {
      wert = value;
    }
    if (this.tagName == "INPUT" && $(this).attr("type") == "text") {
      wert = value;
    }
    if (this.tagName == "INPUT" && $(this).attr("type") == "password") {
      wert = value;
    }
    if (this.tagName == "INPUT" && $(this).attr("type") == "file") {
      wert = value;
    }
    if (this.tagName == "SELECT") {
      wert = value;
    }
    if (this.tagName == "TEXTAREA") {
      wert = value;
    }
  });
  
  return wert;
}

function checkDatum(wert) {
  var ok = false;
  var jetzt = new Date();
  var aJahr = jetzt.getFullYear();
  var aMonat = jetzt.getMonth()+1;
  var aTag = jetzt.getDate();

  var werte = wert.split(".");
  var tag=parseInt(werte[0],10), monat=parseInt(werte[1],10), jahr=parseInt(werte[2],10);
  jahr = jahr<100?jahr+1900:jahr;
  var alter = aJahr-jahr;

  if (jahr.length<=4 && tag >= 1 && tag <= 31 && monat >= 1 && monat <= 12) {
    if (aMonat < monat || (aMonat == monat && aTag < tag)) {
      alter--;
    }
  }
  return isNaN(alter)?0:alter;
}

function checkEmail(text) {
  regex = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9]([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$/;
  if (regex.test($.trim(text)) == 1) {
    return true;
  }
  return false;
}

function checkNickname(text) {
  regex = /^[_a-zA-Z0-9-]+$/;
  if (regex.test($.trim(text)) == 1) {
    return true;
  }
  return false;
}

function isNumeric(strString)
{
    var strValidChars = "0123456789";
    var strChar;
    var blnResult = true;

    if (strString.length == 0) return false;

    //  test strString consists of valid characters listed above
    for (i = 0; i < strString.length && blnResult == true; i++)
    {
        strChar = strString.charAt(i);
        if (strValidChars.indexOf(strChar) == -1)
        {
            blnResult = false;
        }
    }
    return blnResult;
}

