/*
     $Revision$
     $Id$

     File:          notes.js
     Description:   clientside functions for shared/notes.inc
*/

function init_note(pnote_key)
{
  window.noteediting = false;
  window.module = $("#module").val();
  window.module_key = $("#" + window.module + "_key").val();

  if (pnote_key > -1 && FcltMgr.startEdit(window))
  {
    window.noteediting = true;
    var textarea_elem = document.getElementById("note");
    textarea_elem.focus();
    textarea_elem.setSelectionRange(textarea_elem.value.length, textarea_elem.value.length);
  }

  $("#note").autogrow();

  $(window).on("beforeunload", function() {
      $(window.document).off("scroll");
      if (window.noteediting)
      {
        FcltMgr.stopEdit(window);
      }
  });

  if (pnote_key == -1 && $("#note").val() == "" && !window.noteediting) {
    validateTextarea(false);
  }

  $("#note").on("keyup", function (e)
  {
    if (pnote_key == -1 && $("#note").val() == "" && window.noteediting)
    {
      if (FcltMgr.stopEdit(window))
      {
        window.noteediting = false;
        validateTextarea(false);
        lock_warning(false);
      }
    }
    else if (!window.noteediting && (pnote_key > -1 || $("#note").val() != ""))
    {
      if (FcltMgr.startEdit(window))
      {
        window.noteediting = true;
        validateTextarea(true);
        lock_warning(true);
      }
    }
  });

  $("#note").on("input", function (e)
  {
    if (typeof sgMention9999 !== "undefined" && e.originalEvent.data === "@") {
      startMention();
    }
    draft_note(window.module, window.module_key, $("#note").val());
  });

  $(".note-icon").on("keyup", function (e)
  {
      if (e.keyCode === 13) { /* Enter */
          $(".note-icon").trigger("click");
      }
  });

  $(".reply-container").on("click", function ()
  {
      var target = document.getElementById($(this).find(".reply-body").attr("data-target"));
      if (!target || $(target).data("transitioning")) // Mogelijk bij een hidden & ge-quote notitie bijvoorbeeld
          return;
      $(target).data("transitioning", true);
      var scrollTop = $(target).offset().top                      // Notitie-offset met top vd pagina
                    - (document.documentElement.clientHeight / 2) // Helft v/d notitie-pagina hoogte (zodat notitie in het midden komt)
                    + (target.clientHeight / 2);                  // Helft v/d notitie-hoogte (zodat notitie exact in het midden komt)

      $(document.documentElement).animate({ scrollTop: scrollTop }, 250, function () {
          var $lowlight = $("<div class='lowlight-overlay'></div>");
          $(target).find(".note-container").prepend($lowlight); // Dit is de *tijdelijke* lowlight overlay
          $lowlight.one("animationend", function() {
              $(this).remove();                                 // En hier is die weer weg
              $(target).data("transitioning", false);
          });
      });
  });

  load_note_draft();

  function triggerKeyup()
  {
    $("#note").keyup();
  }

  function triggerKeyupAfterPaste()
  {
    setTimeout( triggerKeyup )
  }
  $("#note").on("paste", triggerKeyupAfterPaste);
  $(".note-toggler").on("click", toggleNotes);

  function toggleNotes(event)
  {
      var $note_text = $(this).prev(".note-text");
      $note_text.one("transitionend", function() { FcltMgr.resized(); });

      if ($note_text.hasClass("note-autocollapse") || $note_text.hasClass("note-collapsed"))
      {
          $note_text.removeClass("note-autocollapse note-collapsed");
          $(this).html(L("lcl_rs_truncate"));
      }
      else
      {
          $note_text.addClass("note-collapsed");
          $(this).html(L("lcl_rs_truncated"));
      }
  }

  function delayed(delay, fn)
  {
      if (window.timerID)
          clearTimeout(window.timerID);
      window.timerID = setTimeout(fn, delay);
  }

  if ($(".btn-group").length)
      init_detailToggle(pnote_key);

  $(window.document).on("scroll", function () { delayed(50, function() {
      if ($(this).scrollTop() > 100)
          $(".note-top-button").fadeIn(50).css("display", "flex");
      else
          $(".note-top-button").fadeOut(50);
  })});

  if (pnote_key > -1) {
    // Potentieel toggles disablen als deze notitie op een verborgen notitie replied
    var $currentReply = $(".note-textarea.note-edit .reply-body");
    if ($currentReply.length) { // Ik bevat momenteel een reply
      var replyFlag = $("#" + $currentReply.attr("data-target")).find(".note-container").attr("data-flag");
      _disableToggles(replyFlag);
    }
  }
}

function onCloseHot() {
  draft_note(window.module, window.module_key, null); // Verwijder de draft
}

function init_detailToggle()
{
    var toggle_selectors = { "notes": ".note-container:not(.note-type-tracking, .note-fe-hidden)",
                             "tracking": ".note-type-tracking",
                             "fehidden": ".note-fe-hidden" };

//    var hasNotes            = $(toggle_selectors["notes"]).length ? 1 : 0;
    var hasTracking         = $(toggle_selectors["tracking"]).length ? 1 : 0;
    var hasMoreToggle       = $(".note-toggler").length ? 1 : 0;
    var hasHiddenNotes      = $(toggle_selectors["fehidden"]).length ? 1 : 0;
    var nf_arr              = (window.localStorage.getItem("notitiefilter") || "").split(",");

//    if (true) // Anders valt er niets te togglen, *edit; altijd relevante toggles tonen zodat je bijv. default tracking altijd kan onderdrukken
    {
        //if (false && hasMultipleToggles && hasNotes) // Vooralsnog uitgeschakeld
        //    $(".btn-group").append("<button id='notes-toggle-button' class='button selected' title='" + L("lcl_mld_frame_notes") + "'>" + I("fa-comment-alt-lines") + "</button>");

        if (hasTracking)
            $(".btn-group").append("<button id='tracking-toggle-button' class='button selected' title='" + L("fac_tracking") + "'>" + I("fa-clipboard-list") + "</button>");

        if (hasMoreToggle)
        {
            var hasOnlyOneOpenNote = $(".note-toggler").prev(".note-text:not(.note-collapsed, .note-autocollapse)").length == $(".note-toggler").length;
            $(".btn-group").append("<button id='more-toggle-button' title='" + L("lcl_rs_trunc_both") + "' class='button" + (hasOnlyOneOpenNote ? " selected" : "") + "'>" + I("fa-ellipsis-h") + "</button>");
        }
        if (hasHiddenNotes)
            $(".btn-group").append("<button id='fehidden-toggle-button' title='" + L("lcl_mld_verborgen_FE") + "' class='button selected'>" + I("fa-lock") + "</button>");

        /* Detailniveaus
          0: toggle notities (niet fe_hidden)
          1: toggle tracking
          2: toggle ...Meer/...minder
          3: toggle fe_hidden notes
        */

        var doAnimation = false;
        $(".btn-group > button").on("click", function () { detailToggleClickHandler.call(this, doAnimation); });

        // Toepassen van de laatst gebruikte toestand van notitiefilter
        // Initieel zijn alle buttons op 'selected' gezet en 'more' op ''.
        // Als laatst gebruikte toestand afwijkt van de initiele toestand dan wordt dat hier gewijzigd.
        //if (false && hasNotes && nf_arr[0] == "s") // Vooralsnog deze niet onload weg togglen, te hoog risico op misverstanden
        //    $(".btn-group > button#notes-toggle-button").click();

        if (hasTracking && nf_arr[1] == "s")
            $(".btn-group > button#tracking-toggle-button").click();

        if (hasMoreToggle && !hasOnlyOneOpenNote && nf_arr[2] == "S")
            $(".btn-group > button#more-toggle-button").click();

        if (hasHiddenNotes && nf_arr[3] == "s")
            $(".btn-group > button#fehidden-toggle-button").click();

        doAnimation = true;
    }
}

// Disabled de submit button als je nog niet mag submitten
function validateTextarea(valid) {
  if (typeof valid === "undefined") {
    valid = window.noteediting || $("#note").val() != "";
  }
  $(".note-icon.submit").toggleClass("disabled", !valid);
}

function lock_warning(set_lock)
{   // Alleen voor modules MLD en niet meer voor CNT
    if (window.module == "mld")
    {
      if (!set_lock)
      {
        $("#lock-warning").empty().hide();
      }
      else
      {
        var data = { req_info: "locked"
                   , module_key:  window.module_key
                   };
        var url = "./get_" + window.module + "_info_ajax.asp?req_info=locked";
        $.post( url
              , data
              , function(d)
                {
                  if (d.locked)
                  {
                    var tekst = I("fa-exclamation-triangle") + " "
                              + safe.html(L("lcl_mld_melding_locked").format(d.locked_name, d.locked_date));
                    $("#lock-warning").show().html(tekst);
                    FcltMgr.resized();
                  }
                  else
                  {
                    switch (window.module)
                    {
                      case "cnt": var data = { cnt_key: window.module_key }; break;
                      case "mld": var data = { mld_key: window.module_key }; break;
                    }
                    protectRequest.dataToken(data);
                    $.post( "./" + window.module + "_lock.asp"
                          , data
                          , FcltCallback
                          , "json"
                          );
                  }
                }
              , "json"
              );
      }
    }
}

function startMention()
{
  var i = $("#note").prop("selectionStart");
  if ($("#note").hasClass("mentioning") ||                    // Ik ben al bezig
       (i !== 1 && !/\s/.test($("#note").val().substring(i - 2, i - 1)))) {  // Geen teken voor de '@' behalve spatie (of begin vd notitie)
    return;
  }
  $("#mention_key_show").attr("sgCurrentValue", ""); // Om (huidige waarde) niet te tonen die achter is gebleven van de vorige mention
  $("#note").data("start-index", i);
  $("#note").addClass("mentioning");
  $("#note").on("keydown.mention", navigateMention);    // Voor desktop
  $("#note").on("beforeinput.mention", changeMention);  // Voor desktop & mobile (captured alleen echte input, en geen toetsaanslagen die niets doen, zoals Escape)
  $("#note").on("input.mention", mention);
  $("#note").on("blur.mention", stopMention);
  $("#note").trigger("input.mention");
}

function stopMention()
{
  if (!$("#note").hasClass("mentioning"))
    return;
  $("#note").data("start-index", 0);
  $("#note").removeClass("mentioning");
  $("#note").off(".mention"); // Alle eventhandlers in de 'mention'-namespace

  $("#mention_key_show")[0].value = "";

  var sgEvent = $.Event("keydown");
  sgEvent.keyCode = -2; // Custom voor de mentions in suggest.js
  $("#mention_key_show").trigger(sgEvent);
}

function navigateMention(event) {
  if (event.keyCode == 27) {
    stopMention();
  } else if ([9, 13, 33, 34, 38, 40].indexOf(event.keyCode) != -1) { // = Speciale key met betekenis in suggest.js
    $("#mention_key_show").trigger(event);
    FcltMgr.stopPropagation(event);
    if (event.keyCode == 9) {
      event.preventDefault();
    }
  }
}

function changeMention(event)
{
  if (event.originalEvent && event.originalEvent.data) {
    let key = event.originalEvent.data;
    let keyCode = key.charCodeAt(0);
    if (keyCode == 32 || key == ".") { // Spatie / Punt
      stopMention();
    } else if (keyCode == 8) { // Backspace
      mention(event);
    }
  }
}

function mention(event)
{
  let startIndex = $("#note").data("start-index");
  let searchStr = "";
  let key;
  let keyCode;

  if (event.originalEvent)
  {
    let e = event.originalEvent;
    if (e.inputType === "insertText" || e.inputType === "insertCompositionText") {
      key = event.originalEvent.data;
      keyCode = key.charCodeAt(0);
    } else if (e.inputType === "deleteContentBackward") {
      key = "Backspace";
      keyCode = 8;
    } else if (e.inputType === "insertLineBreak") {
      key = "Enter";
      keyCode = 13;
    } else if (e.inputType === "insertFromPaste") {
      key = "Dummy";
      keyCode = 999;
    } else { // De rest wordt niet ondersteund
      return;
    }

    if (key == "Enter"
        || (startIndex !== undefined && $("#note").val().substring(startIndex - 1, startIndex) != "@") // De '@' is weggehaald
        || (keyCode == 8 && $("#note").prop("selectionStart") == startIndex) // De '@' is weggehaald met een backspace
        || $("#note").prop("selectionStart") < startIndex) // Er is een teken getypt voor de '@'
    {
      stopMention();
      if (key == "@")
        startMention();
      return;
    }
    let stopIndex = $("#note").prop("selectionStart");
    searchStr = $("#note").val().substring(startIndex, stopIndex);
  }
  if (searchStr === "")
    searchStr = "*";

  $("#mention_key_show")[0].value = searchStr;

  let sgEvent = $.Event("keydown");
  sgEvent.keyCode = keyCode;
  $("#mention_key_show").trigger(sgEvent);
}

function mentionCallback(sgKey, sgShow, sgFld)
{
  var startIndex = $("#note").data("start-index") || 0;
  if (sgKey == -1 || startIndex == -1)
    return false;
  var note = $("#note").val();
  var stopIndex = $("#note").prop("selectionStart");
  var newCaretIndex = String(note.substr(0, startIndex - 1) + "[mention]" + sgKey + "|" + sgShow + "[/mention]").length;
  stopMention();
  note = note.substr(0, startIndex - 1)
       + "[mention]" + sgKey + "|" + sgShow + "[/mention]"
       + note.substr(stopIndex);
  window.setTimeout(function () {
    $("#note").val(note);
    $("#note")[0].selectionStart = newCaretIndex;
    $("#note")[0].selectionEnd = newCaretIndex;
    $("#note")[0].focus();
  }, 0); // Anders komt dit nog voor de #note-blur omdat je op de autocompletediv klikt
}

function detailToggleClickHandler(doAnimation)
{
  var ANIMATION_DURATION = 100;

  var toggle_subject = $(this).attr("id").replace("-toggle-button", "");
  var toggle_selectors = { "notes": ".note-container:not(.note-type-tracking, .note-fe-hidden)",
                        "tracking": ".note-type-tracking",
                        "fehidden": ".note-fe-hidden" };

  var $noteDiv = $(".notes-wrapper");
  doAnimation = typeof doAnimation === "undefined" ? true : doAnimation; // default true

  // 1 Animation at a time
  if (doAnimation && toggle_subject in toggle_selectors && $noteDiv.children(":has(" + toggle_selectors[toggle_subject] + ")").is(":animated"))
      return;

  var animatie_tijd = (doAnimation ? ANIMATION_DURATION : 0);
  $(this).toggleClass("selected").blur();

  /* Deze functie is bedoeld om naast de 'selector' notes ook de overbodige datum wrappers te togglen */
  function _toggleThese(selector) { // Werkt alleen voor selectors op de note-container
      var $filtered_notes = $noteDiv.find(selector).parent(".note-wrapper");
      if (!$filtered_notes.length)
          return;

      var currentlyVisible = $filtered_notes.is(":visible"); // allen of 1 maakt niet echt uit
      var $toggle_these = $([]); // Lege start-set

      var $dates = $noteDiv.children(".note-date-wrapper");
      var $temp;
      $dates.each(function(i, elem) {

          $temp = $([]); // Empty set
          $elem = $(elem);
          if (i < $dates.length - 1)
              $temp = $elem.nextUntil($dates.eq(i+1)); /* Verzamel alle notes tussen datum i en i+1 */
          else // of alles na de laatste datum
          {
              $temp = $elem.nextUntil($noteDiv.children(".note-wrapper").last());
              $temp = $temp.add($noteDiv.children(".note-wrapper").last()); /* inclusief de laatste */
          }
          // $temp is hier een jQuery collectie van alle divjes die tussen datum i en datum i+1 zitten
          // if:
          // Ik ben nu zichtbaar && mijn datum ook && ik heb geen notities van een ander type dan die ik toggle die zichtbaar zijn.
          // of; ik ben nu niet zichtbaar && mijn datum ook niet && ik heb wel notities die ik aan toggle
          if ((currentlyVisible && $elem.is(":visible") && !$temp.not(":has("+selector+")").is(":visible")) || // mijn typ
              (!currentlyVisible && !$elem.is(":visible") && $temp.has(selector).length)) // Alles in de $temp zijn notes die voldoen aan 'selector'
          {
              $toggle_these = $toggle_these.add($elem); // Dan kan de datum ook togglen
          }
          $toggle_these = $toggle_these.add($temp.has(selector));

      });
      $toggle_these.animate({ height: "toggle" }, animatie_tijd);
  }

  var selected = $(this).hasClass("selected"); /* if selected => show */
  var note_filter = selected ? "S" : "s";
  var nf_arr = (window.localStorage.getItem("notitiefilter") || "").split(",");

  switch (toggle_subject)
  {
    case "notes":
            _toggleThese(toggle_selectors["notes"]);
            nf_arr[0] = note_filter;
            break;
    case "tracking":
            _toggleThese(toggle_selectors["tracking"]);
            nf_arr[1] = note_filter;
            break;
    case "more":
            if (!doAnimation) /* Remove transition if !doAnimation */
                $noteDiv.find(".note-text").addClass("notransition");
            if (selected)
                $noteDiv.find(".note-collapsed, .note_autocollapse").next(".note-toggler").trigger("click");
            else
                $noteDiv.find(".note-text").not(".note-collapsed, .note_autocollapse").next(".note-toggler").trigger("click");
            if (!doAnimation)
                $(".notransition").each(function () { $(this).get(0).offsetHeight; /* Trigger a reflow, flushing the CSS changes */
                                                      $(this).removeClass("notransition"); });
            nf_arr[2] = note_filter;
            break;
    case "fehidden":
            _toggleThese(toggle_selectors["fehidden"]);
            nf_arr[3] = note_filter;
            break;
  }
  window.localStorage.setItem("notitiefilter", nf_arr.join(","));

  setTimeout(function() {
      FcltMgr.resized();
  }, animatie_tijd+25);

}

async function note_submit(formid)
{
  if ($("#note").prop("disabled") || $("#note").val().trim() == "")
    return false;

  validateTextarea(false);

  if (iface.uploads.length) {
    await Promise.all(iface.uploads);
  }

  var $form = formid
              ? $("form#" + formid)
              : $("form[name=u2]");
  var url = $form[0].action;

  // Als ik naar de opdracht toe moet, submit dan naar opdr_edit_note_save.asp
  if ($("#module").val() === "mld") { // Dat hoeft alleen aangepast te worden als we bij een melding zitten
    if ($("[data-toggle-subject-role='4'] [data-toggle-type='8'].on").length === 1) { // Er is een uitvoerder aangevinkt
      url = "opdr_edit_note_save.asp"
          + "?opdr_key=" + $("[data-toggle-subject-role='4']").has("[data-toggle-type='8'].on").data("opdr-key")
          + "&note_key=" + $("#note_key").val();
    } else if ($(".reply-wrapper[data-module='opdr']").length === 1) { // Er is gereplied op een opdracht-notitie (bij de melding dus)
      url = "opdr_edit_note_save.asp"
          + "?opdr_key=" + $(".reply-wrapper[data-module='opdr']").data("module_key")
          + "&note_key=" + $("#note_key").val();
    }
  }

  $.post(url,
         $form.serialize(),
         FcltCallbackAndThen(note_submit_cb),
         "json");
}

function note_submit_cb(json) {
  draft_note(window.module, window.module_key, null); // Verwijder de draft
  note_submit_callback(json);
}

function cancel_note_edit() {
  $("#note").prop("disabled", true); /* Om te voorkomen dat een nieuwe keyup het scherm weer in edit mode zet */
  note_submit_callback({});
}

function doPrint(pkey, pmodule, urole)
{
  var nf_arr = (window.localStorage.getItem("notitiefilter") || "").split(",");
  var tracking = (nf_arr[1] == "S" ? 1 : 0);

  if (!$("#tracking-toggle-button").length || $("#tracking-toggle-button:not(.selected)").length) // Geen tracking-toggle, of hij staat uit
    tracking = 0;

  FcltMgr.windowopen("./" + pmodule.toLowerCase() + "_show_note.asp?" + pmodule.toLowerCase() + "_key=" + pkey + "&outputmode=1" + (urole? "&urole=" + urole : "") + "&tracking=" + tracking);
}

function Upload(purl)
{
    var params = {callback: UploadCallback};
    FcltMgr.openModalDetail(purl, L("lcl_appendixes"), params );
}
function UploadCallback()
{
    var params = {};
    if ($("#note").val() != "")
        params.appendurl = "tmp_note=" + encodeURIComponent($("#note").val()) + "&parent_reload=1";
    FcltMgr.reload(params);
}

function persoonDetails(evt, perslid_key)
{
  FcltMgr.stopPropagation(evt);
  FcltMgr.openDetail("appl/fac/fac_user.asp?prs_key=" + perslid_key);
}

function notechange(purl)
{
  if (FcltMgr.mayEdit(window))
  {
    window.location.href = purl;
  }
}

function removeReply()
{
  FcltMgr.stopPropagation();
  $(".note-textarea .reply-wrapper").remove();
  $(".note-option-group").find("[data-toggle-type], .name").removeClass("disabled");
  $("#parent_key").val(-1);
  $("textarea#note").blur().focus().trigger("keyup");
}

function _disableToggles(flag) {
  for (let i = 1; i <= 4; i = i << 1) { // Itereert over de rollen (1, 2 & 4)
    if (!(flag & i) && i !== 2) { // Ben ik zichtbaar voor deze partij? (FOBO ziet altijd alles)
      let $wrapper = $(".note-option-group").filter("[data-toggle-subject-role=" + i + "]");
      let $toggles = $wrapper.find("[data-toggle-type], .name") // Alle types, dus Zichtbaarheid, Notificeren (+ kindermeldingen) & Actie
                             .filter((S_mld_note_hidden_action2FE === 1 ? ":not([data-toggle-type=8])" : "*")); // Dan mag deze nog wel
      $toggles.filter(".on").trigger("click"); // Uitzetten (functioneel)
      $toggles.addClass("disabled"); // Uitzetten (visueel)
    }
  }
}

function noteReply(note_key, module_key, type)
{
  type = type.toLowerCase();

  // Oude opschonen
  removeReply();

  // Vink ook de 'actie bij uitvoerder' van de juiste uitvoerder aan
  if ($("#module").val() == "mld" && type === "opdr") {
    $("[data-toggle-subject-role='4']").filter("[data-opdr-key='" + module_key + "']").find("[data-toggle-type='8'].off").trigger("click", true);
  }

  if (note_key > 0) // Ik reply op een specifieke notitie
  {
    var infix = type == "mld" ? 1 : (type == "opdr" ? 2 : "");
    var $thisNote = $("#note-" + infix + note_key);

    /* Disabled de toggles voor elke geadresseerde waarvoor de note waarop word ge-replied onzichtbaar is */
    _disableToggles($thisNote.find(".note-container").data("flag"));

    $("#parent_key").val(note_key);

    if (!$(".note-textarea > .reply-wrapper").length) {
      var $reply = $("<div class='reply-wrapper'>\
                        <div class='reply-container'>\
                          <div class='reply-header'></div>\
                          <span class='reply-body'></span>\
                        </div>\
                      </div>");
      $("textarea#note").before($reply);
    }
    $(".note-textarea > .reply-wrapper").attr("data-module", type)
                                        .attr("data-module_key", module_key);
    var $close_icon = $("<span class='default-clickable-icon' onClick='removeReply()'>" + I("fa-times", { fastyle: "fal" }) + "</span>");
    var authorNode = $thisNote.find(".note-author")[0].cloneNode(true);
    if ($thisNote.hasClass("note-type-self"))
        authorNode.innerText = L("lcl_You");
    $(".note-textarea div.reply-header").empty().append(authorNode).append($close_icon);

    var org_note = $thisNote.find(".note-body").find(".note-text").text();

    $(".note-textarea .reply-body").html(safe.html(org_note));
  }

  $("textarea#note").blur().focus().trigger("keyup");
}

function noteToggleHandler(e, firstClick) {
    const SUBJECT_ROLE = {
      0: "EXT",
      1: "FE",
      2: "BO",
      4: "UITV"
    };
    FcltMgr.stopPropagation(e);
    if ($(this).hasClass("disabled")) {
        e.preventDefault(); // Door het [for]-attribuut wordt anders alsnog de checkbox getoggled
        return;
    }
    var $wrapper = $(this).closest(".note-option-group"); // De toggles horende bij de persoon waarvoor getoggled wordt
    $(this).toggleClass("on off");
    var subject_role = $wrapper.attr("data-toggle-subject-role");
    var noteToggleSubject = SUBJECT_ROLE[subject_role];

    var newState = $(this).hasClass("on") ? "on" : "off";
    var anySelected = $(this).siblings().addBack().filter(".on:not(.hidden)").length > 0;
    var type = parseInt($(this).attr("data-toggle-type"));

    if (noteToggleSubject == "FE" && type == 8 && e.originalEvent && anySelected && S_mld_note_hidden_action2FE == 1) {
        // In deze uitzondering hoeven we het oogje niet mee te vinken
    } else if (noteToggleSubject != "BO" && (e.originalEvent || firstClick) && anySelected) { // *iets* aangevinkt? Dan ook zichtbaar
        $(this).siblings("[data-toggle-type='1'].off").trigger("click");
    } else if (noteToggleSubject != "BO" && !anySelected) {
        $(this).siblings("[data-toggle-type='1'].on.hidden").trigger("click"); // *alles* uitgevinkt? Dan ook onzichtbaar
    }

    var visible = type == 1 ? newState : $wrapper.find("[data-toggle-type=1].on").length === 1;
    $wrapper.toggleClass("anySelected", visible);

    switch (type) {
        case 1: /* Zichtbaarheid */
            if (newState === "off") { // Als ik zichtbaarheid uitschakel ..
                $(this).nextAll("[data-toggle-type][data-toggle-type!=8].on").trigger("click"); // .. schakel dan ook de notificaties uit (alles behalve actie)
                if (S_mld_note_hidden_action2FE == 0) {
                    $wrapper.find("[data-toggle-type=8].on").trigger("click"); // .. schakel dan ook het actie vinkje uit
                }

                // Schakel "externe notificeren" ook uit
                $("[data-toggle-subject-role='0']").find("[data-toggle-type='2'].on").trigger("click");
            }
            break;
        case 2: /* Notificeren */
            if (newState === "on" && noteToggleSubject == "EXT") { // Externe melder notificeren? -> dan ook zichtbaarFE aan
                var $wrapperFE = $("[data-toggle-subject-role='1']");
                $wrapperFE.find("[data-toggle-type='1'].off").trigger("click");
            }
            if (newState === "off") { // Als ik 'notificeren' uitschakel ..
                if (noteToggleSubject == "FE" && S_mld_note_hidden_action2FE == 1) {
                    /* Uitzondering; je mag zonder zichtbaarheid/notificatie toch de actie zetten */
                } else {
                    $wrapper.find("[data-toggle-type='8'].on").trigger("click"); // .. dan ook de 'actie bij' uitvinken
                }
            }
            break;
        case 8: /* Actie ! */
            if (newState === "on") { // Als ik de actie zet ..
                if (noteToggleSubject == "FE" && S_mld_note_hidden_action2FE == 1 && $wrapper.find("[data-toggle-type='1']")?.hasClass("off")) {
                    /* Uitzondering; je mag zonder zichtbaarheid/notificatie toch de actie zetten */
                } else {
                    $wrapper.find("[data-toggle-type='2'], [data-toggle-type='4']").filter(".off").trigger("click"); // .. dan ook "melder notificeren" & "melders kindermeldingen notificeren" aanzetten
                }
            }

            // Deze is type radio (max 1 actief), dus schakel anderen (BO uitgezonderd) uit
            if (noteToggleSubject == "UITV" && newState === "on") {
                $wrapper.siblings(":not([data-toggle-subject-role='2'])").find("[data-toggle-type='8'].on").trigger("click");
            }

            if ($("#module").val() == "mld" && noteToggleSubject == "UITV")
            {   // Hier de toggle die de reactie op een opdr geeft
                if (newState == "on" && e.originalEvent) {
                  noteReply(0, $wrapper.attr("data-opdr-key"), "OPDR");
                } else {
                  removeReply();
                }
            }
            break;
    }
}

$(function()
{
  /* Notitie-optie toggles */
  $(".note-option-group").on("click", function (e)
  {
      FcltMgr.stopPropagation(e);

      // Is het niet 1 van deze? Dan is er een specifiek icoontje geklikt en hoeven we hier niets te doen
      if (e.target === e.currentTarget || $(e.target).is("span.name"))
      {   // Click het 'zichtbaarheid'-icoon aan als die zichtbaar & enabled is
          $(this).find("[data-toggle-type=1]:not(.hidden, .disabled)").trigger("click", true);
      }
  });

  /* (Individuele) notitie-optie toggles */
  $("[data-toggle-type]").on("click", noteToggleHandler);

  /* Klik op de filenaam om de bb-code in te voegen, of op het kruisje om de bijlage te verwijderen */
  $(".edit-note .note-attachments").on("click", (e) => {
    if ($(e.target).hasClass("note-attachment-image")) {
      iface._insert_bb_code("note", "img", e.target.innerText);
    } else if ($(e.target).hasClass("note-attachment-delete")) {
      let fileName = $(e.target).prev(".note-attachment-name").text();
      let url = e.target.getAttribute("data-delete-url");
      FcltMgr.confirm(
        L("lcl_delete") + " " + fileName + "?",
        function() {
          let data = {};
          protectRequest.dataToken(data);
          $.post(
            url,
            data,
            FcltCallbackAndThen(function () {
              let note = $("#note").val();
              $("#note").val(note.split("[img]" + fileName + "[/img]").join(""));
              $(e.target).parent(".note-attachment").remove();
              $("#note").trigger("keyup");
              validateTextarea();
            })
          );
        }
      );
    }
  });
});