<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$

     File:          mld_close_confirm.asp
     Description:   Afmelden van een melding. maar dan met een bevestiging
     Parameters:    mld_key    Meldingnummer array (keys)
     Context:       A Rechtstreeks vanuit overzicht meldingen
                    B Rechtstreeks vanuit showmode melding
                    C Vanuit mld_show_melding als soort 'directklaar'
                    D Na afsluiten van laatste opdracht en eventueel 'autoclose' melding
                    Bij A en B ook eventueel checkbox of alle opdrachten ook dicht moeten

*/
var mld_key_arr = getQParamIntArray("mld_key");
if (mld_key_arr.length)
    var LOCKED_USER_OK = { "xmlnode": "melding", "key": mld_key_arr[0] };

%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/disciplineselector.inc" -->
<!-- #include file="../Shared/persoonselector.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../ins/ins.inc" -->
<!-- #include file="mld_flexkenmerk.inc" -->
<!-- #include file="mld.inc" -->
<%

FCLTHeader.Requires({ plugins: ["suggest", "jQuery", "kenmerk"] });

// LET OP: Het eerste stuk komt (nog) letterlijk ook zo terug bij mld_close_save.asp
var verynew = getQParamInt("verynew", 0) == 1;
var lastopdr = (getQParamInt("lastopdr", 0) == 1)
var transitParam = buildTransitParam(["mld_key", "verynew", "lastopdr"]);

var has_opdr_opm = getQParamInt("has_opdr_opm", 0) == 1;

var result = {};
var tobeclosed = 0;
var firstCloseOrders = 0;
var ingesloten = [];
var canCloseOpdr = [];
var mldRequireCnt = 0; // Aantal meldingen waarvan minstens één verplicht kenmerk en/of object niet is ingevuld.
var reqStatusEmptyMelding = [];
var reqStatusEmptyMelding_key = -1;
var reqStatusEmptyMeldingnr = "";
var futureOpdr = false;
var object_ontbreekt = false;
var allBlocksCompleted = true;
// Bepaal de meldingen in de selectie die
// ook echt afgemeld kunnen of mogen worden.

for (var i = 0; i < mld_key_arr.length; i++)
{
  var this_mld = mld.func_enabled_melding(mld_key_arr[i], { verynew: verynew });
  if (this_mld.canClose || this_mld.canCloseWithOrder) // Afmelden meldingen zonder en met zijn verplichte opdracht(en) afmelden.
  {
    // Zijn er nog kenmerken die nu wel verplicht zijn of een object?
    var afwezig = mld.hasRequiredStatusEmptyMelding(mld_key_arr[i], 5); // Melding status "Afgemeld(5)"
    if (afwezig.kenm_ontbreekt.length || afwezig.obj_ontbreekt)
    {
      mldRequireCnt++;
      var mldnr = mld.mld_prefix(mld_key_arr[i]) + mld_key_arr[i];
      if (afwezig.kenm_ontbreekt.length)
        reqStatusEmptyMelding.push(L("lcl_mld_req_status_empty").format(afwezig.kenm_ontbreekt.join(", "), mldnr) );
      if (afwezig.obj_ontbreekt)
      {
        reqStatusEmptyMelding.push(L("lcl_mld_req_obj").format(mldnr) );
        object_ontbreekt = true;
      }
      reqStatusEmptyMelding_key = mld_key_arr[i];
      reqStatusEmptyMeldingnr = mldnr;
    }

    // Zijn alle behandelbare blokken afgemeld?
    var sqlb = "SELECT COUNT(mld_kenmerkblokmelding_key) nrBlocks"
             + "     , COUNT(mld_kenmerkblokmelding_afmelddatum) nrClosed"
             + "  FROM mld_kenmerkblokmelding"
             + " WHERE mld_melding_key = " + mld_key_arr[i];
    var oRsb = Oracle.Execute(sqlb);
    if (oRsb("nrBlocks").Value > 0 && oRsb("nrBlocks").Value > oRsb("nrClosed").Value)
      allBlocksCompleted = false;
    oRsb.Close();

    // Zijn er nog lopende opdrachten?
    var canCloseOpdrOfMld = [];
    var sql = "SELECT o.mld_opdr_key"
            + "  FROM mld_opdr o"
            + " WHERE o.mld_melding_key IN (" + mld_key_arr[i] + ")"
            + "   AND o.mld_statusopdr_key NOT IN (1, 6, 7, 9)"
    var oRsOM = Oracle.Execute(sql);
    var closeAllOrders = true;
    futureOpdr = false;
    while (!oRsOM.eof)
    { // Voor elke opdracht van een melding controleren of deze afgemeld mag worden
      var this_opdr = mld.func_enabled_opdracht(oRsOM("mld_opdr_key").Value);
      var mld_opdr = this_opdr.mld_opdr;
      sql = "SELECT mld_opdr_einddatum"
          + " FROM mld_opdr o"
          + " WHERE o.mld_opdr_key = " + oRsOM("mld_opdr_key").Value;
      var oRs = Oracle.Execute(sql);

      var mld_opdr_einddatum = oRs("mld_opdr_einddatum").Value;
      var kosten_verplicht_afm = mld_opdr.tonen_totaal && (mld_opdr.typeopdr_kosten_verplicht & 2 || (mld_opdr.typeopdr_kosten_verplicht == 0 && mld_opdr.opdrkosten_verplicht & 2));
      var opdr_kosten = mld_opdr.t_cost;

      // Als Setting S("mld_ord_afmeld_future") niet is gezet (0): Opdrachten waarvan de einddatum in de toekomst ligt mogen niet worden afgemeld.
      if (!this_opdr.canClose || (S("mld_ord_afmeld_future") != 1 && (mld_opdr_einddatum && mld_opdr_einddatum > new Date())) || (kosten_verplicht_afm && opdr_kosten == 0))
      { // Geen autorisatie om alle opdrachten van een melding af te melden of opdrachten in de toekomst met setting S("mld_ord_afmeld_future") niet gezet-->dan geen enkele van die melding
        closeAllOrders = false;
        if (S("mld_ord_afmeld_future") != 1 && (mld_opdr_einddatum && mld_opdr_einddatum > new Date()))
          futureOpdr = true; // Indien opdrachten in de toekomst en setting S("mld_ord_afmeld_future") niet gezet (0) dan mag je de melding niet afmelden
      }
      oRs.Close();
      canCloseOpdrOfMld.push(oRsOM("mld_opdr_key").Value);
      oRsOM.MoveNext();
    }
    oRsOM.Close();
    // Geen autorisatie om alle opdrachten van een melding af te melden of opdrachten in de toekomst met setting S("mld_ord_afmeld_future") niet gezet (0)
    // --> dan geen enkele van die melding
    if (closeAllOrders)
    {
      for (var j = 0; j < canCloseOpdrOfMld.length; j++)
      {
        canCloseOpdr.push(canCloseOpdrOfMld[j]);
      }
    }

    if (!futureOpdr)
    { // Indien opdrachten in de toekomst en setting S("mld_ord_afmeld_future") niet gezet (0) dan mag je de melding niet afmelden
      ingesloten.push(mld_key_arr[i]);
      tobeclosed++;

      if (this_mld.canCloseWithOrder) // Meldingen waarvan eerst de opdrachten afgemeld dienen te worden.
        firstCloseOrders++;
    }
  }
}

// Als er meerder meldingen zijn waarvan een verplicht kenmerk niet is ingevuld, dan abort en melding.
// Als er meerdere meldingen zijn en een verplicht kenmerk is niet ingevuld, dan wordt er verderop alleen een melding met twee buttons getoond.
// abort with required status message only with multi-action. 1 call can continue with required status message.
user.anything_todo_or_abort(!(reqStatusEmptyMelding.length && tobeclosed > 1) && !object_ontbreekt, reqStatusEmptyMelding.join("<br />"));
user.auth_required_or_abort(!(mld_key_arr.length == 1 && futureOpdr), L("lcl_mld_einddatum_to_late_mld")); // Bij enkele melding met toekomstige opdrachten een aparte melding geven
user.anything_todo_or_abort(tobeclosed > 0); // We klagen niet over enkele wel en enkele niet

var canCloseCtr = [];
var srtContKeyArray = [];
var controleModeArray = [-1, -1, -1]; // De drie controlemoden zijn niet aanwezig (-1);
var thirdpartypresent = false;
for (var i = 0; i < ingesloten.length; i++)
{
  var mld_melding = mld.mld_melding_info(ingesloten[i]);
  // determine whether there is a third party to notify in one of the calls
  thirdpartypresent = thirdpartypresent || (mld_melding.canholdthirdparty && mld_melding.email_ext);

  if (i == 0) lcl.set_dialect(mld_melding.srtdisc_key, "MLD_SRTDISCIPLINE_KEY"); // Neem voor informatie de eerste melding.

  var sql = "SELECT dsc.ins_deel_key"
          + "     , dsc.ins_srtcontrole_key"
          + "     , cdp.ctr_disc_params_controle_type"
          + "     , dsc.ins_deelsrtcontrole_freezedate"
          + "     , mo.ins_deelsrtcontrole_key"
          + "  FROM ins_deelsrtcontrole dsc"
          + "     , ins_srtcontrole isc"
          + "     , ctr_disc_params cdp"
          + "     , mld_melding_object mo"
          + " WHERE dsc.ins_srtcontrole_key = isc.ins_srtcontrole_key"
          + "   AND isc.ctr_discipline_key = cdp.ctr_ins_discipline_key"
          + "   AND mo.ins_deelsrtcontrole_key = dsc.ins_deelsrtcontrole_key"
          + "   AND dsc.ins_deelsrtcontrole_status = 3"
          + "   AND mo.mld_melding_key = " + ingesloten[i]
          // Bij periodieke taken is de eerste melding de automatisch aangemaakte melding als de status van de taak "Ter uitvoering(3)" is.
          + "   AND ((NOT EXISTS (SELECT mo2.mld_melding_key"
          + "                       FROM mld_melding_object mo2"
          + "                      WHERE mo2.ins_deelsrtcontrole_key = mo.ins_deelsrtcontrole_key"
          + "                        AND mo2.mld_melding_key < mo.mld_melding_key) AND cdp.ctr_disc_params_ismjob = 0)"
          + "     OR (cdp.ctr_disc_params_ismjob = 1))";
  var oRs = Oracle.Execute(sql);
  while (!oRs.eof)
  {
    // De controle moet aanwezig zijn. Maar een inspectie kan ook verwijderd zijn!
    var this_ins = ins.func_enabled_deel(oRs("ins_deel_key").Value,
                                         {srtcont_key: oRs("ins_srtcontrole_key").Value,
                                          deelsrtcont_key: oRs("ins_deelsrtcontrole_key").Value,
                                          scen_key: 1
                                         });
    if (this_ins.canInspFinishMjb || this_ins.canInspFinish)
    {
        canCloseCtr.push({ ins_key: oRs("ins_deel_key").Value,
                           srtcont_key: oRs("ins_srtcontrole_key").Value,
                           deelsrtcont_key: oRs("ins_deelsrtcontrole_key").Value,
                           controlemode: oRs("ctr_disc_params_controle_type").Value,
                           freezedateyear: this_ins.canInspFinishMjb? new Date(oRs("ins_deelsrtcontrole_freezedate").Value).getFullYear() : null
                         });
        srtContKeyArray.push(oRs("ins_srtcontrole_key").Value);
        controleModeArray[oRs("ctr_disc_params_controle_type").Value - 1] = oRs("ctr_disc_params_controle_type").Value; // Controlemode 2 op de 2de plek van de Array invullen [-1, 2, -1].
    }
    oRs.MoveNext();
  }
  oRs.Close();
}

var prefix = "";
var oldRemark = "";
var req = false;
var stdmld_arr = [];
var disc_arr = [];
var canNoti = false;

sql = "SELECT ''"
    + "  FROM fac_srtnotificatie"
    + " WHERE fac_srtnotificatie_code = 'MLDAFM' AND fac_srtnotificatie_mode > 0";
oRs = Oracle.Execute(sql);
var canSrtNoti = !oRs.eof;
oRs.Close();

sql = "SELECT DISTINCT mld_stdmelding_afmeldtext"
    + "     , mld_melding_opmerking"
    + "     , ins_srtdiscipline_prefix"
    + "     , std.mld_stdmelding_key"
    + "     , std.mld_stdmelding_notify"
    + "     , md.ins_discipline_key"
    + "     , mdp.mld_disc_params_notify"
    + "  FROM mld_melding mm"
    + "     , mld_stdmelding std"
    + "     , mld_discipline md"
    + "     , mld_disc_params mdp"
    + "     , ins_srtdiscipline sd"
    + " WHERE mld_melding_key IN (" + ingesloten.join(",") + ")"
    + "   AND mm.mld_stdmelding_key = std.mld_stdmelding_key"
    + "   AND std.mld_ins_discipline_key = md.ins_discipline_key"
    + "   AND md.ins_discipline_key = mdp.mld_ins_discipline_key"
    + "   AND md.ins_srtdiscipline_key = sd.ins_srtdiscipline_key";
oRs = Oracle.Execute(sql);
while (!oRs.eof)
{
  prefix = oRs("ins_srtdiscipline_prefix").Value || "";
  oldRemark = oRs("mld_melding_opmerking").Value;
  req = req || ((S("mld_afhandeling_required_for_close") || oRs("mld_stdmelding_afmeldtext").value == 2) && (oldRemark == null));
  stdmld_arr[stdmld_arr.length] = oRs("mld_stdmelding_key").Value;
  disc_arr[disc_arr.length] = oRs("ins_discipline_key").Value;
  if (canSrtNoti && !canNoti)
  {
      canNoti = oRs("mld_disc_params_notify").Value == 1 ||
                (oRs("mld_disc_params_notify").Value == 2 && oRs("mld_stdmelding_notify").Value == 1);
  }
  oRs.MoveNext();
}
oRs.Close();

var generate_ai = ingesloten.length == 1 && (S("ai_enabled") & 4);
if (generate_ai) {
  sql = "SELECT COUNT(*) aantal_notities"
      + "  FROM mld_melding_note mn"
      + "     , prs_v_perslid_fullnames_all p"
      + " WHERE mn.prs_perslid_key = p.prs_perslid_key" // Geen outer-join want we willen hier geen tracking
      + "   AND mld_melding_key = " + ingesloten[0];
  oRs = Oracle.Execute(sql);
  generate_ai = oRs("aantal_notities").Value > 0;
  oRs.Close();
}

var sql_from_t = "  FROM mld_afmeldtekst"
                + " WHERE ((mld_stdmelding_key IN (" + stdmld_arr.join(",") + ") )"
                + "    OR (mld_stdmelding_key IS NULL AND mld_ins_discipline_key IN (" + disc_arr.join(",") + ") )"
                + "    OR (mld_stdmelding_key IS NULL AND mld_ins_discipline_key IS NULL))"
                + "   AND BITAND(mld_afmeldtekst_usefor, 1) = 1";

var sql_from_o = "  FROM mld_opdr mo"
                + " WHERE mo.mld_melding_key = " + ingesloten[0]
                + "   AND mo.mld_statusopdr_key in (6, 7, 9)" // status=afgemeld, verwerkt en afgerond
                + "   AND mo.mld_opdr_opmerking IS NOT NULL";

var sql = "SELECT SUM(aantal) aantal"
        + "  FROM ( SELECT COUNT(*) aantal" + sql_from_t
                + (ingesloten.length == 1
                  ? " UNION SELECT COUNT(*)" + sql_from_o
                  : ""
                  )
                + ")";
oRs = Oracle.Execute(sql);
var aantal_teksten = oRs("aantal").Value + (generate_ai ? 1 : 0);
var view = aantal_teksten < S("mld_afmeldtekst_compact_threshold") ? "normal" : "select";
oRs.Close();

// De -1 waarden in de controlemode Array verwijderen
for (var i = 2; i >= 0; i--)
{
  if (controleModeArray[i] == -1) controleModeArray.splice(i, 1);
}
%>
<html>
  <head>
<%  FCLTHeader.Generate(); %>
    <script type="text/javascript">

      /* global */ var loadingAI;
      function mld_opmpaste()
      {
          var params = FcltMgr.dialogArguments()||{};
          $("#opmerk").val($("#opmerk").val() + params.opdr_opm);
          $("#opmpaste").css("visibility", "hidden"); // icon na invoegen opmerking onzichtbaar maken zodat geen tweede keer toegevoegd kan worden.
      }

      function mld_cancel()
      {
          FcltMgr.closeDetail(window, { cancel: true });
      }

      function mld_close_callback(json, textStatus)
      {
        if (json.success)
        {
          if ($("#ctr_close").is(":checked"))
          {
<%          for (var i = 0; i < canCloseCtr.length; i++)
            {
              if (this_ins.canInspFinishMjb)
              { %>
                var maxFreezeDate = new Date(<%=canCloseCtr[i].freezedateyear%>, 11, 31, 23, 59, 59, 999); // 31 December of freezedate year at midnight.
                var deelsrtcontrole_datum = (new Date()).getTime() > maxFreezeDate.getTime()? maxFreezeDate.getTime() : (new Date()).getTime();
<%            }
              else // this_ins.canInspFinish
              { %>
                var deelsrtcontrole_datum = (new Date()).getTime();
<%            } %>
              var data = { savemode: 'C',
                           ins_keys: <%=canCloseCtr[i].ins_key%>,
                           srtcont_key_arr: <%=canCloseCtr[i].srtcont_key%>,
                           //deelsrtcont_key wordt niet gebruikt door ins_inspect_save.asp
                           finish: 1,
                           deelsrtcontrole_datum: deelsrtcontrole_datum,
                           sel_controlemode: $("#sel_controlemode" + <%=canCloseCtr[i].controlemode%>).val()
                         };
              protectRequest.dataToken(data);

              $.ajax({ type: "POST",
                       url: "../ins/ins_inspect_save.asp",
                       data: data,
                       datatype: "json",
                       async: false
                     });
<%          } %>
          }
          FcltCallbackClose(json);
        }
        else
          FcltCallbackClose(json);
      }

      async function mld_close(close)
      {
        if (loadingAI && loadingAI.readyState !== 4) {
          loadingAI.abort(); // Breek AI request af zodat we ongestoord kunnen submitten
        }

        if (!await validateForm("u2"))
          return false;

        // Als voor alle meldingen geldt dat alle opdrachten eerst afgemeld moeten worden,
        // en het vinkje "x openstaande opdracht(en) ook afmelden?" is niet gezet, dan een melding geven.
        if (<%=tobeclosed%> == <%=firstCloseOrders%> && !$("#opdr_close").is(":checked"))
        {
          FcltMgr.alert(L("lcl_mldclose_after_opdrclose"));
          return false;
        }

        $.post($("form[name=closeform]")[0].action, $("[name=closeform]").serialize(), mld_close_callback, "json");
        return true; // disable button
      }

      function mld_edit()
      {
        FcltMgr.closeDetail(window, { cancel: false, succes: false, key: <%=reqStatusEmptyMelding_key%>, mldnr: "<%=safe.jsstring(reqStatusEmptyMeldingnr)%>", edit: true });
      }
<%    if (view == "select") { /* Anders is er geen <select> */ %>
      function PasteFromSelectbox()
      {
        if ($("#stdopmerk :selected").length && $("#stdopmerk :selected").val() != -1)
        {
          $("#opmerk").focus();
          var PastedText = $("#stdopmerk :selected")[0].getAttribute("afmeldtekst");
          $("#opmerk").val($("#opmerk").val() + ($("#opmerk").val() != ""? "\n" : "") + PastedText);
        }
      }
<%    } %>
      function ctrcloseToggler(deze)
      {
        var ctrclose = $(deze).prop('checked');
        if (ctrclose)
        {
<%        for (var i = 0; i < controleModeArray.length; i++)
          { %>
            $("#sel_controlemode" + <%=controleModeArray[i]%>).addClass("required");
<%        } %>
          $("#inscontrolemode").show();
          FcltMgr.resized(window);
        }
        else
        {
          $("#inscontrolemode").hide();
<%        for (var i = 0; i < controleModeArray.length; i++)
          { %>
            $("#sel_controlemode" + <%=controleModeArray[i]%>).removeClass("required");
<%        } %>
        }
      }

<%    if (generate_ai) {
        var url_get_mld_info_ajax = "../mld/get_mld_info_ajax.asp?req_info=promptAI&mld_key=" + ingesloten[0];
%>
      function getAI() {
        var protected_mld_info_ajax = "<%=safe.jsstring(protectQS.create(url_get_mld_info_ajax))%>";
        var data = {
          //mld_key: <%=ingesloten[0]%>, // deze zit al in protected_mld_info_ajax
          for: "afmelden"
        };
        protectRequest.dataToken(data);
        var request = $.ajax(protected_mld_info_ajax, {
          method: "POST",
          noSpinner: true,
          data: data
        });
        request.then(json => {
          if (json.success) {
<%      if (view == "select") { %>
            $("#stdopmerk option:disabled")
              .removeAttr("disabled")
              .attr("afmeldtekst", json.content)
              .val(-2);
<%      } else { %>
            var $ai_body = $(".afmeld-teksten > .card > .body > i").parent(".body");
            if ($ai_body.length) {
              $.when($ai_body.text(json.content)).then(_ => {
                $ai_body.data("afmeldtext", json.content);
                FcltMgr.resized();
              });
            }
<%      } %>
          }
        });
        return request;
      }
<%    } %>

      $(function()
      {
        $("#opmerk").focus();
<%    if (view == "normal") { %>
        if ($(".afmeld-teksten").length) {
          $(".afmeld-teksten .card").on("click", function () {
            var afmeldText = $(this).find(".body").data("afmeldtext");
            if (afmeldText) {
              $("#opmerk").val($("#opmerk").val() + ($("#opmerk").val() != ""? "\n" : "") + afmeldText)
                          .get(0).scrollIntoView({ block: "nearest", behavior: "smooth" });
            }
          });
        }
<%    }

      if (has_opdr_opm && S("mld_add_mldopmerk_on_opdrclose") == 1) { %>
        mld_opmpaste();
<%    }
      if (generate_ai) { %>
        loadingAI = getAI();
<%    } else if (S("mld_sel_single_closingtext") == 2 && aantal_teksten == 1) { /* Selecteer de enige aanwezige (niet ai_generated) afmeldtekst direct */
        if (view == "select") { %>
        PasteFromSelectbox();
<%      } else { /* if (view =="normal") { */ %>
        $(".afmeld-teksten .card").eq(0).trigger("click");
<%      }
      } %>
        $("#ctr_close").trigger("change");
      });
    </script>
  </head>

  <body class="fclt-modal" id="mod_mldclose">
<% MODAL_START(); %>
    <form id="closeform" name="closeform" action="mld_close_save.asp?x=x<%=transitParam%>" method="post">
<%
        var txt = "";
        if (lastopdr)
          txt = L("lcl_mld_close_order_close_call") + "<br>";

        // Mag ik kennisbank raadplegen en standaard-antwoorden knippen/plakken
        var authFaq = (S("faq_enabled") == 1) && user.checkAutorisation("WEB_FAQFOF", true);
        var buttons =  [];
        if (authFaq && authFaq.PRSwritelevel < 9) // schrijfrechten op WEB_FAQFOF nodig
        {
          var goegel = "FcltMgr.openDetail('/appl/fac/fac_faq_search.asp?urole=bo&autosearch=1'"
                              + "+'&stdm_str='+'" + stdmld_arr.join(",") + "'"
                              + "+'&disc_key_str='+'" + disc_arr.join(",") + "'"
                              + ", '" + L("lcl_faq_kennisbank") + "') ";
          buttons.push({ icon: "fa-lightbulb", title: L("lcl_faq_kennisbank"), action: goegel, importance: 3});
        }

        MODAL_BLOCK_START("mldClose", txt + L("lcl_mld_finish_close") + (ingesloten.length == 1? " " + prefix + ingesloten[0]: ""),
                          { buttons: buttons, icon: "fa-flag-checkered", ishtmlsafe: true });
          if (!allBlocksCompleted)
          { %>
            <tr>
              <td colspan="2">
                <span class="completeblokalert"><%=I("fa-exclamation-triangle", {fastyle: "fas"})%></span><%= L("lcl_mld_close_treatable_flexblok") %>
              </td>
            </tr>
<%        }
          if (aantal_teksten > 0)
          {
            sql = "SELECT TO_CHAR(mld_afmeldtekst_key) key"
                + "     , " + lcl.xsql('mld_afmeldtekst_naam', 'mld_afmeldtekst_key') + " textname"
                + "     , " + lcl.xsql('mld_afmeldtekst_omschrijving', 'mld_afmeldtekst_key') + " afmeldtekst"
                + "     , 2 src"
                + sql_from_t;
            if (ingesloten.length == 1)
            {
              sql += " UNION "
                   + "SELECT TO_CHAR(mo.mld_opdr_key)"
                   + "     ," + safe.quoted_sql(L("lcl_opdr_closeremark") + " /") +"|| mo.mld_opdr_bedrijfopdr_volgnr"
                   + "     , mo.mld_opdr_opmerking"
                   + "     , 1"
                   + sql_from_o
              if (generate_ai) {
                sql += " UNION "
                     + "SELECT '##DISABLED##'"
                     + "     , " + safe.qL("lcl_mld_ai_generated")
                     + "     , " + safe.quoted_sql(I("fa-spinner-third fa-spin fa-lg")) // Wordt onload gevuld
                     + "     , 3"
                     + "  FROM DUAL";
              }
            }
            sql += " ORDER BY 4,2";

            if (view == "normal") { // Tekst in individuele blokjes
              var afmeldTextHtml = '<div class="afmeld-teksten"><label>' + L("lcl_mld_inf_std_opm") + '</label>';
              oRs = Oracle.Execute(sql);
              while (!oRs.eof) {
                var key = oRs("key").Value;
                var safe_textName = key == "##DISABLED##" ? oRs("textname").Value : safe.html(oRs("textname").Value);
                var safe_afmeldText = key == "##DISABLED##" ? oRs("afmeldtekst").Value : safe.html(oRs("afmeldtekst").Value);
                afmeldTextHtml += '<div class="card">'
                                + '  <div class="header">' + safe_textName + '</div>'
                                + '  <div class="body"' + (key == "##DISABLED##" ? "" : ' data-afmeldtext="' + safe.htmlattr(oRs("afmeldtekst").Value) + '"') + '>' + safe_afmeldText + '</div>'
                                + '</div>';
                oRs.MoveNext();
              }
              oRs.Close();
              afmeldTextHtml += '</div>';
              Response.Write(afmeldTextHtml);
            } else /* if (view == "select") */ { // Tekst in <select>
              FCLTselector("stdopmerk",
                           sql,
                           { label: L("lcl_mld_inf_std_opm"),
                             initKey: -1,
                             emptyOption: (S("mld_sel_single_closingtext")==2 && aantal_teksten==1 && !generate_ai ? null : ""),
                             extraParamValue: "afmeldtekst",
                             onChange: "PasteFromSelectbox()"});
            }
          }

          // tekstveld waarin informatie over de afhandeling vermeld kan worden
          if (ingesloten.length == 1 && oldRemark)
          {
              %><div><%=safe.html(oldRemark)%></div><%
          }

          RWTEXTAREATR("opmerk", "fldtxt" + (req?" required":""), "", "", { tdhtml_ta: "colspan='2'", html: "rows='8'" });
          if (canNoti)
          {
            var sql = "SELECT CASE"
                    + "       WHEN prs_perslid_systeemadres IS NOT NULL"
                    + "       THEN 1"
                    + "       ELSE 0"
                    + "       END hassysteemadres"
                    + "  FROM prs_perslid"
                    + " WHERE prs_perslid_key = " + mld_melding.melder_key;
            oRs = Oracle.Execute(sql);
            var hassysteemadres = oRs("hassysteemadres").Value;
            oRs.Close();
            var data = { boxfirst: true };
            if (hassysteemadres)
              data.trclass = "hidden";
            RWCHECKBOXTR("noti_caller",
                         "fld_noti_caller",
                         L("lcl_mld_noti_caller"),
                         (S("mld_close_noti_default_off") == 1 && !hassysteemadres? 0 : 1),
                         data);
          }
          if (S("mld_assume_ok_days") > 0)
          {
            RWCHECKBOXTR("assume_ok",
                         "fld_assume_ok",
                         L("lcl_mld_assume_ok").format(S("mld_assume_ok_days")),
                         false,
                         {boxfirst: true});
          }
          if (thirdpartypresent)
          {
              RWCHECKBOXTR("notifyExt", "fld_notifyExt", L("lcl_mld_noti_ext").format(safe.html(mld_melding.naam_ext ? mld_melding.naam_ext : mld_melding.email_ext)), (S("mld_close_noti_default_off") == 1 ? 0 : 1), { boxfirst: true });
          }

          if (canCloseOpdr.length)
          { %>
            <tr>
              <td colspan="2">
             <% CHECKBOX("fldopdrclose", "opdr_close", S("mld_close_opdr_default")); %>
                <label for="opdr_close"><%=canCloseOpdr.length + L("lcl_mld_ord_close_all")%></label>
              </td>
            </tr>
<%        }
          if (canCloseCtr.length)
          { %>
            <tr>
              <td colspan="2">
             <% CHECKBOX("fldctrclose", "ctr_close", S("mld_close_ctr_default"), { html: "onChange='ctrcloseToggler(this)'" }); %>
                <label for="ctr_close"><%=canCloseCtr.length > 1? canCloseCtr.length + L("lcl_mld_ctr_close_all_n") : L("lcl_mld_ctr_close_all_1")%></label>
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <div id="inscontrolemode" style="display: none">
                  <table>
<%                  for (var i = 0; i < controleModeArray.length; i++)
                    { // Maximaal 3 types.
                      var sctype;
                      switch (controleModeArray[i])
                      {
                        case 1:  sctype = L("lcl_ins_srtcontrole_insp"); break;
                        case 2:  sctype = L("lcl_ins_srtcontrole_repl"); break;
                        case 3:  sctype = L("lcl_ins_srtcontrole_cert"); break;
                      }

                      sql = "SELECT ins_controlemode_key"
                          + "     , " + lcl.xsqla('ins_controlemode_oms', 'ins_controlemode_key')
                          + "  FROM ins_controlemode"
                          + "  WHERE ins_srtcontrole_type = " + controleModeArray[i]
                          + "  ORDER BY 2";

                      // Methode is voor de status Afgemeld(5) en Historie/Verwerkt(6) altijd ingevuld.
                      // Required wordt gezet als de selectbox zichtbaar wordt.
                      FCLTselector("sel_controlemode" + controleModeArray[i],
                                   sql,
                                   { label: L("lcl_ins_controle_mode") + " " + sctype,
                                     initKey: -1,
                                     emptyOption: L("lcl_select_controlemode"),
                                     selectjustone: true
                                   });
                    }
%>                </table>
                </div>
              </td>
            </tr>
<%        }
        MODAL_BLOCK_END();

        // De verplichte afmeld (close) kenmerken tonen bij het afmelden. Vooralsnog worden de andere verplichte kenmerken niet getoond.
        generateFlexKenmerkBlock({stdm_arr         : [mld_melding.stdm_key],
                                  mld_key          : mld_melding.mld_key,
                                  prs_key          : user_key,
                                  close            : true,
                                  canFlexChange    : this_mld.canFlexChange,
                                  showConfidential : this_mld.canViewConfidential,
                                  melder_key       : mld_melding.melder_key,
                                  srtdisc          : S("mld_processing_group_all")? [] : [mld_melding.srtdisc_key],
                                  disc             : mld_melding.disc_key,                                                                            // Initiele waarde primaire Vakgroep/Behandelteam.
                                  //prsautlevel      : prsautlevel, // Blokbehandelteam, blokbehandelaar en afgemeld niet te wijzigen. Voor de prsautlevel wordt dan wel 9 genomen.
                                  show_alg         : mld_melding.show_alg,
                                  loc_key          : mld_melding.loc_key,
                                  this_mld         : this_mld
                                });

      buttons = [];
      if (has_opdr_opm)
        buttons.push({title: L("lcl_mld_opm_paste"), icon: "fa-clipboard", action: "mld_opmpaste()", id: "opmpaste", importance: 3});
      buttons.push({title: L("lcl_close"), icon: "fa-fclt-save", action: "mld_close()", singlepress: true, id: "btn_close_submit", importance: 1  })
      buttons.push({title: L("lcl_cancel"), icon: "fa-fclt-cancel", action: "mld_cancel()", importance: 3 });
      SIMPLE_BLOCK_START();
        CreateButtons(buttons);
      SIMPLE_BLOCK_END();
IFACE.FORM_END();
%>
    </form>
    <% MODAL_END(); %>
  </body>
</html>
<% ASPPAGE_END(); %>
