if (typeof KuferWEB == 'undefined') KuferWEB = {};
if (typeof KuferWEB.Utils == 'undefined') KuferWEB.Utils = {};
if (typeof KuferWEB.Settings == 'undefined') KuferWEB.Settings = {};
if (typeof KuferWEB.OnAnmeldungInit == 'undefined') KuferWEB.OnAnmeldungInit = [];

if (typeof KuferWEB.Utils.Filter == 'undefined') KuferWEB.Utils.Filter = {};
if (typeof KuferWEB.Utils.Completion == 'undefined') KuferWEB.Utils.Completion = {};


KuferWEB.Utils.Filter.IsDate = function (pValue) {
  var dateAry = pValue.split('.');

  // Erwartet Tag und Monat zweistellig
  if (!pValue.match(/^[0-9]{2}\.[0-9]{2}\.[0-9]{4}$/)) {
    return false;
  }

  var day = parseInt(dateAry[0], 10);
  var month = parseInt(dateAry[1], 10);
  var year = parseInt(dateAry[2], 10);

  if (year < 1900) {
    return false;
  }

  // Überprüfung auf Über- und Unterläufe: 31.04. wird im Dateobj zu 01.05.
  var dateObject = new Date(year, month - 1, day);
  if (year != dateObject.getFullYear() ||
    month != (dateObject.getMonth() + 1) ||
    day != dateObject.getDate()) {
    return false;
  }

  return true;
};

KuferWEB.Utils.parseDateFormatDDMMYYYY = function (dateStr) {
  var parts = dateStr.split(".");
  return new Date(parseInt(parts[2], 10), parseInt(parts[1], 10) - 1, parseInt(parts[0], 10));
};

KuferWEB.Utils.formatDateDDMMYYYY = function (date) {
    day = date.getDate();
    month = date.getMonth() + 1;
    if ((String(day)).length == 1) {
      day='0'+day;
    }
    if ((String(month)).length == 1) {
      month='0'+month;
    }

    return day + '.' + month + '.' + date.getFullYear();
};

function setRowID(pRow, pID) {
  // Diese Funktion sorgt dafür, dass die Spalte, über der der Mauszeiger gerade ist, gehighlightet wird
  var theCells = null;
  var c = null;
  var CellCnt = 0;
  var domDetect = false;

  theCells = pRow.cells;
  CellCnt = theCells.length;

  // Abfrage, ob ein DOM-Fähiger Browser verwendet wird
  if ((typeof (window.opera) == 'undefined') && (typeof (theCells[0].getAttribute) != 'undefined'))
    domDetect = true;
  else
    domDetect = false;

  for (c = 0; c < CellCnt; c++) {
    if (domDetect) theCells[c].setAttribute('id', pID, 0);
    else theCells[c].style.backgroundColor = pID;
  }
}

function setRowClass(pRow, pClass) {
  pRow.setAttribute('class', pClass, "false");
}

function getCalendarFor(formname, elementname, urlstring) {
  var newWindow;
  if (urlstring == undefined)
    urlstring = '../calendar/calendar.php';
  else
    urlstring += 'calendar/calendar.php';
  newWindow = window.open(urlstring + '?formname=' + formname + '&elementname=' + elementname, '',
    'height=220, width=280, top=300, left=300, toolbar=no, minimize=no, status=no, memubar=no, location=no, scrollbars=no')
}

function printpage() {
  window.print();
}


function decryptMail(pValue)
/* Entschlüsselt eMail-Adressen */
{
  var i, chars, decrypted = "";
  chars = pValue.split(",");
  for (i = 0; i < chars.length; i++) {
    decrypted += String.fromCharCode(chars[i] - 13);
  }
  return decrypted;
}

function encryptMail(pValue)
/* Verschlüsselt eMail-Adressen */
{
  var i;
  var encrpyted = "";
  if (pValue != "") {
    for (i = 0; i < pValue.length; i++) {
      encrpyted += (pValue.charCodeAt(i) + 13) + ",";
    }
    encrpyted = encrpyted.substring(0, encrpyted.length - 1);
  }
  return encrpyted;
}

function link2CryptedMail(pValue)
/* Ermöglicht "mailto" Links mit verschlüsselten eMail-Adressen */
{
  location.href = 'mailto:' + decryptMail(pValue);
}

function decryptMailByID(pID)
/* Entschlüsselt den Inhalt aller Tags mit id = pID */
{
  var s;
  s = document.getElementById(pID).firstChild.nodeValue;
  document.getElementById(pID).firstChild.nodeValue = decryptMail(s);
}

if (typeof (document.getElementsByClassName) == 'undefined') {
  document.getElementsByClassName = function (cl) {
    var retnode = [];
    var myclass = new RegExp('^' + cl + '$');
    var elem = this.getElementsByTagName('*');
    for (var i = 0; i < elem.length; i++) {
      var classes = elem[i].className;
      if (myclass.test(classes)) retnode.push(elem[i]);
    }
    return retnode;
  };
}


if (typeof (jQuery) != 'undefined') {

  // Kategorien per Auswahlliste: Formular sofort absenden
  jQuery('select.katselect').change(
    function () {
      $($(this).parents('form')).submit();
    });
  /*
   * jQuery für Placeholder bei den Input-Feldern
   */

  //Fügt'placeholder'-Objekt zu dem jQuery .support object. 
  //This adds 'placeholder' to the items listed in the jQuery .support object. 
  jQuery(function () {
    jQuery.support.placeholder = false;
    test = document.createElement('input');
    if ('placeholder' in test) jQuery.support.placeholder = true;
  });
  // This adds placeholder support to browsers that wouldn't otherwise support it. 
  jQuery(function ($) {
    if (!$.support.placeholder) {
      var active = document.activeElement;
      $(':text').focus(function () {
        var $this = $(this);
        if (($this.prop('placeholder') != undefined && $this.prop('placeholder') != '') && $this.val() == $this.prop('placeholder')) {
          $this.val('').removeClass('hasPlaceholder');
        }
      }).blur(function () {
        var $this = $(this);
        if (($this.prop('placeholder') != undefined && $this.prop('placeholder') != '') && ($this.val() == '' || $this.val() == $this.prop('placeholder'))) {
          $this.val($this.prop('placeholder')).addClass('hasPlaceholder');
        }
      });
      $(':text').blur();
      $(active).focus();
      $('form').submit(function () {
        $(':text.hasPlaceholder').each(function (index, item) {
          $item = jQuery(item);
          if ($item.val() == $item.prop('placeholder'))
            $item.val('');
        });
      });
    }
  });
  jQuery(function ($) {
    //verstecken beim Seitenaufruf
    if ($('#tedit_bankart_alt').is(':checked')) {
      $("#sepa, .sepa").hide();
      $("#tedit_ibanid").val("");
      $("#tedit_bicid").val("");
      $("#kontonummer_blz, .kontonummer_blz").show();
    } else if ($('#tedit_bankart_sepa').is(':checked')) {
      $("#kontonummer_blz, .kontonummer_blz").hide();
      $("#tedit_kontoid").val("");
      $("#tedit_blzid").val("");
      $("#sepa, .sepa").show();
    }

    $("[name='tedit_bankart']").change(function () {
      if (this.value == "sepa") {
        $("#kontonummer_blz, .kontonummer_blz").hide();
        $("#tedit_kontoid").val("");
        $("#tedit_blzid").val("");
        $("#sepa, .sepa").fadeIn();
      } else {
        $("#sepa, .sepa").hide();
        $("#tedit_ibanid").val("");
        $("#tedit_bicid").val("");
        $("#kontonummer_blz, .kontonummer_blz").fadeIn();
      }
    });
  });

  //Umsetzung der "Mehr-Funktion" bei typischen Kategorientexten
  //im dynamischen Mehr-Ebenen-Layout
  jQuery(function ($) {
    katTextHide();
  });

  KuferWEB.Utils.AddHandlerOnce = function(handlerName, elementsName, handler) {
    if(document.getElementsByName(elementsName).length > 0) {
      let elements = document.getElementsByName(elementsName);
      elements.forEach(elem => {
        if(elem.getAttribute('data-has-'+handlerName) !== 'true') {
          elem.setAttribute('data-has-'+handlerName, 'true');
          elem.addEventListener('change', handler, false);
        }
      });
    } 
  }

  KuferWEB.Utils.Completion.InitStrassenAutocompletion = function() {
    KuferWEB.Utils.AddHandlerOnce('strassen-handler', 'tedit_nurplz', KuferWEB.Utils.Completion.InitStrassenAutocompletion);
    KuferWEB.Utils.AddHandlerOnce('strassen-handler', 'tedit_geschlecht', KuferWEB.Utils.Completion.InitStrassenAutocompletion);

    const plz = document.getElementsByName('tedit_nurplz').length > 0 ? document.getElementsByName('tedit_nurplz')[0].value : '';
    const dataSrcUrl = kw.wbBasePath + 'index.php?ajaxAction=GetStrassenSuggestions&plz=' + plz;
    let threshold = 2;//ab dem wievielten Buchstaben wird die Suche angeworfen
    if (typeof KuferWEB.Utils.Completion.str_threshold !== "undefined" && parseInt(KuferWEB.Utils.Completion.str_threshold, 10) > 0) {
      threshold = parseInt(KuferWEB.Utils.Completion.str_threshold);
    }
    let maxResults = 5;
    if (typeof KuferWEB.Utils.Completion.str_maxResults !== "undefined" && parseInt(KuferWEB.Utils.Completion.str_maxResults, 10) > 0) {
      maxResults = parseInt(KuferWEB.Utils.Completion.str_maxResults);
    }
    KuferWEB.Utils.Completion.InitAutocompletion("tedit_nurstrasse_ajaxid", dataSrcUrl, threshold, maxResults);
  };
  KuferWEB.Utils.Completion.myCompletions = {};
  KuferWEB.Utils.Completion.InitAutocompletion = function(inputFieldId, dataSrcUrl, threshold = 2, maxResults = 5) {
    const myCompletions = KuferWEB.Utils.Completion.myCompletions;
    if (typeof myCompletions[inputFieldId] !== 'undefined') {//nicht mehrere Vervollstaendigungen, wenn PLZ geaendert
      myCompletions[inputFieldId].unInit();
    }
    const inputFieldSelector = '#'+inputFieldId;
    const autoCompleteConfig = {
      data: {
        src: async () => {
          const source = await fetch(dataSrcUrl, {
                method: 'POST',
                headers: {'X-Requested-With': 'XMLHttpRequest'}
              }
          );
          return await source.json();
        },
        cache: true
      },
      selector: inputFieldSelector,
      threshold: threshold,
      searchEngine: "strict",
      resultsList: {
        element: (list, data) => {
          console.log(data.results.length);
          if (!data.results.length) {
            const result = document.createElement("li");
            result.setAttribute("class", "no_result autoComplete_result");
            result.setAttribute("tabindex", "1");
            result.innerHTML = `<span>Keine Ergebnisse bei "${data.query}"</span>`;
            list.prepend(result);
          }
        },
        noResults: true,
        maxResults: maxResults,
        tabSelect: true
      },
      resultItem: {
        highlight: true,
      },
      events: {
        input: {
          selection: (event) => {
            let element = document.getElementById(inputFieldId);
            element.value = event.detail.selection.value;
            element.dispatchEvent(new Event('change'));
          }
        }
      }
    };

    if (typeof KuferWEB.Utils.Completion.fromBeginning === "boolean" && KuferWEB.Utils.Completion.fromBeginning) {
      autoCompleteConfig.data.filter = (list) => {
        const results = list.filter((item) => {
          const inputValue = autoCompleteJS.input.value.toLowerCase();
          const itemValue = item.value.toLowerCase();

          if (itemValue.startsWith(inputValue)) {//Uebereinstimmung ab Wortbeginn
            return item.value;
          }
        });

        return results;
      };
    }
    const autoCompleteJS = new autoComplete(autoCompleteConfig);
    myCompletions[inputFieldId] = autoCompleteJS;
  };

  // Holt sich per Ajax den Ort, wenn eine Postleitzahl eingetragen wurde.
  // Funktioniert nur bei getrennten PLZ und Ort, nicht beim Feld PLZ und Ort
  jQuery(function ($) {
    var pfadZuIndex = '';

    /**
     * Bei Typo3 muss der Pfad zum /webbasys-Ordner überschrieben werden.
     * 
     * Wird derzeit nur für den Change-Event der Postleitzahl verwendet, könnte aber später auch verallgemeinert werden.
     * 
     * @param string pString Pfad zum webbasysordner inclusive webbasys/ (Abschließendes Slash nicht vergessen!)
     */
    window.setPfadZuIndex = function (pString) {
      pfadZuIndex = pString;
    };

    if (document.getElementById('tedit_nurstrasse_ajaxid') !== null
      && document.getElementsByName('tedit_nurplz').length > 0) {
      KuferWEB.OnAnmeldungInit.push(KuferWEB.Utils.Completion.InitStrassenAutocompletion);
    }

    if ($('#tedit_nurplz_ajaxid, #bedit_abw_nurplz_ajaxid, #ledit_nurplz_ajaxid, #teditma_nurplz_ajaxid').length > 0) {

      $(document).on('change', '#tedit_nurplz_ajaxid, #bedit_abw_nurplz_ajaxid, #ledit_nurplz_ajaxid, #teditma_nurplz_ajaxid', function () {
        var $inputOrt;
        var $this = $(this);
        if ($this.attr('id') === 'tedit_nurplz_ajaxid') {
          var name = $this.attr('name');
          if (name == 'teditmehr_nurplz') {
            $inputOrt = $('input[name="teditmehr_nurort"]');
          } else {
            $inputOrt = $('#tedit_nurortid');
          }
        }
        else if ($this.attr('id') === 'ledit_nurplz_ajaxid') {
          $inputOrt = $('#ledit_nurortid');
        }
        else if ($this.attr('id') === 'teditma_nurplz_ajaxid') {
          $inputOrt = $('#teditma_nurortid');
        }
        else {
          $inputOrt = $('#bedit_abw_nurortid');
        }
        // Geht von deutschen oder österreichischen Postleitzahlen aus. Falls die PLZ komplett eingetragen wurde, 
        // wird eine Ajax-Abfrage, welche den Ort lädt abgesendet.
        if ($this.val().length === 5 || $this.val().length === 4) {
          $inputOrt.attr('disabled', true).addClass('disabled');
          pfad = (typeof kw !== "undefined" && kw.wbBasePath) ? kw.wbBasePath : pfadZuIndex;
          jQuery.ajax({
            type: "POST",
            dataType: 'json',
            url: pfad + 'index.php?ajaxAction=GetOrtByPlz',
            data: {
              plz: $(this).val()
            },
            success: function (pData) {
              var $ort = pData.ort;
              if ($ort.length > 0) {
                $inputOrt.val($ort);
              }
              $inputOrt.attr('disabled', false).removeClass('disabled');
              $inputOrt.trigger('change'); //z.B. für Knockout
            },
            error: function () {
              $inputOrt.attr('disabled', false).removeClass('disabled');
            }
          });
        }
      });
    }
  });

} //end jQuery defined

function katTextHide() { //ausgelagert, um es auch bei Mobillayouts nutzen zu können
  //entsprechende Beschreibungen verstecken und "... mehr" einbauen
  var $toBeHidden = jQuery('.kw_katdesc2');
  //nur wenn auch was versteckt werden muss, ist der ganze Aufwand nötig
  if ($toBeHidden.length > 0) {
    var clickauf = ' <span class="kw_clickauf"> ... <span class="kw_katue_moreInfo"> &raquo; mehr</span></span>';
    //erstes verstecken
    $toBeHidden.each(function (index, item) {
      var $item = jQuery(item);
      $item.hide();
      var $parent = $item.parents('.kw_catdescContainer');
      if ($parent.find('span.kw_clickauf').length === 0) {
        $parent.append(clickauf);
      }
    });
    //aufklappen
    jQuery(document).on('click', 'span.kw_clickauf', function (e) {
      var $parent = jQuery(this).parents('.kw_catdescContainer');
      $parent.find('.kw_katdesc2').show();
      $parent.find('.kw_clickauf').remove();
      $parent.append('<span class="kw_clickzu kw_katue_lessInfo"> &laquo; weniger </span>');
    });
    //weiteres verstecken
    jQuery(document).on('click', 'span.kw_clickzu', function (e) {
      var $parent = jQuery(this).parents('.kw_catdescContainer');
      $parent.find('.kw_katdesc2').hide();
      $parent.find('.kw_clickzu').remove();
      $parent.append(clickauf);
    });
  }
}

jQuery(function ($) {
  // Honeypot und Meldung verstecken
  $("#honeypot-error-msg").hide();

  // Verhindern, dass "weiter" geklickt wird, wenn Honeypot aktiv ist
  $("#kw-anm-form, #wbloginregisterform").submit(function () {
    if ($("#honeypot").length > 0 && $("#honeypot").val() != "") {
      $("#honeypot-error-msg").show();
      return false;
    }
  });

  addTogglePasswordButton();

});

// jQuery Chosen Plugin: Möglichkeit in Select-Feldern zu suchen 
if (jQuery.fn.chosen) {
  jQuery(function ($) {
    $(".chosen-select option").each(function () {
      $(this).html($(this).html().replace(/&nbsp;/g, ''));
    });
    $(".chosen-select").chosen();
  });
}

function addTogglePasswordButton() {
  let results = document.getElementsByClassName('toggle-pw-visibility');
  for(let input of results) {
    input.style.setProperty('display', 'inline');
    let html = '<i class="fa fa-eye" id="togglepw-'+input.id+'" data-input-id="'+input.id+'" style="margin-left: -30px; cursor: pointer; display: inline;"></i>';
    input.parentElement.innerHTML += html;
    
    let icon = document.getElementById('togglepw-'+input.id);
    icon.addEventListener('click', function() {
      let pwInput = document.getElementById(icon.dataset.inputId);
      const type = pwInput.getAttribute('type') === 'password' ? 'text' : 'password';
      pwInput.setAttribute('type', type);
      // toggle the eye slash icon
      this.classList.toggle('fa-eye-slash')
    });
  }
}

// Einteilung des IBAN-Feldes in Vierergruppen:

//Leerzeichen nach 4 Zeichen einfügen
function addSpacesIBAN(event) {
  //Bei manchen Smartphones gibt es diverse Probleme, weshalb die Funktion jetzt bei allen touchfähigen Geräten deaktiviert wird.
  //Beispielsweise wird das DE02 bei der Eingabe auf einmal zu DEDE02. Außerdem kann man Zeichen nicht mehr zuverlässig löschen,
  //wenn man über ein Leerzeichen hinweg löschen möchte.
  if (!isTouchDevice()) {
    inputField = this;

    // KeyCode der Tastatureingabe
    var code = event.keyCode || event.which;
    var backspace = 8;
    var tabShiftCtrlAlt = [9, 16, 17, 18];
    var space = 32;
    var pfeiltasten = [37, 38, 39, 40];

    // eigentliche Funktion soll nicht bei Pfeiltasten oder Tab, Shift, Ctrl oder Alt ausgelöst werden; 
    // Space-Taste soll im Input-Feld ganz deaktiviert werden
    if (pfeiltasten.indexOf(code) != -1 || tabShiftCtrlAlt.indexOf(code) != -1) {
      var execute = false;
    } else if (code == space) {
      return false;
    } else {
      var execute = true;
    }
    setTimeout(function () {
      if (execute) {
        // Cursor/Startauswahl merken
        var caretPosStart = inputField.selectionStart;
        var caretPosEnd = inputField.selectionEnd;
        var caretPosAtEnd = (caretPosStart == caretPosEnd) && (caretPosEnd == inputField.value.length);

        // bisherige IBAN-Eingabe in Array speichern
        var val = inputField.value.replace(/ /g, '');
        var valarr = val.split('');
        var str = '';

        // Die Zeichen der Eingabe setzen 
        for (i = 0; i < valarr.length; i++) {
          str += valarr[i];
          // Leerzeichen nach 4 Stellen setzen
          if ((i + 1) % 4 == 0) {
            str += ' ';
          }
        }
        // IBAN-Eingabe mit Leerzeichen im Inputfeld einfügen
        inputField.value = str.substr(0, inputField.maxLength).toUpperCase();

        // Cursor/Startauswahl mit Berücksichtigung der Leerzeichen wiederherstellen
        if (caretPosAtEnd && code != backspace)
          inputField.setSelectionRange(inputField.value.length, inputField.value.length);
        else if (inputField.value.charAt(caretPosStart) == ' ' && caretPosStart == caretPosEnd && code != backspace)
          inputField.setSelectionRange(caretPosStart + 1, caretPosEnd + 1);
        else
          inputField.setSelectionRange(caretPosStart, caretPosEnd);

        // Change-Event für IE manuell triggern, da er in einigen Situationen nicht gefeuert wurde, obwohl ein change eingetreten ist
        if (event.type != 'change') {
          jQuery(inputField).trigger('change');
        }
      }
      // Prüfen ob BIC-Felder ausgeblendet werden sollen; nicht beim Stammhörerlogin
      if (!inputField.id.includes('bvedit'))
        showOrHideBIC(inputField.value, inputField.name);
    }, 5);
  }
}

function isTouchDevice() {
  var iOS = (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream);
  if(iOS) {
	  return true;
  }
  return ('ontouchstart' in document.documentElement);
}

//Ist die eingegebene IBAN eine deutsche IBAN?
function isDE(pStr) {
  var tmp = pStr;
  var tmplength = tmp.length;
  if (tmplength < 2 || tmp.substr(0, 2) == 'DE') {
    return true;
  } else {
    return false;
  }
}

function showOrHideBIC(pStr, pName) {
  var bicName = pName.replace('iban', 'bic');
  var inputFelderBIC = jQuery('input[name=' + bicName + '], label[for=' + bicName + 'id]');
  if (!isDE(pStr)) {
    inputFelderBIC.show();
  } else {
    inputFelderBIC.hide();
  }
}

//Leerzeichen wieder löschen
function removeSpacesIBAN() {
  this.value = this.value.replace(/ /g, '');
}

//Max-length für input-Feld hochsetzen (da Leerzeichen berücksichtigt werden müssen)
function addMaxLengthIBAN() {
  var maxlength = this.maxLength;
  if (maxlength % 4 == 0) this.maxLength = maxlength + Math.floor(maxlength / 4) - 1;
  else this.maxLength = maxlength + Math.floor(maxlength / 4);
}

//Trigger für die verschiedenen IBAN-Funktionen
jQuery(document).ready(function ($) {
  if ($('input[id*="iban"]').length > 0) {
    //Am Anfang die max-length der IBAN-Felder erhöhen
    $('input[id*="iban"]').each(addMaxLengthIBAN);

    //Bei der Eingabe der IBAN die Leerzeichen setzen
    $('input[id*="iban"]').each(function () {
      $(this).on('keydown', addSpacesIBAN);
      $(this).trigger('keydown');
    });

    //Beim Abschicken des Formulars die Leerzeichen wieder löschen
    $('form').on('submit', function () {
      $('input[id*="iban"]').each(removeSpacesIBAN);
      $('input[id*="iban"]').trigger("change");
      //Für das GiroCheckout Plugin nötig, da bei Eingabe der BIC mit Autocompletion via giropaywidget.js
      //der Wert nicht von knockout.js übernommen wird wenn nicht noch ein extra change event ausgelöst wird
      $('input[id*="giropay_bic"]').trigger("change");
    });
  }

  //Spendenbetrag (Helenchen)
  $('#tedit_spendenbetragid').change(function () {
    var $this = jQuery(this);
    var value = $this.val();
    if (!isNaN(parseFloat(value))) {
      value = value.replace(',', '.');
      value = parseFloat(value).toFixed(2);
      if (value > 0) {
        $('#tedit_spendencheckid').prop("checked", false).click(); //umgekehrt und mit click(), damit observable von KnockoutJS auch informiert wird
      } else {
        $('#tedit_spendencheckid').prop("checked", true).click(); //umgekehrt und mit click(), damit observable von KnockoutJS auch informiert wird
        value = '0,00';
      }
      value = value.replace('.', ',');
      $this.val(value);
    } else {
      $('#tedit_spendencheckid').prop("checked", true).click(); //umgekehrt und mit click(), damit observable von KnockoutJS auch informiert wird
      $this.val('0,00');
    }
  });
});

// ZSA und Stammhörerlogin
jQuery(function ($) {

  jQuery(document).on('change', '#merklisteerinnerungsmailaktiv', function () {
    if (typeof kw === 'undefined') {
      console.log('kw.wbBasePath not defined!');
      return;
    }
    var data = {
      'key': 'merklisteerinnerungsmailaktiv',
      'value': jQuery('#merklisteerinnerungsmailaktiv')[0].checked ? 1 : 0,
    };
    jQuery.ajax({
      type: "POST",
      url: kw.wbBasePath + 'index.php?ajaxAction=SetStammhoererSetting',
      data: data,
      success: function (pData) {},
      error: function (XHR, textStatus, errorThrown) {
        console.log("AJAX Error: " + textStatus + ": " + errorThrown);
      }
    });
  });

  //Registrierungsformular
  if ($('.tn_unique').length > 0) { // TODO auf was anderes Abfragen

    var bkbvtnNr = 0;
    if ($('.bkbvtnid').length > 0) {
      bkbvtnNr = $('.bkbvtnid').last().val() * 1 + 1;
    }

    var $dienststelle = $('.zsa_dienststelle').clone();
    var $zielgruppe = $('.zsa_zielgruppe').clone();

    if (zsaCategorie) {
      var zsaKategorien = zsaCategorie.subCategories;
      $(zsaKategorien).each(function (index, value) {
        // Überlegung: Jede Option die Unterkategorien (Zielgruppen) als Data mitgeben?
        $('.zsa_bkbvtn_template .zsa_zielbereich').append('<option value="' + value.id + '">' + value.text + '</option>');
      });
    }

    var $bkbvtn = $('.zsa_bkbvtn_template').clone();
    $('.zsa_bkbvtn_template').remove();

    $(document).on('change', '.zsa_zielbereich', function () {
      var $parent = $(this).parents('.zsa_bkbvtn');
      var kategorieId = $(this).val();
      $('.zsa_zielgruppe', $parent).html($zielgruppe.html());

      $(zsaKategorien).each(function (index, value) {
        if (value.id == kategorieId) {

          $(value.subCategories).each(function (index, value) {

            // Überlegung: Jede Option die Unterkategorien (Zielgruppen) als Data mitgeben?
            $('.zsa_zielgruppe', $parent).append('<option value="' + value.id + '">' + value.text + '</option>');
          });


        }
      });

      $('.zsa_dienststelle', $parent).html($dienststelle.html());

      $.each(zsadienststellen, function (index, value) {
        if (index == kategorieId) {
          $(value).each(function (index, valuee) {
            // Überlegung: Jede Option die Unterkategorien (Zielgruppen) als Data mitgeben?
            $('.zsa_dienststelle', $parent).append('<option value="' + valuee.id + '">' + valuee.teilnehmer.name + ' ' + valuee.teilnehmer.zusatz + ' ' + valuee.teilnehmer.zusatz2 + '</option>');
          });
        }
      });
    });

    $(document).on('click', '.zsa_bkbvtn_add', function () {
      //var $zsaBkBvTn = $('.zsa_bkbvtn').first().clone();
      var $bkbvtnDiv = $bkbvtn.clone(); //$('<div></div>').append($bkbvtn.clone());

      // TODO wie können Lücken vermieden werden?
      $('.zsa_bkbvtn').last().after($bkbvtnDiv.html().replace(/{nr}/g, bkbvtnNr));
      bkbvtnNr++;
    });


    $('#zsa_register input[name=tedit_gebdat]').on('change', function () {
      if (KuferWEB.Utils.Filter.IsDate($(this).val())) {
        $('label[for=tedit_gebdatid]').removeClass('pflicht');
      } else {
        $('label[for=tedit_gebdatid]').addClass('pflicht');
      }
    });

    $('.checkDublette').click(function () {
      $('.tn_doppelt_meldung').hide();
      $('.zsa_dmz_keineVerbindung').hide();
      $('.zsa_daten_eintragen').hide();

      var name = $('input[name=tedit_name]').val();
      var vorname = $('input[name=tedit_vorname]').val();
      var gebdat = $('input[name=tedit_gebdat]').val();

      if (name.trim() === '' || vorname.trim() === '' || gebdat.trim() === '' || gebdat.trim() === '30.12.1899' || !KuferWEB.Utils.Filter.IsDate(gebdat)) {
        $('.zsa_daten_eintragen').show();

        return;
      }

      $('.zsa_loading').show();

      var data = {
        'tedit_name': name,
        'tedit_vorname': vorname,
        'tedit_gebdat': gebdat
      };
      var basepath = (typeof KuferWEB.Settings.basepath_wb != 'undefined') ? KuferWEB.Settings.basepath_wb : '';
      $.post(basepath + 'index.php?ajaxAction=isDubletteGebdat', data, function (result) {
        $('.zsa_loading').hide();

        var $invalidInput = $(result).find('invalidInput');
        if ($invalidInput.length > 0) {
          $('.zsa_daten_eintragen').show();
        } else {
          var $keineVerbindung = $(result).find('keineVerbindung');
          if ($keineVerbindung.length > 0) {
            $('.zsa_dmz_keineVerbindung').show();
          } else {
            var $isDublette = $(result).find('isDublette');
            if ($isDublette.length == 0) {
              handleKeineDublette();
            } else {
              if ($isDublette.text()) {
                $('.tn_doppelt_meldung').show();
              } else {
                handleKeineDublette();
              }
            }
          }
        }
      });
    }); //end .checkDublette.click()

    //with only the first three fields visible: ENTER must result in checkDublette and not in a form submission
    jQuery("form#zsa_register").on("submit", function () {
      if (!jQuery(".tn_weitere").is(":visible")) {
        jQuery(".checkDublette").trigger("click");
        return false;
      } else {
        return true;
      }
    });

    if ($('.dubletteGeprueft').length > 0) {
      handleKeineDublette();
    }

    function handleKeineDublette() {
      $('.tn_unique input').prop('readonly', true);
      $('.checkDublette').hide();
      $('.tn_weitere').show();
    }

  }

  $('.zsa_bkbvtn_bearbeiten').click(function () {
    var $base = $(this).parents('.zsa_bkbvtn_base');
    $base.find('.zsa_bkbvtn_readonly').hide();
    $base.find('.zsa_bkbvtn_bearbeitbar').show();
  });

  $('.zsa_bearbeiten_abbrechen').click(function () {
    var $base = $(this).parents('.zsa_bkbvtn_base');
    $base.find('.zsa_bkbvtn_readonly').show();
    $base.find('.zsa_bkbvtn_bearbeitbar').hide();
  });

  $('.zsa_bkbvtn_add_zb').click(function () {
    $(this).hide();
    $('.zsa_bkbvtn_weiter').show();
  });

  initZielbereichAuswahl($('.zsa_bkbvtn_weiter .zsa_zielbereich'), $('.zsa_bkbvtn_weiter .zsa_zielgruppe'), $('.zsa_bkbvtn_weiter .zsa_dienststelle'));

  function initZielbereichAuswahl($zielbereich, $zielgruppe, $dienststelle) {
    $zielbereich.change(function () {
      var kategorieId = $(this).val();
      var subCategories = getSubCategories(kategorieId);
      setZielGruppenOptions($zielgruppe, subCategories);

      var dienststellen = getDienststellen(kategorieId);
      setDienststellenOptions($dienststelle, dienststellen);
    });
  }

  function getSubCategories(kategorieId) {
    var result = [];
    $.each(zsaCategorie.subCategories, function (index, value) {
      if (value.id == kategorieId) {
        result = value.subCategories;
      };
    });
    return result;
  }

  function setZielGruppenOptions($zielgruppe, subCategories) {
    $zielgruppe.html(''); // damit werden eventuelle Defaultwerte entfernt. 
    $.each(subCategories, function (index, value) {
      $zielgruppe.append('<option value="' + value.id + '">' + value.text + '</option>');
    });
  }

  function getDienststellen(kategorieId) {
    var result = [];
    $.each(zsadienststellen, function (index, value) {
      if (index == kategorieId) {
        result = value;
      }
    });
    return result;
  }

  function setDienststellenOptions($dienststelle, dienststellen) {
    $dienststelle.html('');
    $dienststelle.append('<option value="-1">--Dienststelle w&auml;hlen</option>');
    $.each(dienststellen, function (index, value) {
      $dienststelle.append('<option value="' + value.id + '">' + value.teilnehmer.name + ' ' + value.teilnehmer.zusatz + ' ' + value.teilnehmer.zusatz2 + '</option>');
    });
  }

  //Handling für das Storno von Belegungen im Stammhörer Login
  /**
  $('.stornoform').click(function() {
  //$('.kw-meine-kurse .text-right').on('click','.teilnehmerStorno',(function() {
    var $this = $(this);
    
    if ( $this.parent().prev().hasClass('anmeldungen-kinder') ) {
      var $kinderAnmeldeDiv = $this.parent().prev();
      var $markableInputs= $kinderAnmeldeDiv.find('.kindername input.markable');
      
      //$selectable Inputs enthält die Checkboxen aller Kinder
      var $selectableInputs= $kinderAnmeldeDiv.find('.kindername input.allowSelect');
      
      //addBelegIds enthält die Ids der selektierten Kinder
      var addBelegIds = [];
      // Im URL ggf. auch mitteilen, ob es sich um Kinderstorno handelt, welche  Kinder BelegIds hinzugefügt 
      // werden und ob alle Kinder selektiert wurden
      var addUrlStr = '';
      
      //Wenn es  Kinder gibt, muß  ein Storno für Kinder (im StornoFirmenMode) durchgeführt werden;
      // nur dann muss der URL erweitert werden
      if ($selectableInputs.length > 0) {
        addUrlStr += '&kinderstorno=1';
        //Belegids der Kinder  aus den angehakten Checkboxen ermitteln
        $selectableInputs.each(function(index,elem) {
          $that = $(this);
          if ($that.is(':checked')) {
            addBelegIds[addBelegIds.length] = $that.attr('id');
          }
        }) //end each()
      
        // Die angehakten BelegIds der Kinder als String in der Form &addbelegids = 37167:38453:..:39756 darstellen
        // und die URL anhängen (falls er nicht leer ist) 
        if (addBelegIds.length > 0) {
          addUrlStr += '&addbelegids=' + addBelegIds.join(':');
        }
      
        // Ermitteln ob alle Kindbelegungen selektiert wurden
        if (addBelegIds.length === $selectableInputs.length) {
          addUrlStr += '&allechecked=1';
        }
 
        //Anhängen des zusätzlichen URL Strings für Kinder
        var urlStr = $this.attr('href') +  addUrlStr;
        $this.attr('href', urlStr);
      } //end if ($selectableInputs.length > 0)
      
    } //end if(... hasClass('anmeldungen-kinder')
      
  })
  **/

  //Submithandler für Storno

  $('.stornoform').submit(function () {

    if ($('.markable').filter(':checked').length === 0) {
      alert("Bitte waehlen Sie einen Teilnehmer zum Stornieren aus. ");
      return false;
    }

  });





}); //end jQuery(function) (enspricht dem Readyhandler
