/**
 * @package admin
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

function trim(string) {
  return string.replace(/^\s+/, '').replace(/\s+$/, '');
}

if (!jQuery.fn.any) {
  jQuery.fn.any = function (filter) {
    for (var i = 0; i < this.length; i++) {
      if (filter.call(this[i])) return true;
    }
    return false;
  };
}

function toggleSubString(string, subString) {
  if (string == undefined) string = '';
  if (subString == undefined) return string;

  var exp = '\\b' + subString + '\\b';
  var regExp = new RegExp(exp, 'g');

  if (string.match(regExp)) {
    string = trim(string.replace(regExp, ''));
    //Aufbau des Strings: "abc def 123 456"
    //Beim Löschen eines Elements, z. B. 123, im String kann eine Lücke bleiben: "abc def  456"
    //Beim Auslesen macht das Probleme und es kommt zu einem JS-Fehler und die Seite
    //kann nicht mehr weiter benutzt werden, solange das Cookie fupload_opendirs nicht gelöscht wurde oder abgelaufen ist.
    //Deshalb werden hier zwei hintereinander vorkommende Leerzeichen mit einem ersetzt.
    string = string.replace('  ', ' ');
    return string;
  }
  else
    return string = trim(string + ' ' + subString);
}
function parseURL(url) {
  if (url == undefined) url = window.location.search;
  if (url == "") return;
  var params = url.slice(1).split("&");
  var param, name, value;
  for (var i = 0; i < params.length; i++) {
    param = params[i].split("=");
    name = decodeURIComponent(param[0]).replace("+", " ").replace("%20", " ");
    value = decodeURIComponent(param[1]).replace("+", " ").replace("%20", " ");
    this[name] = value;
  }
}

/**
 * Speichert das Formular des Inputbuttons per AJAX Request!
 */
function ajaxPost(event) {
  event.preventDefault();
  var form = jQuery(this).parents('form');
  var link = form.prop('action');
  var dataString = 'ajax=content';
  var multipart = false;

  // Der Hiddenstring wird nur für die Stundenplan Uhrzeit Tabelle in inder der Wochenplangrafik (sicht 312) zu Tool 21
  // (Kursübersicht Firmen) benötigt
  if (typeof KuferTools != 'undefined' && typeof KuferTools.generateHiddenString4Post === 'function')
    KuferTools.generateHiddenString4Post();

  /*
  if (typeof stdPlanZeitContainer.generateHiddenString4Post === 'function')
    generateHiddenString4Post(); */

  // Versteckte Eingabefelder
  form.find('input[type=hidden]').each(function () {
    dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
  });
  // Eingabefelder
  form.find('input[type=text]').each(function () {
    dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
  });
  // Passwortfelder
  form.find('input[type=password]').each(function () {
    dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
  });
  // Absendebutton

  dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());

  // Angewählte Checkboxen
  form.find('input[type=radio]').each(function () {
    if (this.checked == true) {
      dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
    }
  });
  // Angewählte Radio-Groups
  form.find('input[type=checkbox]').each(function () {
    if (this.checked == true) {
      dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
    }
  });
  // Textarea
  form.find('textarea').filter(function () { return $(this).val() !== ""; }).each(function () {
    jQuery(this).css('display', 'block');
    dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());

  });
  // Select-Box
  form.find('select').filter(function () { return $(this).val() !== ""; }).each(function () {
    dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
  });
  // FileUpload
  form.find('input[type=file]').each(function () {
    dataString = dataString + '&' + jQuery(this).prop('name') + '=' + encodeURIComponent(jQuery(this).val());
  });

  // Speichern von + Zeichn in den Sichten
  dataString = dataString.replace(/\+/g, '%2B');

  jQuery('div#content').addClass('loading');

  //Schickt hier einen Ajax Post ab
  jQuery.ajax({
    type: "POST",
    url: link,
    data: dataString
  }).done(function (data) {
    jQuery('div#content_inlay').html(data);
    preparePage();
  }).always(function () {
    jQuery('div#content').removeClass('loading');
  });
} //end ajaxPost()

function securityQuestion(element, dialogid) {
  dialogid = (typeof (dialogid) == 'undefined') ? 'securitydialog' : dialogid;
  var confirmed = false;
  jQuery('#' + dialogid).dialog({
    modal: true,
    width: 400,
    buttons: {
      "Ok": function () {
        jQuery(this).dialog("close");
        // Dialog
        if (jQuery(element).is('input')) {
          jQuery(element).parents('form').trigger('submit');
        } else if (jQuery(element).is('a')) {
          loadContent(jQuery(element).prop('href'));
        }
      },
      "Abbrechen": function () {
        jQuery(this).dialog("close");
      }
    }
  });
}

function loadContent(link) {
  jQuery('div#content').addClass('loading');

  // Beim Laden einer Seite wird globale Variable KuferTools.generateHiddenstring4Post wieder zurückgesetzt, falls sie vorhanden
  // ist. Das verhindert, dass diese Funktion (Anm.: diese Variable beinhaltet eine Funktion) für andere Eingaben als die
  // Stundenplan Table in Tool21 (Sicht 312) ausgeführt wird; TODO: evtl. gibt es auch eine bessere Stelle,
  // um dies einzubauen
  if (typeof KuferTools !== 'undefined')
    KuferTools.generateHiddenString4Post = null;

  jQuery.get(link, { 'ajax': 'content' }, function (data) {
    jQuery('div#content_inlay').html(data);
    preparePage();
    jQuery('div#content').removeClass('loading');
    setHelpTextDialog();
  });
}

/*****************************************************************************
 * Prüfen, ob die Session abgelaufen ist und ggf. abmelden
 *****************************************************************************
 */
function checkSession() {
  jQuery.get('index.php?action=checklogin', function (data) {
    if (data == 'loggedIn:false') {
      location.reload();
    } else {
      // Funktion in 10 Sekunden wieder aufrufen
      // Angepasst, dass location.reload nur einmal ausgeführt wird, da es sonst extrem nervig ist,
      // alle paar Sekunden die Meldung wegzudrücken.
      window.setTimeout(checkSession, 15000);
    }
  });
}
checkSession();


function linkToSightClicked(event, $this) {
  var $href = $this.attr('href');
  var $navToMark = $('div#nav2 a[href$="' + $href + '"]');
  $navToMark.parents('ul.level3, ul.level4, ul.level5').css("display", "block");
  $navToMark.css("display", "block");
  markActiveNav(event, $('div#nav2 a.active'), $navToMark);
}

function saveActiveNavHierarchy($NavToMark) {
  var navHierarchy = [];
  navHierarchy.push($NavToMark.text().trim());
  $NavToMark.parents('li').each(function (i) {
    if (i > 0) { // not the current element
      navHierarchy.push($(this).children('a').text().trim());
    }
  });
  // muss encodiert werden, sonst Strings mit Umlauten werden nicht korrekt gespeichert, in PHP wird decodiert
  var navHierarchyEncodedStr = base64.encode(navHierarchy.join());
  jQuery.post('index.php?ajax=session&set=activeNavHierarchy:' + navHierarchyEncodedStr);
}

function markActiveNav(event, $markedNav, $NavToMark) {
  event.preventDefault();
  // "active" des vorherigen Aktiven Menüpunkts entfernen.
  $markedNav.removeClass('active');
  // Angeklickten Menüpunkt aktiv setzen
  $NavToMark.addClass('active');
  $NavToMark.parents('ul').prev('a').addClass('active');

  // speichert den Link des aktuell ausgewählten Elements
  var navToMarkLink = base64.encode($NavToMark.attr('href'));
  jQuery.post('index.php?ajax=session&set=navToMarkLink:' + navToMarkLink);

  saveActiveNavHierarchy($NavToMark);

  var link = $NavToMark.prop('href');

  if (window.history && typeof window.history.pushState === 'function' && typeof URL === 'function' && typeof URLSearchParams === 'function') {
    var lastLink = window.location.href;
    if (!history.state || !history.state.loadedFromMarkActiveNav) {
      // Um richtigen Menüpunkt ansteuern zu können
      var $lastMarkedNav = $markedNav.last();
      if ($lastMarkedNav.hasClass('hasnosubitems')) {
        lastLink = $lastMarkedNav.prop('href');
        window.history.replaceState({ loadedFromMarkActiveNav: true }, '', lastLink);
      }
      else if ($markedNav.length === 0) {
        lastLink = $('li > a.hasnosubitems').first().prop('href');
        window.history.replaceState({ loadedFromMarkActiveNav: true }, '', lastLink);
      }
    }
    if (link !== lastLink) {
      window.history.pushState({ loadedFromMarkActiveNav: true }, '', link);
    }
  }

  loadContent(link);
}

/**
 * Details per Klick als Dialog öffnen
 */
function setHelpTextDialog() {
  $('div.detail a').on('click', function (event) {
    event.stopPropagation(); // Nicht den DOM Hochgehen (und div.detail event ausführen)
  });

  $('div.detail').on('click', function (event) {
    var $meldung = $('<div class="detail_dialog">' + $(this).html() + '</div>');

    $meldung.dialog({
      title: 'Details',
      modal: true,
      autoOpen: true,
      dialogClass: 'largeFont',
      minWidth: 800,
      closeText: "",
      close: function () { $(this).dialog("destroy") }
    });
  });
}

function copyToClipboard(text) {
  var $temp = $('<textarea>');
  $("body").append($temp);
  $temp.val(text).trigger('select');
  document.execCommand("copy");
  $temp.remove();
}

$(function ($) {
  /*****************************************************************************
   * Nachladen der Seiteninhalte per Ajax
   *****************************************************************************
   */

  $('div#nav2 a').on('click', function (event) {
    markActiveNav(event, $('div#nav2 a.active'), $(this));
  });

  if (window.history && typeof window.history.pushState === 'function' && typeof URL === 'function' && typeof URLSearchParams === 'function') {
    window.addEventListener('popstate', function (event) {
      if (!history.state || !history.state.loadedFromMarkActiveNav) {
        return;
      }

      loadContent(window.location);

      var url = new URL(window.location);
      i = 1;
      var $current = $('#nav2');
      do {
        $current = $current.find('ul.level' + i + ' > li')
        var searchParam = url.searchParams.get('sub' + i);

        if ($current.length >= searchParam && searchParam > 0) {
          $current = $($current[searchParam - 1]);
        }
        else {
          break;
        }
        i++;
      } while ($current.has('ul.level' + i) && url.searchParams.has('sub' + i));

      if ($current.length === 1) {
        $('div#nav2 a.active').removeClass('active');
        $current.find('a.hasnosubitems').addClass('active');
        $current.parents('ul').prev('a').addClass('active');
      }
    });
  }

  /*****************************************************************************
   * Die n-te Ebene des Untermenüs einklappen & ausklappen
   *****************************************************************************
   */

  var countSubItems = 5; //Anzahl an Ebenen; muss angepasst werden, falls weitere Unterpunkte in der Navigation hinzukämen

  // Generelles ausblenden
  for (var i = 2; i <= countSubItems; i++) {
    $('#nav2 ul.level' + i.toString()).toggle();
  }


  $('#nav2 a.active').removeClass('active');

  jQuery.post('index.php?ajax=session&key=navToMarkLink', function (dataBase64) {
    var dataJson = base64.decode(dataBase64);
    var data = JSON.parse(dataJson);

    if (data.navToMarkLink != undefined && data.navToMarkLink != '') {
      var markedNavLink = base64.decode(data.navToMarkLink),
        $MarkedNav = $('a[href="' + markedNavLink + '"]');
      $MarkedNav.addClass('active');

      // Das Menü der aktiven Seite soll immer aufgeklappt sein!
      $('#nav2 a.active').next('ul').toggle();
    }
  });


  // Toggle
  $('#nav2 a.hassubitems').each(function () {
    var link = new parseURL($(this).prop('href'));
    var name = '';
    for (var i = 1; i <= countSubItems; i++) {
      if (typeof link['sub' + i.toString()] !== 'undefined') {
        name += link['sub' + i.toString()];
      }
    }
    $(this).prop('name', name);
  });

  var url = new parseURL();
  var page = url['action'];


  var activmenu = '';
  jQuery.post('index.php?ajax=session&key=activmenu_' + page, function (dataBase64) {
    var dataJson = base64.decode(dataBase64);
    var data = JSON.parse(dataJson);

    activmenu = data['activmenu_' + page];

    if (activmenu != undefined && activmenu != '') {
      var openSubParts = activmenu.split(" ");

      // Welche Oberpunkte sollen aufgeklappt werden
      for (var i = 0; i < openSubParts.length; i++) {
        $('#nav2 a.hassubitems[name=\'' + openSubParts[i] + '\']')
          .next().toggle()
          .prev().prev().addClass('ui-icon-circle-minus').removeClass('ui-icon-circle-plus');
      }

      // only toggled (displayed) elements should have minus sign
      var subParts = $('.hassubitems');
      subParts.each(function () {
        if ($(this).prev().hasClass('ui-icon-circle-minus') && $(this).next().is(":hidden")) {
          $(this).prev().removeClass('ui-icon-circle-minus').addClass('ui-icon-circle-plus');
        }
      });
    }
  });

  // Klick auf den Link
  $('#nav2 a.hassubitems').off('click');
  $('#nav2 a.hassubitems').on('click', function (event) {
    event.preventDefault();

    activmenu = toggleSubString(activmenu, $(this).prop('name'));
    jQuery.post('index.php?ajax=session&set=activmenu_' + page + ':' + activmenu);

    var prev = $(this).prev();
    $(this).next("ul").toggle({
      duration: 'fast',
      start: function (animation) {
        if (animation.tweens[0].end > 0) {
          prev.removeClass('ui-icon-circle-plus');
          prev.addClass('ui-icon-circle-minus');
        } else {
          prev.removeClass('ui-icon-circle-minus');
          prev.addClass('ui-icon-circle-plus');
        }
      }
    });
  });

  // Klick auf das "+" Symbol
  $('#nav2 div.fold').off('click');
  $('#nav2 div.fold').on('click', function () {
    $(this).parent().find('.hassubitems').first().trigger('click');
  });

  setHelpTextDialog();

  // Einige Buttons haben den Typ Submit aus Layoutgründen, obwohl diese nicht das Formular absenden sollen
  // Langfristige bessere Lösung: Das Button-Layout nur über Klassen, und nicht über Typ lösen.
  jQuery('.noSubmit').on('click', function (event) {
    event.preventDefault();
  });
});
