<% /*
     $Revision$
     $Id$

    File:        mld_list.inc
    Description: Definieert de serverside functie mld_list() die een lijst van meldingen toont die
                 voldoen aan de gegeven parameters/criteria, binnen de readautorisaties van de user.
    Parameters:  -
    Context:     -

    Note:

*/ %>
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="../Shared/status.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/rater.inc" -->
<!-- #include file="mld.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->

<%
FCLTHeader.Requires({ plugins: ["suggest", "jQuery"],
                      js: ["./mld_list.js", "jquery-ui.js"]});

var mldlist = { // Globaal beschikbaar
    fnrowClass: function _fnrowClass(oRs)
    {
        var recent = new Date();
        recent.setMinutes(recent.getMinutes() - S("mld_melding_recent"));

        if (oRs("mld_melding_parentkey").Value > 0)
          return " child";

        var mldStatus = oRs("mld_status").Value;
        var class1 = "";
        if (!frontend)
        {
          // voor professionals kleuren we de meldingen

          var lnow = new Date();

          // Meldingen waaraan je nog niet hoeft te beginnen tonen we sleepy.
          // Daarbij gaan we verder ook niet kleuren op basis van andere statussen enzo,
          // belangrijkst is dat hij nog niet aan de beurt is.
          if (oRs("mld_melding_datum").Value > lnow)
          {
            class1 += 'sleepy';
          }
          else
          {
            // Alles wat al geaccepteerd had moeten zijn wordt expired1
            // in deze statussen zijn geen opdrachten aanwezig dus kan nooit status unsolved optreden
            // Soms (bij toekomstige meldingen is soms de eindacceptatie niet gevuld blijkt; lijkt me niet goed, maar dan kan een extra check geen kwaad.
            if ((mldStatus == 2 || mldStatus == 3) && oRs("eindacceptatie").Value && (oRs("eindacceptatie").Value < lnow))
                class1 += ' expired1';

            // Alles wat al klaar had moeten zijn wordt expired2
            if (oRs("mld_stdmelding_planbaar").Value != 2 && (mldStatus == 4 || mldStatus == 7) && oRs("optijd").Value == 0)
                class1 += ' expired2';

            // Meldingen met uitgegeven(7) worden unsolved als er 0 lopende opdrachten zijn
            // en meer dan 0 opdrachten so wie so (er zijn dus opdrachten geweest)
            if (backo && (mldStatus == 4 || mldStatus == 7)
                      && oRs("nrOrders").Value > 0
                      && oRs("nrActief").Value == 0) class1 += ' unsolved';

            // Als de melding klaar is, maar nog niet alle opdrachten, of nog loopt
            // met niet alle opdrachten klaar, dan ook extra attentie (UWVA#20684)
            if (((mldStatus == 5 || mldStatus == 6) && oRs("nrActief").Value > 0)
              ||(mldStatus == 7 && oRs("nrActief").Value > 0 && oRs("nrActief").Value < oRs("nrOrders").Value))
                class1 += ' unready';
          }

          // als een actiedatum bekend is, markeren we die als dat vandaag is
          if (oRs("mld_melding_actiedatum").Value != null)
          {
              var lactiondate = new Date(oRs.Fields("mld_melding_actiedatum").Value);
              if (lactiondate.toDateString() == lnow.toDateString())
                class1 += ' today';
          }
        }

        // Als alle offertes de status Technisch Voltooid (6) en/of Afgekeurd (2) en/of Afgewezen (1) hebben, dan extra class orderready toevoegen.
        // Voor deze meldingen kan er een uitvoeringsopdracht aangemaakt worden, moet er een nieuwe offerte aangemaakt worden of de melding worden afgemeld.
        if (offertes && (oRs("aantal_offertes").Value == oRs("aantal_offready").Value) && mldStatus == 4)
        {
          class1 += " orderready";
        }

        var mld_recent = new Date(oRs("recentdatum").Value);
        if (mld_recent > recent)
        {
          class1 += " updated";
        }

        // Voor een vervolgmelding.
        if (oRs("isVervolg").Value)
          class1 += " vervolg";

        // Voor een workflowstep.
        if (oRs("isWorkflow").Value)
          class1 += " wfstep";

        // Dit zijn classes voor als het erg wenselijk is om een afwijkende kleur oid voor bepaalde categorieen te hebben.
        // deze class moet je dan zelf definieren in de custom css.
        class1 += " d_" + oRs("ins_discipline_key").Value;
        if (oRs("ins_srtdiscipline_prefix").Value)
          class1 += " sd_" + (oRs("ins_srtdiscipline_prefix").Value || "");
        if (oRs("mld_ins_discipline_key").Value)
          class1 += " bt_" + (oRs("mld_ins_discipline_key").Value || "");  // behandelteam

        return safe.htmlattr(class1);
    },
    legendaHtml: function _legendaHtml(params) {
      params = params || {};
      var result = '<div id="legenda" style="display:none; line-height: 30px;">'
                 + '  <table id="meldinglegenda">'
                 + (params.treat
                    ? '      <tr class="unsolved"><td><span class="mldClosed">' + I("fa-check") + '</span>&nbsp;' + L("lcl_afgemeld") + '</td></tr>'
                    + '      <tr class="unsolved"><td><span class="">' + I("fa-times") + '</span>&nbsp;' + L("lcl_mld_not") + '&nbsp;' + L("lcl_afgemeld") + '</td></tr>'
                    : '      <tr><td title="' + L("lcl_mld_legenda_normal_tt") + '">' + L("lcl_mld_legenda_normal") + '</td></tr>')
                 + '      <tr class="expired1"><td title="' + L("lcl_mld_legenda_expired1_tt") + '">' + L("lcl_mld_legenda_expired1") + '</td></tr>'
                 + '      <tr class="expired2"><td title="' + L("lcl_mld_legenda_expired2_tt") + '">' + L("lcl_mld_legenda_expired2") + '</td></tr>'
                 + '      <tr class="updated"><td title="' + L("lcl_mld_legenda_updated_tt") + '">' + L("lcl_mld_legenda_updated") + '</td></tr>'
                 + '      <tr class="expired2 updated"><td title="' + L("lcl_mld_legenda_expired2_tt") + '/' + L("lcl_mld_legenda_updated_tt") + '">' + L("lcl_mld_legenda_expired2") + '+' + L("lcl_mld_legenda_updated") + '</td></tr>'
                 + (params.anyorders
                    ? '      <tr class="unsolved"><td title="' + L("lcl_mld_legenda_unsolved_tt") + '">' + L("lcl_mld_legenda_unsolved") + '</td></tr>'
                    + '      <tr class="unready"><td title="' + L("lcl_mld_legenda_unready_tt") + '">' + L("lcl_mld_legenda_unready") + '</td></tr>'
                    : '')
                 + '      <tr class="sleepy"><td title="' + L("lcl_mld_legenda_sleepy_tt") + '">' + L("lcl_mld_legenda_sleepy") + '</td></tr>'
                 + '      <tr class="child"><td title="' + L("lcl_mld_legenda_child_tt") + '">' + L("lcl_mld_legenda_child") + '</td></tr>';
      for (var flagkey = 1; flagkey < S('mld_melding_flags'); flagkey++) {
        result += '        <tr><td><span class="mldflag' + flagkey + '">' + I("fa-fclt-flag") + '</span>&nbsp;' + L("lcl_mld_flag" + flagkey) + '</td></tr>';
      }
      result += '</table></div>';
      return result;
    }
};

function mld_list (pautfunction, params)
{ // VALIDATE AND PREPARE
  // Als een parameter niet gedefinieerd of null is, dan doet-ie niks
  // anders wordt die verondersteld een zinvolle waarde te hebben
  // NB: -1 is vaak geen zinvolle waarde; null had het dan moeten zijn!

  // Valid and supported parameters are:
  // params.urole          : the usuals two-letter lowercase string
  // params.outputmode     : print to 0 = screen, 1 = printer, 2 = excel, etc.
  // params.perform        : boolean // Wordt hier niet gebruikt. Alleen in mld_groep_list.inc.
  // params.treat          : boolean // Gebruikt om de voortgangsreportage te tonen.
  // params.showall        : boolean
  // params.mld_key        : key
  // params.opdr_key       : key
  // params.mldstatus_arr  : Array met keys (e.g. [3, 4, 5])
  // params.opdrstatus_arr : Array met keys (e.g. [3, 4, 5])
  // params.caller_key     : key
  // params.comp_key       : key
  // params.org_key        : key
  // params.ref_key        : key
  // params.ref_type       : String with module character (module type) ('M', 'O', 'R', 'B', 'X', 'C' or 'F')
  // params.reg_key_arr    : Array met keys
  // params.dist_key_arr   : Array met keys
  // params.loc_key_arr    : Array met keys
  // params.bld_key_arr    : Array met keys
  // params.flr_key_arr    : Array met keys
  // params.room_key_arr   : Array met keys
  // params.mld_ins_discipline_key_arr : Array met keys (e.g. [3, 4, 5])
  // params.behandel_key_arr  : Array met keys (e.g. [3, 4, 5])
  // params.behandel2_key_arr : Array met keys (e.g. [3, 4, 5])
  // params.srtdisc_key_arr: Array met keys (e.g. [3, 4, 5])
  // params.disc_key_arr   : Array met keys (e.g. [3, 4, 5])
  // params.meldinggrp     : String met een meldinggroep
  // params.stdm_key_arr   : Array met keys (e.g. [3, 4, 5])
  // params.kpgrp_key_arr  : array met keys
  // params.kp_key_arr     : Array met keys
  // params.tag_key_arr    : Array met keys
  // params.handler_key    : key
  // params.uitvopdr_key   : key
  // params.contact_key    : key
  // params.opdrtype_key   : key
  // params.searchtekst    : wildcard string
  // params.omschr         : wildcard string
  // params.disc_key       : key
  // params.insgroup_key   : key
  // params.objsrt_key_arr : Array met keys (e.g. [3, 4, 5])
  // params.objectoms      : wildcard string
  // params.groepering_key : key
  // params.chkAcceptEx    : boolean
  // params.chkRunEx       : boolean
  // params.chkSpoed       : boolean
  // params.chkAfgerond    : boolean
  // params.datefrom       : date
  // params.dateto         : date
  // params.enddatefrom    : date
  // params.enddateto      : date
  // params.offertes       : boolean
  // params.meldbron_key   : key
  // params.ingevoerd      : String ingevoerd door: "fe", "fo" of -1 voor beide
  // params.verantw_key    : key

  // params.dienst_key     : key
  // params.deel_key       : deel_key
  // params.deelsrtcont_key: deelsrtcont_key
  // params.rsv_ruimte_key : res_rsv_ruimte_key
  // params.referencetype  : referencetype
  // params.withflex       : boolean

  // Statuses:
  //   params.mldstpen = 1  (0): true | false
  //   params.mldstrej = 1  (1): true | false
  //   params.mldstnew = 1  (2): true | false
  //   params.mldsting = 1  (3): true | false
  //   params.mldstacc = 1  (4): true | false
  //   params.mldstuit = 1  (7): true | false
  //   params.mldstafm = 1  (5): true | false
  //   params.mldstver = 1  (6): true | false
  //   params.mldnieto = 1  (99): true | false  (substatus van 4)
  //
  // if a parameters has a value of -1, then it is assumed not to be set and to be ignored.

  // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
  var authparams = user.checkAutorisation(pautfunction);

  var urole = params.urole;
  var fronto = (urole == "fo");
  var backo = (urole == "bo");
  var minfo = (urole == "mi"); // NOT APPLICABLE?
  var frontend = (urole == "fe" || (!fronto && !backo && !minfo));
  params.minfo = minfo;
  var tiny = (params.tiny==1);
  var showgekoppeld = params.linked;
  var loc_key_arr = params.loc_key_arr || [];
  var bld_key_arr = params.bld_key_arr || [];
  var flr_key_arr = params.flr_key_arr || [];
  var room_key_arr = params.room_key_arr || [];

  // AUTORISATIES
  if (params.full)
  {
    canAdd = false;
  }
  else
  {
    if (urole == "bo")
    {
      var locauthparams = user.checkAutorisation("WEB_MLDFOF", true);
      var canAdd = locauthparams && locauthparams.PRSwritelevel < 9 && locauthparams.ALGwritelevel<9;
    }
    else if (urole == "fo")
      canAdd = authparams.PRSwritelevel < 9 && authparams.ALGwritelevel<9
    else // mi, fe
      canAdd = false;
  }

  // Voor resulttable de globalen zetten; zou ng anders moeten.
  var outputmode = params.outputmode; // print to 0 = screen, 1 = printer, 2 = excel, etc.
  var print = (outputmode == 1 || outputmode == 5);
  var excel = (outputmode == 2 || outputmode == 6);
  var showall = params.showall;
  var treat = params.treat;

  if (params.withflex && !excel && !print)
  {
    // Fast check to see if we have any listable flex at all, to prevent superfluous column
    var sql = "SELECT DISTINCT"
            + "       COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
            + "              ,  " + lcl.xsql("sk.mld_srtkenmerk_omschrijving", "sk.mld_srtkenmerk_key") + ") mld_kenmerk_omschrijving"
            + "     , sk.mld_srtkenmerk_kenmerktype"
            + "  FROM mld_srtkenmerk sk, mld_kenmerk k"
            + " WHERE BITAND (mld_kenmerk_inlijst, 1) = 1"
            + "   AND BITAND (mld_srtkenmerk_systeem, 4) = 0"  // niet als vertrouwelijk en TODO wellicht nog rolcode?
            + "   AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
            + "   AND k.mld_kenmerk_niveau NOT IN ('P', 'O')"
            + "   AND k.mld_kenmerk_verwijder IS NULL"
            + "   AND sk.mld_srtkenmerk_verwijder IS NULL";
    var oRs = Oracle.Execute(sql);
    var anyflex = !oRs.eof;
    if (anyflex)
    {
        var multiflex = false;
        var bijlageflex = (oRs("mld_srtkenmerk_kenmerktype").Value == "M");
        var flexlabel = oRs("mld_kenmerk_omschrijving").Value;
        oRs.MoveNext();
        if (!oRs.Eof)
        {
            multiflex = true;
            flexlabel = L("lcl_flexlist");

            while (!oRs.eof)
            {
                if (oRs("mld_srtkenmerk_kenmerktype").Value == "M")
                    bijlageflex = true;
                oRs.MoveNext();
            }
        }
    }
    oRs.close();
  }

  var mld_key = params.mld_key;
  var mld_key_arr = params.mld_key_arr || [];
  var mld_ins_discipline_key_arr = params.mld_ins_discipline_key_arr || [];
  var behandel_key_arr = params.behandel_key_arr || [];
  var behandel2_key_arr = params.behandel2_key_arr || [];

  var disc_key_arr = params.disc_key_arr || [];
  var offertes = params.offertes;

  // Fast check to see if we have anything to do with geographics
  // If not, we can suppress a few filters.
  sql= "SELECT 1 FROM ins_srtdiscipline WHERE (ins_srtdiscipline_alg=1 OR ins_srtdiscipline_ins=1 OR ins_srtdiscipline_bes=1) AND ROWNUM = 1";
  oRs = Oracle.Execute(sql);
  var anygeo = !oRs.eof;
  oRs.close();

  // Do we recognize any *significant* ruimte? If not (Plato) we suppress in-building columns
  sql= "SELECT 1 FROM alg_ruimte WHERE alg_ruimte_verwijder IS NULL AND SUBSTR(alg_ruimte_nr,1,1) <> '_' AND ROWNUM = 1";
  oRs = Oracle.Execute(sql);
  var anydetailedgeo = !oRs.eof;
  oRs.close();

  // Fast check to see if we have any vakgroeptypes with objects
  // If not, we can suppress a column
  sql = "SELECT 1 FROM ins_srtdiscipline WHERE ins_srtdiscipline_ins = 1"
      + (params.srtdisc_key_arr.length? " AND ins_srtdiscipline_key IN (" + params.srtdisc_key_arr.join(",") + ")" : "")
      + " AND ROWNUM = 1 AND ins_srtdiscipline_verwijder IS NULL";
  oRs = Oracle.Execute(sql);
  var anyins = !oRs.eof;
  oRs.close();

  // Fast check to see if we have anything to do with orders
  sql= "SELECT 1 FROM mld_opdr WHERE ROWNUM = 1";
  oRs = Oracle.Execute(sql);
  mldlist.anyorders = !oRs.eof;
  oRs.close();

  // Fast check to see if we have any stdmeldingen that bewaak the SLA :)
  sql = "SELECT 1"
      + "  FROM mld_stdmelding msm"
      + "       JOIN ins_tab_discipline itd"
      + "           ON itd.ins_discipline_key = msm.mld_ins_discipline_key"
      + "       JOIN ins_srtdiscipline isd"
      + "           ON itd.ins_srtdiscipline_key = isd.ins_srtdiscipline_key"
      + " WHERE msm.mld_stdmelding_slabewaken = 1"
      + "   AND (   msm.mld_stdmelding_vervaldatum IS NULL"
      + "        OR msm.mld_stdmelding_vervaldatum > SYSDATE)"
      + "   AND msm.mld_stdmelding_verwijder IS NULL"
      + "   AND itd.ins_discipline_verwijder IS NULL"
      + "   AND isd.ins_srtdiscipline_verwijder IS NULL";
  oRs = Oracle.Execute(sql);
  var anySla = !oRs.EoF;
  oRs.close();

  // Fast check to see if we have any actieve behandelaar and/or behandelteam
  // If not, we can suppress a few filters.
  sql = "SELECT 1"
      + "  FROM mld_melding m, mld_stdmelding sm"
      + " WHERE     m.mld_stdmelding_key = sm.mld_stdmelding_key"
      + "       AND (   m.mld_ins_discipline_key IS NOT NULL"
      + "            OR m.mld_melding_behandelaar2_key IS NOT NULL)"
      + "       AND sm.mld_stdmelding_verwijder IS NULL"
      + "       AND ROWNUM <= 1";
  oRs = Oracle.Execute(sql);
  mldlist.anybeh = !oRs.eof;
  oRs.close();

  // Fast check to see if we have any external ids
  // If not, we can suppress a column
  sql= "SELECT 1 FROM mld_melding WHERE mld_melding_externnr IS NOT NULL AND ROWNUM = 1";
  oRs = Oracle.Execute(sql);
  var anyexternnr = !oRs.eof;
  oRs.close();

  // Fast check to see if we have any groepeerbare vakgroepen
  // If not, we can suppress a column
  sql = "SELECT 1"
      + "  FROM ins_srtdiscipline sd"
      + "     , mld_discipline    di"
      + "     , mld_disc_params   dp"
      + " WHERE di.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
      + "   AND di.ins_discipline_key = dp.mld_ins_discipline_key"
      + "   AND sd.ins_srtdiscipline_verwijder IS NULL"
      + "   AND CASE WHEN dp.mld_disc_params_mldgroup = 0"
      + "            THEN BITAND(sd.ins_srtdiscipline_mldgroup, 2)"
      + "            ELSE BITAND(dp.mld_disc_params_mldgroup, 2)"
      + "       END = 2"
      + (params.srtdisc_key_arr.length? " AND sd.ins_srtdiscipline_key IN (" + params.srtdisc_key_arr.join(",") + ")" : "")
      + "   AND ROWNUM = 1"
      + " UNION ALL "
      + "SELECT 1 FROM mld_melding WHERE mld_melding_mldgroup_key IS NOT NULL"
      + " AND ROWNUM = 1";
  oRs = Oracle.Execute(sql);
  var anygrdisc = !oRs.eof;
  oRs.close();
%>
  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: outputmode });
      if (outputmode == 0) {
%>
      <script type="text/javascript">
        // Text strings used by mld_list.js
        var urole = "<%=urole%>";
        var setting_mld_accept_confirm = <%=S("mld_accept_confirm")?1:0%>;
      </script>
<%    } %>
    </head>

    <body id="listbody">
<%
      sql_mld_prefix = ", COALESCE((SELECT prs_afdeling_naam"
                     + "              FROM prs_afdeling d1"
                     + "             WHERE m.prs_afdeling_key = d1.prs_afdeling_key),"
                     + "           (SELECT prs_kostenplaats_nr"
                     + "              FROM prs_kostenplaats k"
                     + "             WHERE m.prs_kostenplaats_key = k.prs_kostenplaats_key),"
                     + "           (SELECT prs_afdeling_naam"
                     + "              FROM prs_afdeling d2"
                     + "             WHERE m.prs_afdeling_key = d2.prs_afdeling_key)) mld_prefix";

      if (treat)
      {
        sqln = "SELECT DISTINCT m.mld_melding_key"
             + "     , m.mld_melding_onderwerp"
             + "     , sd.ins_srtdiscipline_prefix"
             + sql_mld_prefix
             + "     , " + (showgekoppeld? "m.mld_melding_parentkey" : "NULL") + " mld_melding_parentkey"
             + "     , CASE"
               + "     WHEN sd.ins_srtdiscipline_prefix IS NULL"
               + "     THEN ''"
               + "     ELSE sd.ins_srtdiscipline_prefix || '-'"
               + "     END"
               + "     || " + lcl.xsqla('md.ins_discipline_omschrijving', 'md.ins_discipline_key')
             + "   , " + lcl.xsqla('std.mld_stdmelding_omschrijving', 'std.mld_stdmelding_key')
             + ", stdg.mld_stdmeldinggroep_naam"
             + "   , k.mld_kenmerk_key kenmerk_key"
             + "   , COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
             + "            ,  " + lcl.xsql("sk.mld_srtkenmerk_omschrijving", "sk.mld_srtkenmerk_key") + ") kenmerk_omschrijving"
             + "   , CASE WHEN kbm.mld_kenmerkblokmelding_afmelddatum IS NULL THEN 0 ELSE 1 END blokafgemeld";
      }
      else
      {
        sqln = "SELECT "
             + " m.mld_melding_key"
             + ", mld_melding_datum"
             + ", m.mld_melding_onderwerp"
             + ", TO_CHAR(SUBSTR(m.mld_melding_omschrijving, 1, 4000)) mld_melding_omschrijving"
             + ", m.mld_melding_externnr"
             + ", m.prs_kostenplaats_key"
             + ", m.mld_melding_opmerking"
             + ", m.mld_melding_einddatum"
             + ", m.mld_melding_actiedatum"
             + ", m.mld_melding_t_uitvoertijd.tijdsduur uitvoertijd_tijdsduur"
             + ", m.mld_melding_t_uitvoertijd.eenheid uitvoertijd_eenheid"
             + ", " + (showgekoppeld? "m.mld_melding_parentkey" : "NULL") + " mld_melding_parentkey"
             + ", m.mld_adres_key"
             + ", m.mld_ins_discipline_key"
             + ", std.mld_stdmelding_volgnr"
             + ", std.mld_stdmelding_doublecheck"
             + ", std.mld_stdmelding_planbaar"
             + ", std.mld_stdmelding_planbaarfe"
             + ", std.mld_stdmelding_slabewaken"
             + ", mld_melding_status mld_status"
             + ", mld_melding_tag_naam"
             + ", mld_melding_tag_datum_tot"
             + ", DECODE(mld_melding_status, 2, 1, 0, 2, 4, 2, 7, 2, 1, 3, 5, 3, 6, 3, 4) sortinggroup"
             + ", mld_melding_conceptstatus"
             + ", CASE WHEN (m.mld_melding_start_key IS NOT NULL AND m.mld_workflowstep_key IS NULL)"
             + "  THEN 1 ELSE 0 END  isVervolg"
             + ", CASE WHEN (m.mld_melding_start_key IS NOT NULL AND m.mld_workflowstep_key IS NOT NULL)"
             + "  THEN 1 ELSE 0 END  isWorkflow";

        if (params.mldbord) {
          if (params.mldbordColumn === -2) { // Primaire behandelaar
            sqln += ", m.mld_melding_behandelaar_key mldbordColumnKey"
                  + ", (SELECT pf.prs_perslid_naam_full FROM prs_v_perslid_fullnames_all pf"
                  + "    WHERE pf.prs_perslid_key = m.mld_melding_behandelaar_key) mldbordColumnValue";
          } else if (params.mldbordColumn === -3) { // Behandelteam
            sqln += ", m.mld_ins_discipline_key mldbordColumnKey"
                  + ", (SELECT md2.ins_discipline_omschrijving FROM mld_discipline md2"
                  + "    WHERE md2.ins_discipline_key = m.mld_ins_discipline_key) mldbordColumnValue";
          } else if (params.mldbordColumn === -4) { // Actieve behandelaar
            sqln += ", m.mld_melding_behandelaar2_key mldbordColumnKey"
                  + ", (SELECT pf2.prs_perslid_naam_full FROM prs_v_perslid_fullnames_all pf2"
                  + "    WHERE pf2.prs_perslid_key = m.mld_melding_behandelaar2_key) mldbordColumnValue";
          } else if (params.mldbordColumn > 0) { // Referentie kenmerk
            sqln += ", (SELECT km.mld_kenmerkmelding_waarde"
                  + "     FROM mld_srtkenmerk skm, mld_kenmerk k, mld_kenmerkmelding km"
                  + "    WHERE k.mld_kenmerk_key = km.mld_kenmerk_key"
                  + "      AND skm.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
                  + "      AND skm.mld_srtkenmerk_verwijder IS NULL"
                  + "      AND km.mld_melding_key = m.mld_melding_key"
                  + "      AND COALESCE(k.mld_kenmerk_omschrijving, skm.mld_srtkenmerk_omschrijving) = " + safe.quoted_sql(params.mldbordColumnDescr)
                  + "      AND skm.mld_srtkenmerk_key = " + params.mldbordColumn + ") mldbordColumnKey"
                  + ", (SELECT flx.getdomeinwaarde (skm.fac_kenmerkdomein_key, km.mld_kenmerkmelding_waarde)"
                  + "     FROM mld_srtkenmerk skm, mld_kenmerk k, mld_kenmerkmelding km"
                  + "    WHERE km.mld_melding_key = m.mld_melding_key"
                  + "      AND k.mld_kenmerk_key = km.mld_kenmerk_key"
                  + "      AND skm.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
                  + "      AND skm.mld_srtkenmerk_verwijder IS NULL"
                  + "      AND k.mld_kenmerk_verwijder IS NULL"
                  + "      AND km.mld_kenmerkmelding_verwijder IS NULL"
                  + "      AND COALESCE(k.mld_kenmerk_omschrijving, skm.mld_srtkenmerk_omschrijving) = " + safe.quoted_sql(params.mldbordColumnDescr)
                  + "      AND skm.mld_srtkenmerk_key = " + params.mldbordColumn + ") mldbordColumnValue"; // TODO serverside scope van wat ik /mag/
          }
        }

        // Is alleen relevant indien de melding nog niet geaccepteerd is (ook al querien we nu altijd)
        // en wordt gemeten vanaf INVOERDATUM tegen de huidige bibliotheek (stdmelding) waarde van _accepttijd.
        // Gelukkig is deze al bevroren in mld_melding_acceptdatum_std
        sqln += ", mld_melding_acceptdatum_std eindacceptatie";

        // Is alleen operationeel relevant indien de melding nog niet afgemeld of afgewezen is,
        // Maar ook daarna wel, maar moet dan worden gemeten naar de afmeld/afwijsdatum, en niet naar
        // de (geplande) einddatum.
        // Is die kleuring dan nog interessant? Operationeel niet echt, maar voor de MI juist wel.
        // PF: not quite right!! Eerder stond hier no de juiste suggestie:
        // // JGL: Misschien deze berekening alleen doen voor maninfo, voor de rest altijd mld_melding_einddatum?
//        sqln += ", CASE WHEN gau.actualuitvoertijd.tijdsduur / CASE"
//              + "                                              WHEN gau.actualuitvoertijd.eenheid = 'U'"
//              + "                                              THEN 24"
//              + "                                              ELSE 1"
//              + "                                              END"
//              + "            <= "
//              + "            (CASE"
//              + "            WHEN m.mld_melding_t_uitvoertijd.eenheid = 'U'"
//              + "            THEN m.mld_melding_t_uitvoertijd.tijdsduur / 24"
//              + "            ELSE m.mld_melding_t_uitvoertijd.tijdsduur"
//              + "            END + CASE"
//              + "                  WHEN m.mld_melding_t_respijt.tijdsduur IS NULL"
//              + "                  THEN 0"
//              + "                  WHEN m.mld_melding_t_respijt.eenheid = 'U'"
//              + "                  THEN m.mld_melding_t_respijt.tijdsduur / 24"
//              + "                  ELSE m.mld_melding_t_respijt.tijdsduur"
//              + "                  END)"
//              + "       THEN 1"
//              + "       ELSE 0"
//              + "   END opslatijd";
        // We willen juist WEL een kleurindicatie; dit is de ruwe data: melding had al klaar moeten zijn
        // bij de presentatie voegen we daar de status EN LOPEND aan toe
        sqln += ", CASE WHEN mld_melding_einddatum > SYSDATE"
             + "        THEN 1"
             + "        ELSE 0"
             + "   END optijd";

        sqln += ", COALESCE(mld_melding_naam_ext, " + S("prs_pers_string") + ") melder"
                + ", v.alg_gebouw_naam"
                + ", DECODE(l.alg_locatie_code, '','', l.alg_locatie_code||DECODE(v.alg_plaatsaanduiding, '', ' ('||l.alg_locatie_omschrijving||')', '-'||v.alg_plaatsaanduiding || DECODE(v.alg_plaatsomschrijving, '','' ,' (' || v.alg_plaatsomschrijving || ')')))"
                +     " plaatsmelding"
                + ", l.alg_locatie_code"
                + ", v.alg_gebouw_code"
                + ", v.alg_terreinsector_code"
                + ", v.alg_verdieping_code"
                + ", v.alg_ruimte_nr"
                + ", v.alg_ruimte_omschrijving"
                + ", l.alg_locatie_adres"
                + ", l.alg_locatie_plaats"
                + (minfo
                  ? ", di.alg_district_omschrijving" +
                    ", (SELECT r.alg_regio_omschrijving" +
                    "     FROM alg_district d" +
                    "        , alg_regio r" +
                    "    WHERE d.alg_district_key = di.alg_district_key" +
                    "      AND d.alg_regio_key = r.alg_regio_key) alg_regio_omschrijving"
                  : "");

        // Object(en)
        if (anyins)
        {
            sqln += ", (SELECT LISTAGG ( "
                  + "                s.ins_srtdeel_omschrijving "
                  + "                || ' ' "
                  + "                || ins_deel_omschrijving, "
                  + "                '{0}') "
                  + "                WITHIN GROUP (ORDER BY ins_deel_omschrijving) "
                  + "                deel "
                  + "       FROM ins_v_aanwezigdeel d, ins_srtdeel s, mld_melding_object mo "
                  + "      WHERE mo.mld_melding_key = m.mld_melding_key "
                  + "        AND d.ins_deel_key = mo.ins_deel_key "
                  + "        AND d.ins_srtdeel_key = s.ins_srtdeel_key "
                  + "        AND ROWNUM <= " + S("mld_listagg_object_count") + ") object"
                  + ", (SELECT COUNT (1) "
                  + "     FROM ins_v_aanwezigdeel d, ins_srtdeel s, mld_melding_object mo "
                  + "    WHERE mo.mld_melding_key = m.mld_melding_key "
                  + "      AND d.ins_deel_key = mo.ins_deel_key "
                  + "      AND d.ins_srtdeel_key = s.ins_srtdeel_key) objCount";
        }

        if (S("mld_num_prefix_mode") == 1) // kostenplaats of afdeling
        {
            sqln += sql_mld_prefix;
        }

        sqln += ", sd.ins_srtdiscipline_prefix"
              + ", sd.ins_srtdiscipline_alg"
              + ", sd.ins_srtdiscipline_ins"
              + ", sd.ins_srtdiscipline_bes"
              + ", sd.ins_srtdiscipline_mldgroup"
              + ", mdp.mld_disc_params_mldgroup"
              + ", CASE"
                + " WHEN m.mld_melding_mldgroup_key IS NULL"
                + " THEN ''"
                + " ELSE (SELECT sd2.ins_srtdiscipline_prefix||m.mld_melding_mldgroup_key"
                + "         FROM ins_srtdiscipline  sd2"
                + "            , mld_discipline     md2"
                + "            , mld_stdmelding     std2"
                + "            , mld_melding        m2"
                + "        WHERE m2.mld_melding_key         = m.mld_melding_mldgroup_key"
                + "          AND std2.mld_stdmelding_key    = m2.mld_stdmelding_key"
                + "          AND md2.ins_discipline_key     = std2.mld_ins_discipline_key"
                + "          AND sd2.ins_srtdiscipline_key  = md2.ins_srtdiscipline_key)"
                + " END mldgroup_prefix"
              + ", md.ins_discipline_key"
              + ", md.ins_discipline_kpnverplicht"
              + ", std.ins_srtinst_verplichtstatus"
              + ", std.mld_stdmelding_freetext"
              + ", std.alg_onrgoed_niveau"
              + ", stdg.mld_stdmeldinggroep_naam"
              + ", COALESCE(m.mld_alg_locatie_key, -1) alg_locatie_key"
              + ", COALESCE(v.alg_gebouw_key, v.alg_terreinsector_key, -1) alg_gebouw_key"
              + ", COALESCE(v.alg_verdieping_key, -1) alg_verdieping_key"
              + ", COALESCE(v.alg_ruimte_key, -1) alg_ruimte_key"
              + ", CASE"
                + " WHEN sd.ins_srtdiscipline_prefix IS NULL"
                + " THEN ''"
                + " ELSE sd.ins_srtdiscipline_prefix || '-'"
                + " END"
                + " || "+lcl.xsqla('md.ins_discipline_omschrijving', 'md.ins_discipline_key')
              + ", std.mld_stdmelding_key"
              + ", "+lcl.xsqla('std.mld_stdmelding_omschrijving','std.mld_stdmelding_key')

        sqln += ", (SELECT COUNT(mld_opdr_key) FROM mld_opdr WHERE mld_melding_key = m.mld_melding_key) nrOrders"

        // Heeft de melding een opdracht die recent is gewijzigd maar nog niet ingezien?
        sqln += ", (SELECT MAX(CASE WHEN GREATEST( (SELECT COALESCE(MAX(t.fac_tracking_datum), TO_DATE('01-01-1970','dd-mm-yyyy'))"
                                              + "     FROM fac_tracking t"
                                              + "        , fac_srtnotificatie st"
                                              + "    WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key"
                                              + "      AND st.fac_srtnotificatie_xmlnode = 'opdracht'"
                                              + "      AND t.fac_tracking_refkey = ro.mld_opdr_key"
                                              + "  )"
                                              + ", (SELECT COALESCE(MAX(n.mld_opdr_note_aanmaak), TO_DATE('01-01-1970','dd-mm-yyyy'))"
                                              + "     FROM mld_opdr_note n"
                                              + "  WHERE n.mld_opdr_key = ro.mld_opdr_key"
                                              + "  )"
                                              + ") > ro.mld_opdr_laatstgezien"
                                + " THEN 1"
                                + " ELSE 0"
                                + " END) isgewijzigd"
              + "  FROM mld_opdr ro"
              + " WHERE ro.mld_melding_key = m.mld_melding_key) isGewijzigd"

        sqln += ", (SELECT MAX ( GREATEST ( (SELECT COALESCE ( MAX (t.fac_tracking_datum), TO_DATE ('01-01-1970','dd-mm-yyyy'))"
                                       + "     FROM fac_tracking       t"
                                       + "        , fac_srtnotificatie st"
                                       + "    WHERE t.fac_srtnotificatie_key = st.fac_srtnotificatie_key"
                                       + "      AND st.fac_srtnotificatie_xmlnode = 'opdracht'"
                                       + "      AND t.fac_tracking_refkey = ro.mld_opdr_key"
                                       + "  )"
                                       + ", (SELECT COALESCE ( MAX (n.mld_opdr_note_aanmaak), TO_DATE ('01-01-1970','dd-mm-yyyy'))"
                                       + "     FROM mld_opdr_note n"
                                       + "    WHERE n.mld_opdr_key = ro.mld_opdr_key"
                                       + "  )"
                                       + ")"
              + "              ) laatstgewijzigd"
              + "     FROM mld_opdr ro"
              + "    WHERE ro.mld_melding_key = m.mld_melding_key"
              + "  ) laatstgewijzigd";

        sqln += ", m.mld_melding_spoed";

        // Aantal actieve opdrachten
        sqln += ", (SELECT COUNT(o.mld_statusopdr_key)"
              + "     FROM mld_opdr o"
              + "    WHERE mld_melding_key = m.mld_melding_key"
              + "      AND o.mld_statusopdr_key NOT IN (1, 2, 6, 7, 9)) nrActief";

        sqln += ", (SELECT pf.prs_perslid_naam_full FROM prs_v_perslid_fullnames_all pf"
              + "    WHERE pf.prs_perslid_key = m.mld_melding_behandelaar_key) behandelaar"
              + ", (SELECT md2.ins_discipline_omschrijving FROM mld_discipline md2"
              + "    WHERE md2.ins_discipline_key = m.mld_ins_discipline_key) behandelteam"
              + ", (SELECT pf2.prs_perslid_naam_full FROM prs_v_perslid_fullnames_all pf2"
              + "    WHERE pf2.prs_perslid_key = m.mld_melding_behandelaar2_key) behandelaar2"
              + ", m.mld_workflowstep_key workflow";

        if (minfo)
        {
            sqln += ", (SELECT " + S("prs_dep_string")
                  + " FROM prs_v_afdeling d"
                  + " WHERE p.prs_afdeling_key = d.prs_afdeling_key) organisatie";

            sqln += ", (SELECT " + S("prs_kpn_string")
                  + " FROM prs_kostenplaats k"
                  + " WHERE k.prs_kostenplaats_key = m.prs_kostenplaats_key) kostenplaats";

            sqln += ", COALESCE((SELECT SUM(topdr.mld_opdr_kosten)"
                  + " FROM mld_opdr topdr"
                  + ", mld_typeopdr ty"
                  + " WHERE topdr.mld_melding_key = m.mld_melding_key"
                  + " AND topdr.mld_typeopdr_key = ty.mld_typeopdr_key"
                  + " AND ty.mld_typeopdr_kosten = 1"
                  + " GROUP BY m.mld_melding_key), 0) kosten";
        } // minfo only

        // Voeg laatste tracking datum toe
        sqln +=   ", (SELECT MAX(fac_tracking_datum)"
                  + "   FROM (SELECT t.fac_tracking_datum"
                  + "           FROM fac_tracking t"
                  + "              , fac_srtnotificatie sn"
                  + "          WHERE t.fac_srtnotificatie_key = sn.fac_srtnotificatie_key"
                  + "            AND t.fac_tracking_refkey = m.mld_melding_key"
                  + "            AND sn.fac_srtnotificatie_xmlnode = 'melding'"
                  + "          UNION ALL"
                  + "         SELECT mld_melding_note_aanmaak recentdatum"
                  + "           FROM mld_melding_note"
                  + "          WHERE mld_melding_key = m.mld_melding_key))"
                  + " recentdatum";

        // Voeg de flag toe
        sqln += ", m.mld_melding_actiecode"
              + ", m.mld_melding_flag"
              + ", m.mld_melding_satisfaction oordeel"
              + ", m.mld_melding_satisfaction_op oordeel_opm"

        sqln += (offertes
                ? ", offerte.aantal_offertes"
                  + ", COALESCE(offready.aantal_offready, 0) aantal_offready"
                  + ", opdracht.aantal_opdrachten"
                : "");

        sqln += ", (SELECT mn.mld_melding_note_omschrijving"
              + "     FROM mld_melding_note mn"
              + "    WHERE mn.mld_melding_key = m.mld_melding_key"
              + "      AND mn.mld_melding_note_key = (SELECT MAX (mn.mld_melding_note_key)"
              + "                                       FROM mld_melding_note mn"
              + "                                      WHERE mn.mld_melding_key = m.mld_melding_key)) notitie"
              + ", (SELECT MAX(mn.mld_melding_note_aanmaak)"
              + "     FROM mld_melding_note mn"
              + "    WHERE mn.mld_melding_key = m.mld_melding_key) notitiedatum"

        if (anyflex)
        {
            // Wat mag ik op  basis van mijn autorisatie zien, bepaal mijn rolcode-masker. In principe.
            // Je wilt controleren maar dan moet je voor elk record (!) de complete 3D-scope (!) controleren
            // Dat is niet te doen, daarom leggen we de verantwoordelijkheid bij de applicatiebeheerder
            // Die moet alleen kenmerken in de lijst laten zien die iedereen mag zien.
            var myreadrolcode = 7;  // alles.

            sqln += ", (SELECT LISTAGG("
                 + (multiflex ? "COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
                 + "                    ,  " + lcl.xsql("skm.mld_srtkenmerk_omschrijving", "skm.mld_srtkenmerk_key") + ")"
                                + " || ':'|| CHR(160) ||"
                              : "")
                 + "            CASE"
                 + "            WHEN skm.mld_srtkenmerk_kenmerktype = 'R' OR skm.mld_srtkenmerk_kenmerktype = 'r' OR skm.mld_srtkenmerk_kenmerktype = 'S'"
                 + "            THEN flx.getdomeinwaarde (skm.fac_kenmerkdomein_key, km.mld_kenmerkmelding_waarde)"
                 + "            WHEN skm.mld_srtkenmerk_kenmerktype = 'N'"
                 + "             AND skm.mld_srtkenmerk_lengte = 1 "
                 + "             AND skm.mld_srtkenmerk_nmin = 0 "
                 + "             AND skm.mld_srtkenmerk_nmax = 1 "
                 + "             AND (skm.mld_srtkenmerk_dec = 0 OR skm.mld_srtkenmerk_dec IS NULL) "
                 + "            THEN DECODE (km.mld_kenmerkmelding_waarde, "
                 + "                         0, "+safe.qL("lcl_check_0")+", "
                 + "                         1, "+safe.qL("lcl_check_1")+", "
                 + "                         km.mld_kenmerkmelding_waarde)"
                 + "            ELSE km.mld_kenmerkmelding_waarde"
                 + "            END, CHR(13)) "
                 + "          WITHIN GROUP (ORDER BY mld_kenmerk_volgnummer) "
                 + "      FROM mld_srtkenmerk skm,  mld_kenmerk k, mld_kenmerkmelding km"
                 + "     WHERE km.mld_melding_key = m.mld_melding_key"
                 + "       AND k.mld_kenmerk_key = km.mld_kenmerk_key"
                 + "       AND BITAND(k.mld_kenmerk_inlijst,1) = 1"
                 + "       AND BITAND(skm.mld_srtkenmerk_systeem,4) = 0"  // niet als vertrouwelijk
                 // + "       AND BITAND(k.mld_kenmerk_rolcode, "+ myreadrolcode +") > 0"  // met waarde 7 voegt dat niks toe
                 + "       AND skm.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
                 + "       AND skm.mld_srtkenmerk_verwijder IS NULL"
                 + "       AND k.mld_kenmerk_verwijder IS NULL"
                 + "       AND km.mld_kenmerkmelding_verwijder IS NULL) flex"
        }

        if (backo)
        {
            sqln += ", m.mld_melding_kto_type"
                  + ", m.mld_melding_kto_key";
        }

        if (treat)
        {
          sqln += ", k.mld_kenmerk_key kenmerk_key"
                + ", COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
                + "         ,  " + lcl.xsql("sk.mld_srtkenmerk_omschrijving", "sk.mld_srtkenmerk_key") + ") kenmerk_omschrijving"
                + ", CASE WHEN kbm.mld_kenmerkblokmelding_afmelddatum IS NULL THEN 0 ELSE 1 END blokafgemeld";
        }

      }

      // Voeg aan de sql het FROM en WHERE gedeelte toe
      var sqln_arr = mld.getfromwherelist_sql(pautfunction, params);

      if (!showgekoppeld)
      {
        sqln_arr[0] += " AND m.mld_melding_parentkey IS NULL";
        sqln_arr[1] += " AND m.mld_melding_parentkey IS NULL";
      }

      sqln = (frontend
             ? sqln + sqln_arr[0]
             : // !frontend: apply 3D authorization to the locations and to the organisations (both ALG and PRS)
               discx3d (sqln + sqln_arr[0],
                        ["md.ins_discipline_key", "m.mld_ins_discipline_key"], // Rechten alleen op de vakgroep en niet op de behandelteam (FCLT#54169).
                        "di.alg_regio_key",
                        "l.alg_district_key",
                        "l.alg_locatie_key",
                        "v.alg_gebouw_key",
                        "v.alg_verdieping_key",
                        "v.alg_ruimte_key",
                        "b.prs_bedrijf_key",
                        "b.prs_afdeling_key",
                        pautfunction,
                        [], /* no additional discipline restrictions */
                        2))
           + " UNION "
           + sqln + sqln_arr[1];

      if (treat)
      {
        var sql_kenm = "SELECT DISTINCT k.mld_kenmerk_key"
                     + "     , k.mld_kenmerk_volgnummer"
                     + "     , COALESCE (" + lcl.xsql("k.mld_kenmerk_omschrijving", "k.mld_kenmerk_key")
                     + "              ,  " + lcl.xsql("sk.mld_srtkenmerk_omschrijving", "sk.mld_srtkenmerk_key") + ") kenmerk_omschrijving"
                     + "  FROM mld_kenmerk k"
                     + "     , mld_srtkenmerk sk"
                     + "     , mld_stdmelding s"
                     + "     , mld_discipline d"
                     + " WHERE k.mld_srtkenmerk_key = sk.mld_srtkenmerk_key"
                     + "   AND s.mld_ins_discipline_key = d.ins_discipline_key"
                     + "   AND ((k.mld_stdmelding_key IS NULL"
                     + "     AND k.mld_kenmerk_niveau = 'A')"
                     + "     OR (k.mld_stdmelding_key = s.mld_stdmelding_key"
                     + "     AND k.mld_kenmerk_niveau = 'S')"
                     + "     OR (k.mld_stdmelding_key = s.mld_ins_discipline_key"
                     + "     AND k.mld_kenmerk_niveau = 'D')"
                     + "     OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key"
                     + "     AND k.mld_kenmerk_niveau = 'T'))"
                     + "   AND sk.mld_srtkenmerk_verwijder IS NULL"
                     + "   AND k.mld_kenmerk_verwijder IS NULL"
                     + "   AND sk.mld_srtkenmerk_kenmerktype = 'b'"
                     + (params.srtdisc_key_arr && params.srtdisc_key_arr.length
                       ? " AND d.ins_srtdiscipline_key IN (" + params.srtdisc_key_arr.join(",") + ")"
                       : "")
                     + (params.disc_key_arr && params.disc_key_arr.length
                       ? " AND d.ins_discipline_key IN (" + params.disc_key_arr.join(",") + ")"
                       : "")
                     + (params.stdm_key_arr && params.stdm_key_arr.length
                       ? " AND s.mld_stdmelding_key IN (" + params.stdm_key_arr.join(",") + ")"
                       : "")
                     + " ORDER BY mld_kenmerk_volgnummer";
        var oRs_kenm = Oracle.Execute(sql_kenm);
        var kenm = { key: [], omschr: []};
        while (!oRs_kenm.eof)
        {
          kenm.key.push(oRs_kenm("mld_kenmerk_key").Value);
          kenm.omschr.push(oRs_kenm("kenmerk_omschrijving").Value);
          oRs_kenm.MoveNext();
        }
        oRs_kenm.Close();

        sqln = "SELECT /*+ CURSOR_SHARING_EXACT OPT_PARAM('optimizer_features_enable','11.2.0.4') */ * FROM (" + sqln + ") rec2"
             + " PIVOT (COUNT(kenmerk_omschrijving) AS aanwezig, SUM(blokafgemeld) AS afgemeld"
             + "   FOR kenmerk_key IN (" + kenm.key.join(",") + "))"
             + " ORDER BY ins_discipline_omschrijving, mld_stdmelding_omschrijving, mld_melding_key";
      }
      else
      {
        sqln = "SELECT /*+ CURSOR_SHARING_EXACT OPT_PARAM('optimizer_features_enable','11.2.0.4') */ * FROM (" + sqln + ") rec2 ORDER BY"
             + (excel? " UPPER(" + lcl.xsql('ins_discipline_omschrijving', 'ins_discipline_key') + "), mld_stdmelding_volgnr, mld_stdmelding_omschrijving," : "");
        // merk op: mld_melding_einddatum wordt afh van mld_stdmelding_planbaar soms niet getoond in de lijst
        //   dan is sortering 0 verrassend/onbepaald, daar zou je de lege waarden bij elkaar willen, dat is de reden voor mld_stdmelding_planbaar
        //   waarbij 0: einddatum wordt berekend, 1: de einddatum van de melding is default leeg, 2: veld is verborgen, +4 show_actiedatum, MNNL#65934
        //   dus bij 2,6 is er geen einddatum, bij de rest, dus 0,1,4,5 wel, dat is sorteren MOD 4: geen datum komt na alle datums
        if (bosort == 0)
              sqln += " sortinggroup, MOD(mld_stdmelding_planbaar,4) , mld_melding_einddatum" + (params.mldstafm||params.mldstver||params.mldstrej ? " DESC" : "");
        else if (bosort == 2)
              sqln += " recentdatum DESC";
        else
          sqln += " mld_melding_key DESC";
      }

      if (params.mldbord) {
        return sqln;
      }

      /**********************************
       * Callback functies ResultsetTable
       *********************************/

      // Extra data voor de client om daar dynamisch buttons te kunnen activeren.
      function fnrowData(oRs)
      {
        var mldStatus = parseInt(oRs("mld_status").Value);
        var mldPrefix = oRs("ins_srtdiscipline_prefix").Value || "";
        var gewijzigd = oRs("isGewijzigd").Value == 1;

        var data = {mldStatus: mldStatus, mldPrefix: mldPrefix, mldOpdrChanged: gewijzigd};

        var mldChild = oRs("mld_melding_parentkey").Value? true : false;
        if (mldChild) data.mldChild = true;

        // mld_stdmelding_doublecheck: 00 (0) Geen controle uitvoeren
        //                             01 (1) Controle dubbel bij invoer nieuwe melding (door FE, FO (of BO))
        //                             10 (2) Controle dubbel bij accepteren melding (door BO)
        //                             11 (3) Controle zowel bij invoer als bij accepteren
        // Niet controleren als het al een childmelding is. Dan mag je eigenlijk al niet accepteren/afwijzen
        var doublecheck = oRs("mld_stdmelding_doublecheck").Value;
        var parent_key = oRs("mld_melding_parentkey").Value;
        var mldDoublecheck = (!parent_key && (doublecheck == 2 || doublecheck == 3));

        if (mldDoublecheck) data.mldDoublecheck = true;

        return JSON.stringify(data);
      }

      function fnrowActionEnabler(oRs)
      {
        if ((S("inline_actions_mld") == 0 || tiny && (S("inline_actions_mld") & 2)) && !(mld_key > 0) && mld_key_arr.length === 0)
            return {};

        // We weten al dat we mogen lezen. Geef dat mee aan func_enabled_melding, die wordt daar efficienter van
        var mldkey = oRs("mld_melding_key").Value;
        var this_mld = mld.func_enabled_melding(mldkey, { dontcarelink: true, dontcareblokheader: true, knownread: true });

        var eEdit = this_mld.canChange;             // Wijzigen
        var eReject = this_mld.canReject;           // Afwijzen
        var eClose = this_mld.canClose;             // Afmelden
        var eAccept = this_mld.canAccept;           // Accepteren
        var eContinue = this_mld.canContinue;       // Vervolg ('kopie')
        var eKenmerk = this_mld.canChange;          // Kenmerken wijzigen
        var eHerplan = this_mld.canHerplan;         // Actiedatum wijzigen

        var mld_ins_discipline_key = oRs("mld_ins_discipline_key").Value;
        var eForward = this_mld.canForward && !(mld_ins_discipline_key > 0);  // Doorsturen Vakgroep
        var eForwardTeam = this_mld.canForwardTeam;                           // Doorsturen Behandelteam

        // Zijn er velden verplicht die niet zijn ingevuld?
        // Startdatum, Einddatum, Melding voor (persoon), Vakgroep en Melding (stdmelding) worden door enkele constraint op de mld_melding tabel al afgedwongen.
        // Om een melding te forwarden/doorsturen moeten namelijk alle verplichte gegevens zijn ingevuld. Dat kan het geval zijn bij extern aangemaakte meldingen.
        var emptyRequiredFields = false;
        // Alleen als ik de melding door kan sturen de verplichte velden checken. Niet bij het corrigeren van de vakgroep/melding (canFixMelding) vanuit de status "Afgemeld(5)".

        if (this_mld.canForward)
        {
          var alg_level = 0;
          switch (oRs("ins_srtdiscipline_alg").Value)
          {
            case 1: alg_level = 5; break; // Ruimte
            case 3: alg_level = 4; break; // Verdieping
            case 5: alg_level = 3; break; // Gebouw
            case 7: alg_level = 2; break; // Locatie
            default: alg_level = 0;       // niet tonen
          }
          // Hier niet de functie mld.mld_melding_info(mldkey) gebruiken om mld_melding informatie op te halen.
          // Een groot gedeelte van de mld_melding informatie heb ik trouwens al.
          var mld_melding = { mld_key: mldkey,
                              mld_onderwerp: oRs("mld_melding_onderwerp").Value,
                              mld_omschr: oRs("mld_melding_omschrijving").Value,
                              kostenpl_key: oRs("prs_kostenplaats_key").Value || -1,
                              alg_onrgoed_niveau: oRs("alg_onrgoed_niveau").Value,
                              alg_level: alg_level,
                              show_alg: alg_level > 0,
                              show_ins: oRs("ins_srtdiscipline_ins").Value == 1,
                              show_bes: oRs("ins_srtdiscipline_bes").Value == 1,
                              kpnverplicht: (oRs("ins_discipline_kpnverplicht").Value == 1),
                              loc_key: oRs("alg_locatie_key").Value,
                              bld_key: oRs("alg_gebouw_key").Value,
                              flr_key: oRs("alg_verdieping_key").Value,
                              room_key: oRs("alg_ruimte_key").Value,
                              deladdress_key: oRs("mld_adres_key").Value,
                              srtinst_verplichtstatus: (oRs("ins_srtinst_verplichtstatus").Value == 1),
                              freetext: oRs("mld_stdmelding_freetext").Value
                            };
          emptyRequiredFields = mld.getEmptyRequiredFields(mld_melding);
          var eEmptyRequiredFields = emptyRequiredFields; // Zijn er verplichte velden niet ingevuld voor het doorsturen?
          eForward = eForward && !eEmptyRequiredFields;   // Als er verplichte velden niet zijn ingevuld dan niet doorsturen maar eerste de lege velden in laten vullen.
        }
        var eTerugzet = this_mld.canTerugzet; // Terugzetten naar frontoffice
        var eDoorzet  = this_mld.canDoorzet;  // Doorzetten naar backoffice
        var eGroup    = oRs("ins_srtdiscipline_mldgroup").Value & 2; // this_mld.canGroup; // TODO: Groeperen Auth
        var eGroup    = (oRs("mld_disc_params_mldgroup").Value == 0 ? oRs("ins_srtdiscipline_mldgroup").Value : oRs("mld_disc_params_mldgroup").Value) & 2;

        var eVerwerk = this_mld.canVerwerk;

        var data = { eEdit: eEdit,
                     eReject: eReject,
                     eClose: eClose,
                     eAccept: eAccept,
                     eContinue: eContinue,
                     eForward: eForward,
                     eForwardTeam: eForwardTeam,
                     eEmptyRequiredFields: eEmptyRequiredFields,
                     eGroup: eGroup,
                     eTerugzet: eTerugzet,
                     eDoorzet: eDoorzet,
                     eVerwerk: eVerwerk,
                     eKenmerk: eKenmerk,
                     eHerplan: eHerplan
                   };
        return data;
      }

      function fnmultiActionEnabler()
      {
        /* Bij 1 melding lopen we toch de inline-enablers na */
        if (mld_key > 0 || mld_key_arr.length)
            return {};

        /* Niet multi */
        var eEdit = false;
        var eForward = false;
        var eForwardTeam = false;
        var eEmptyRequiredFields = false;

        /* Fast check to see if we have anything to do with FO-BO handling (terug- of doorzetten) */
        sql= "SELECT 1 FROM "
           + "(SELECT 1 FROM mld_disc_params dp, mld_discipline d "
           + "WHERE d.ins_discipline_key = dp.mld_ins_discipline_key AND mld_disc_params_directklaar>0 and d.ins_discipline_verwijder IS NULL "
           + "UNION ALL "
           + "SELECT 1 FROM mld_stdmelding "
           + "WHERE mld_stdmelding_directklaar>0 AND mld_stdmelding_verwijder IS NULL) "
           + "WHERE ROWNUM = 1";
        oRs = Oracle.Execute(sql);
        var hasAnyFOBOdiscs = !oRs.eof;
        oRs.Close();

        /* Hebben we minimaal 1 vakgroeptype die een groepering kan zijn en minimaal 1 vakgroeptype die kan groeperen? */
        var sql = "SELECT ''"
                + "  FROM ins_srtdiscipline"
                + " WHERE EXISTS"
                + "           (SELECT ''"
                + "              FROM ins_srtdiscipline sd"
                + "                 , mld_discipline    di"
                + "                 , mld_disc_params   dp"
                + "             WHERE di.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
                + "               AND di.ins_discipline_key = dp.mld_ins_discipline_key"
                + "               AND CASE WHEN dp.mld_disc_params_mldgroup = 0"
                + "                        THEN BITAND (sd.ins_srtdiscipline_mldgroup, 1)"
                + "                        ELSE BITAND (dp.mld_disc_params_mldgroup, 1)"
                + "                   END = 1)"
                + "   AND EXISTS"
                + "           (SELECT ''"
                + "              FROM ins_srtdiscipline sd"
                + "                 , mld_discipline    di"
                + "                 , mld_disc_params   dp"
                + "             WHERE di.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
                + "               AND di.ins_discipline_key = dp.mld_ins_discipline_key"
                + "                AND CASE WHEN dp.mld_disc_params_mldgroup = 0"
                + "                        THEN BITAND (sd.ins_srtdiscipline_mldgroup, 2)"
                + "                        ELSE BITAND (dp.mld_disc_params_mldgroup, 2)"
                + "                   END = 2)";
        var oRs = Oracle.Execute(sql);
        var hasGroupable = !oRs.EoF;
        oRs.Close();

        /* Algehele autorisatie parameters voor snelle check */
        var authparamsMLDFOF = user.checkAutorisation("WEB_MLDFOF", true);
        var authparamsMLDBOF = user.checkAutorisation("WEB_MLDBOF", true);
        var authparamsMLDBO3 = user.checkAutorisation("WEB_MLDBO3", true);
        var authparamsMLDAFR = user.checkAutorisation("WEB_MLDAFR", true);
        var hasAnyFOFWrite = authparamsMLDFOF && (authparamsMLDFOF.PRSwritelevel < 9 || authparamsMLDFOF.ALGwritelevel < 9);
        var hasAnyBOFWrite = authparamsMLDBOF && (authparamsMLDBOF.PRSwritelevel < 9 || authparamsMLDBOF.ALGwritelevel < 9);
        var hasAnyBO3Write = authparamsMLDBO3 && (authparamsMLDBO3.PRSwritelevel < 9 || authparamsMLDBO3.ALGwritelevel < 9);
        var hasAnyAFRWrite = authparamsMLDAFR && (authparamsMLDAFR.PRSwritelevel < 9 || authparamsMLDAFR.ALGwritelevel < 9);

        var eContinue = !S("mld_disable_continuation") && hasAnyFOFWrite;
        var eVerwerk  = S("mld_archive_by_gui")        && hasAnyAFRWrite;
        var eGroup    = hasGroupable;
        var eTerugzet = hasAnyFOBOdiscs && hasAnyBOFWrite;
        var eDoorzet  = hasAnyFOBOdiscs && hasAnyFOFWrite;
        var eReject = hasAnyFOFWrite || hasAnyBOFWrite;
        var eClose  = hasAnyFOFWrite || hasAnyBOFWrite;
        var eAccept = hasAnyBOFWrite || hasAnyBO3Write;
        var eHerplan = hasAnyBOFWrite || hasAnyBO3Write;

        var data = { eEdit: eEdit,
                     eReject: eReject,
                     eClose: eClose,
                     eAccept: eAccept,
                     eContinue: eContinue,
                     eForward: eForward,
                     eForwardTeam: eForwardTeam,
                     eEmptyRequiredFields: eEmptyRequiredFields,
                     eGroup: eGroup,
                     eTerugzet: eTerugzet,
                     eDoorzet: eDoorzet,
                     eVerwerk: eVerwerk,
                     eKenmerk: true,
                     eHerplan: eHerplan
                   };
        return data;
      }

      function fncolKey(oRs)
      {
        var tekst = oRs("ins_srtdiscipline_prefix").Value + oRs("mld_melding_key").Value;
        if (S("mld_num_prefix_mode") > 0 && oRs("mld_prefix").Value)
            tekst = oRs("mld_prefix").Value + "#" + tekst;

        if (oRs("mld_melding_parentkey").Value)
            tekst += L("lcl_mld_references")+oRs("mld_melding_parentkey").Value;
        return tekst;
      }

      function fnfnProgress(oRs)
      {
        var aantal_blokken = 0;
        var aantal_afgemeld = 0;
        var progress = 0;
        for (var j = 0; j < kenm.key.length; j++)
        {
          var afgemeld = oRs(kenm.key[j] + "_afgemeld").Value;
          aantal_blokken += (afgemeld == 0 || afgemeld == 1? 1 : 0);
          aantal_afgemeld += (afgemeld == 1? 1 : 0);
        }
        if (aantal_blokken > 0)
          progress = Math.round(aantal_afgemeld / aantal_blokken * 100) / 100;

        return "<div class='mldProgress' style='width:100%'>"
             + "  <div class='mldBar' data-perc='" + (progress * 100) + "' style='width:" + (progress * 100) +"%'></div>"
             + "</div>";
      }

      function fnfnHandled(kenmerk_key)
      {
        return function (oRs)
        {
            if (oRs(kenmerk_key + "_afgemeld").Value == 1)
             return I("fa-check");
            else if (oRs(kenmerk_key + "_afgemeld").Value == 0)
              return I("fa-times");
            else return "";
        }
      }

      function fnfncolClass(kenmerk_key)
      {
        return function (oRs)
        {
            if (oRs(kenmerk_key + "_afgemeld").Value == 1)
             return "mldClosed";
            else if (oRs(kenmerk_key + "_afgemeld").Value == 0)
              return "mldToBeClosed";
            else return "";
        }
      }

      function fncolSpoed(oRs)  // kopie van opdr_list.inc
      {
        var priolevel = oRs("mld_melding_spoed").Value;
        var displ = mld.getpriotext(priolevel);
        var hprio = "<div style='display:none'>" + priolevel + "</div>";  // for sorting i presume
        if (outputmode == 0)
        {  // maak er dan nog een leuk plaatje van
            displ = "<span class='pricon' id='urg_prio"+priolevel+"' title='" + displ+"'>" + hprio + I(mld.getpriocon(priolevel)) + "</span>";
        }
        return displ;
      }

      function fnHasOrders(oRs)
      {
        var opdr_title = "";
        if (oRs("nrOrders").Value > 0)
        {
          opdr_title = (oRs("nrOrders").Value == 1 ? "1 " + L("lcl_shared_order") : oRs("nrOrders").Value + " " + L("lcl_orders"));
          if (oRs("isgewijzigd").Value)
          {
            opdr_title += ", " + L("lcl_mld_inf_name") + ": " + toDateTimeString(oRs("laatstgewijzigd").Value);
          }
        }
        return opdr_title;
      }

      function fncolStatus(oRs)
      {
        if (oRs("mld_melding_parentkey").Value > 0)
            return L("lcl_mld_parent_status").format(oRs("mld_melding_parentkey").Value); // default leeg

        var mldStatus = parseInt(oRs("mld_status").Value);
        var nrOrders = oRs("nrOrders").Value;
        var nrActief = oRs("nrActief").Value;
        // Een melding is nog niet opgelost
        // 1) als er opdrachten/offertes zijn bij de melding en waarvan er geen enkele meer actief is. De status van deze meldingen zijn geaccepteerd(4).
        // 2) als een verwerkte(5) melding niet akkoord bevonden is.
        var mldActiecode = oRs("mld_melding_actiecode").Value;
        // Bij mld_melding_status=5 kan backoffice afhankelijk van zijn attentie-bit de zichtbare status "Afgemeld" of "Niet opgelost" krijgen.
        // Frontend heeft bij mld_melding_status=5 altijd de status "Afgemeld".
        // Wanneer wordt een melding met status=5 getoond als Afgemeld of Niet opgelost.
        //             | Actie | Attentie | Status
        // ------------+-------+----------+---------------
        // backoffice  |   1   |     0    | Afgemeld
        //             |   1   |   128    | Niet opgelost

        var not_solved = (nrOrders > 0 && nrActief == 0 && backo && mldStatus == 4) || (mldStatus == 5 && (mldActiecode & 128) && S("mld_assume_ok_days") > 0);

        if (not_solved)
        { // Checkt bij status 4 of dat nieuw(4) of oud(99) is
          var mldkey = oRs("mld_melding_key").Value;
          mldStatus = mld.getextendedmldstatus(mldStatus, mldkey)
        }
        // De statustekst kan ook opgevraagd worden met "mld.getextendedmldstatustext" maar die houd geen rekening met de conceptstatus (mld_melding_conceptstatus) en vanwege performance.
        var mld_status = mld.getmldstatustext(mldStatus, oRs("mld_melding_conceptstatus").Value);

        return '<span style="white-space: nowrap">'+mld_status+'</span>';
      }

      // De plaatskolommen
      function fncolGebouwTerrein(oRs)
      {//
        if ((oRs("alg_gebouw_code").Value && (oRs("alg_gebouw_code").Value).substring(0,1) != "_")
           || (oRs("alg_terreinsector_code").Value && (oRs("alg_terreinsector_code").Value).substring(0,1) != "_"))
        return safe.html(oRs("alg_gebouw_code").Value||"" + oRs("alg_terreinsector_code").Value||"" );  // ze zijn nooit allebei gedefinieerd
      }

      function fncolVerdieping(oRs)
      {
        if (oRs("alg_verdieping_code").Value && (oRs("alg_verdieping_code").Value).substring(0,1) != "_")
        return safe.html(oRs("alg_verdieping_code").Value);
      }

      function fncolRuimte(oRs)
      {
        if (oRs("alg_ruimte_nr").Value && (oRs("alg_ruimte_nr").Value).substring(0,1) != "_")
        return safe.html(oRs("alg_ruimte_nr").Value) + "&nbsp;" + safe.html(oRs("alg_ruimte_omschrijving").Value);
      }

      function fncolObject(oRs)
      {
        if (oRs("objCount").Value > S("mld_listagg_object_count"))
          return "<span class=\"nowrap\">" + (outputmode == 0 ? I("fa-hand-point-right") + " " : "") + "(" + oRs("objCount").Value + " " + L("lcl_mld_objects") + ")</span>";
        else if (oRs("object").Value == null)
          return "";

        switch (S("mld_listagg_object_delimiter"))
        {
            case "comma":   list_delimiter = ", ";   break;
            case "newline": list_delimiter = "\n"; break;
            default: list_delimiter = ", ";
        }
        var obj = oRs("object").Value;
        var ret = (outputmode == 0 ? I("fa-hand-point-right") + " " : "");
        if (obj.indexOf("{0}") == -1) // single object
            return "<span class=\"nowrap\">" + ret + safe.html(obj.format(list_delimiter)) + "</span>";
        else
            return ret + safe.html(obj.format(list_delimiter));
      }

      function fncolNoteTooltip(oRs)
      {
        if (oRs("notitie").Value != null)
        {
          return (outputmode == 0 ? toDateTimeString(oRs("notitiedatum").Value) : "");
        }
        else return "";
      }

      function fncolReferentie(oRs)
      {
        var kto_type = oRs("mld_melding_kto_type").Value;
        var kto_key = oRs("mld_melding_kto_key").Value || -1;
        if (kto_key > 0)
          return safe.html(mld.referentielabel(kto_type, kto_key));
        else
          return "";
      }

      function fncolLaatsteActieDatum(oRs)
      {
        var laatste_actie = new Date(oRs("recentdatum").Value);
        var laatstgewijzigd_opdr = oRs("laatstgewijzigd").Value != null? oRs("laatstgewijzigd").Value : new Date(1970, 0, 1);
        // Variabele laatste_actie/recentdatum heeft altijd een waarde (want er is altijd een MLDNEW tracking) en is altijd groter dan 1970.
        if (excel)
          return laatste_actie > laatstgewijzigd_opdr? laatste_actie : laatstgewijzigd_opdr;
        else
          return toDateString(laatste_actie > laatstgewijzigd_opdr? laatste_actie : laatstgewijzigd_opdr, excel);
      }
      function fncolLaatsteActieTijd(oRs)
      {
        var laatste_actie = new Date(oRs("recentdatum").Value);
        var laatstgewijzigd_opdr = oRs("laatstgewijzigd").Value != null? oRs("laatstgewijzigd").Value : new Date(1970, 0, 1);
        return toTimeString(laatste_actie > laatstgewijzigd_opdr? laatste_actie : laatstgewijzigd_opdr);
      }

      // Voor de FE-lijst wil ik tonen dat de FE aan zet is. Daar hoeft geen visueel onderscheid tussen alert en bij-FE zou je zeggen
      // Maar: de FE kan zelf om attentie gevraagd hebben en dan is daar terugkoppeling van gewenst, maar dan moet de actie ook bij BO liggen
      // Dan is attentie dus belangrijkst
      function fncolActiecode(oRs)
      {
        var actiecode = oRs("mld_melding_actiecode").Value;
        var res = "";

        if (frontend) { // FE ziet een signaal als de bal bij hem ligt
            if (actiecode & 256) { // Attentie bij FE
                if (outputmode == 0) {
                    res = "<span class='ac2' title='"+L("lcl_mld_actiecodeATT")+"'>"
                        + I("fa-bell fa-lg", { fastyle: "fas" })
                        + "</span>";
                } else {
                    res = L("lcl_mld_actiecodeATT");
                }
            } else if (actiecode & 2) { // Actie bij FE
                if (outputmode == 0) {
                    res = "<span class='ac2' title='"+L("lcl_mld_actiecodeFE")+"'>"
                        + I("fa-bell fa-lg", { fastyle: "fal" })
                        + "</span>";
                } else {
                    res = L("lcl_mld_actiecodeFE");
                }
            }
        } else { // FOBO
            if (outputmode == 0) {
                if (actiecode & 128) {
                    res = "<span class='ac128' title='"+L("lcl_mld_actiecodeATT")+"'>"
                        + I("fa-bell fa-lg", { fastyle: "fas" })
                        + "</span>";
                } else if (actiecode & 2) {
                    res = "<span class='ac2' title='"+L("lcl_mld_actiecodeFE")+"'>"
                        + I("fa-user-circle fa-lg", { fastyle: "fal" })
                        + "</span>";
                }
            } else {
                if (actiecode & 128) {
                    res = L("lcl_mld_actiecodeATT");
                } else if (actiecode & 2) {
                    res = L("lcl_mld_actiecodeFE");
                }
            }
        }
        return res;
      }

      function fncolFlags(oRs)
      {
        var mldkey = oRs("mld_melding_key").Value;
        var flagkey = oRs("mld_melding_flag").Value || 0;
        var ttl = L("lcl_mld_flag" + flagkey);
        var displ = "";

        if (print || excel)
        {
            if (flagkey != 0) displ = safe.html(ttl);  // else blijft-ie gewoon leeg
        }
        else  // maak er dan nog leuke plaatjes van
        {
            var flagIcon = "<span class='mldflag"+flagkey+" mlds'>" + I("fa-fclt-flag" + (flagkey == 0 ? "0" : "")) + "</span>"

            // Met hidden flagkey voor sortering. 999 zorgt dat bij 1 keer sorteren de gevlagde direct bovenaan staan
            displ = "<div " + ((urole == "bo" || urole == "fo") ? "class='clickParent' onclick='toggleMldFlag(event, "+ mldkey +");'":"")
                  + " title='"+safe.htmlattr(ttl)+"'>"
                  + "<span id='mldflagimg"+mldkey+"' flagkey='"+flagkey+"'>"+flagIcon+"</span>"
                  + "<span style='display:none'>"+(flagkey||999)+"</span></div>";
        }
        return displ;
      }

      function fnUitvoertijdTekst(oRs) {
        var result = "";
        if (oRs("mld_stdmelding_slabewaken").Value == 1) {
          if (oRs("uitvoertijd_eenheid").Value == "D") {
            result = oRs("uitvoertijd_tijdsduur").Value + " " + L("lcl_mld_days");
          } else {
            result = Math.round(oRs("uitvoertijd_tijdsduur").Value * 100) / 100 + " " + L("lcl_mld_hours");
          }
        }
        return result;
      }

      function fncolEindDatum(oRs)
      {
        if ((oRs("mld_stdmelding_planbaar").Value & 2) == 2)
            return "";

        if (oRs("mld_melding_parentkey").Value > 0)
            return L("lcl_mld_parent_status").format(oRs("mld_melding_parentkey").Value); // default leeg

        if (excel)
          return oRs("mld_melding_einddatum").Value;
        else
          return toDateString(oRs("mld_melding_einddatum").Value, excel); // excel noDay
      }

      function fncolEindTijd(oRs)
      {
        if ((oRs("mld_stdmelding_planbaar").Value & 2) == 2)
            return "";

        if (oRs("mld_melding_parentkey").Value > 0)
            return "";

        var result = "";
        if (oRs("uitvoertijd_eenheid").Value == "U" || (S("mld_show_endtime")==1 && oRs("mld_stdmelding_planbaar").Value == 0 && oRs("mld_stdmelding_planbaarfe").Value == 0))
        {
            if (toTimeString(oRs("mld_melding_einddatum").Value) != "00:00")
                result = toTimeString(oRs("mld_melding_einddatum").Value);
        }

        return result;
      }

      function fncolBehandelaar(oRs)
      {
        if (oRs("mld_melding_parentkey").Value > 0)
            return L("lcl_mld_parent_status").format(oRs("mld_melding_parentkey").Value); // default leeg

        return safe.html(oRs("behandelaar").Value);
      }

      function fncolBehandelaar2(oRs)
      {
        if (oRs("mld_melding_parentkey").Value > 0)
        {
            // Onderdrukken als hij al bij behandelaar staat (in geval van combine: true dus)
            var showBeh = minfo || (!(behandel_key_arr && behandel_key_arr.length) || print) && !(frontend && S("mld_fe_show_statusnames") == 0);
            return showBeh ? "" : L("lcl_mld_parent_status").format(oRs("mld_melding_parentkey").Value);
        }

        return safe.html(oRs("behandelaar2").Value);
      }

      function fncolSoortMelding(oRs)
      {
        var mldSoortMelding = safe.html(oRs("ins_discipline_omschrijving").Value + "/" + oRs("mld_stdmelding_omschrijving").Value);
        return mldSoortMelding;
      }

      function fncolSubject(oRs)
      {
        return " <span class='msb'>" +safe.html(oRs("mld_melding_onderwerp").Value) + "</span>";
      }

      var summaryParams = { status_oms: new Array(),
                            status_cnt : new Array()
                          };

      function fnsummaryCalc(oRs)
      {
        with (summaryParams)
        {
          var mldStatus = parseInt(oRs("mld_status").Value);
          var mldActiecode = oRs("mld_melding_actiecode").Value;
          var nrOrders = oRs("nrOrders").Value;
          var nrActief = oRs("nrActief").Value;

          var not_solved = (nrOrders > 0 && nrActief == 0 && backo && mldStatus == 4) || (mldStatus == 5 && (mldActiecode & 128) && S("mld_assume_ok_days") > 0);
          var mld_status = (not_solved? L("lcl_mld_not_solved") : mld.getmldstatustext(mldStatus)); // Vanwege performance functie "mld.getextendedmldstatustext" hier niet gebruikt.
          var order = (not_solved? 8 : mldStatus);

          if (status_oms[order])
          {
            status_cnt[order] = status_cnt[order] + 1;
          }
          else
          {
            status_oms[order] = mld_status;
            status_cnt[order] = 1;
          }
        }
        return;
      }

      function fnsummaryShow()
      {
        with (summaryParams)
        {
          status_row = "";
          status_row += (status_oms[0] != undefined ? status_oms[0] + "<span class='summary-badge'>" + status_cnt[0] + "</span>":"");
          status_row += (status_oms[2] != undefined ? status_oms[2] + "<span class='summary-badge'>" + status_cnt[2] + "</span>":"");
          status_row += (status_oms[3] != undefined ? status_oms[3] + "<span class='summary-badge'>" + status_cnt[3] + "</span>":"");
          status_row += (status_oms[4] != undefined ? status_oms[4] + "<span class='summary-badge'>" + status_cnt[4] + "</span>":"");
          status_row += (status_oms[8] != undefined ? status_oms[8] + "<span class='summary-badge'>" + status_cnt[8] + "</span>":"");
          status_row += (status_oms[7] != undefined ? status_oms[7] + "<span class='summary-badge'>" + status_cnt[7] + "</span>":"");
          status_row += (status_oms[5] != undefined ? status_oms[5] + "<span class='summary-badge'>" + status_cnt[5] + "</span>":"");
          status_row += (status_oms[6] != undefined ? status_oms[6] + "<span class='summary-badge'>" + status_cnt[6] + "</span>":"");
          status_row += (status_oms[1] != undefined ? status_oms[1] + "<span class='summary-badge'>" + status_cnt[1] + "</span>":"");
          //status_row = status_row.substr(2);
        }
        return status_row;
      }

      function fncolOpdrStatus(oRs)
      {
        return status.getopdrstatustext(oRs("mld_statusopdr_key").Value);
      }

      function fnendText()
      {
        var endText = "";
        if (no_old_closed_calls && !params.mld_key && !mld_key_arr.length)
          endText = L("lcl_newrows1") + S("mld_max_history") + L("lcl_newrows2");
        return endText;
      }

      var sum_satisfaction = 0;
      var aantal_oordeel = 0;
      function fntotalCalc(oRs)
      { // Totaal oordeel is alle cijfers opgeteld gedeeld door het aantal beoordelingen.
        if (oRs("oordeel").Value)
        {
          sum_satisfaction += oRs("oordeel").Value;
          aantal_oordeel++;
        }
      }

      function fntotalShow(column, nrlines)
      {
        function doOordeel(cnt_satisfaction, sum_satisfaction)
        {
          var result = cnt_satisfaction > 0? sum_satisfaction/cnt_satisfaction : 0;
          if (excel || print)
            result = (result!=0? safe.displayfloat(sum_satisfaction/cnt_satisfaction, 1) : "");
          else
            result = rater(result, {readonly: true});
          return result;
        }

        var result = "";
        switch (column.caption)
        {
          case L("lcl_bes_oordeel")      : result = doOordeel(aantal_oordeel, sum_satisfaction); break;
        }
        return result;
      }

      function fnOordeel(oRs)
      {
        var result = null;
        var displ_val = oRs("oordeel").Value;
        var displ_txt = oRs("oordeel_opm").Value;
        if (displ_val && displ_val != 0)
        {
          if (excel || print)
            result = "<span id='oordeel' title='" + safe.htmlattr(displ_txt)+"'>" + displ_val + "</span>";
          else
            result = rating.stars(displ_val, {rating: {id: "oordeel", note: displ_txt}});
        }
        return result;
      }

      function fnrowFlexParams(oRs)
      {
        var disc_key = oRs("ins_discipline_key").Value;
        var this_mld = mld.func_enabled_mld(disc_key, "D");
        var flexParams = {readman: this_mld.canMIread, readuse: this_mld.canFEread};

        return flexParams;
      }

      function fncolFlexBijlagen(oRs)
      {
        var flexval = oRs("flex").Value;
        var bijlagen_aantal = 0;
        if (bijlageflex)
        {
            var mld_key = oRs("mld_melding_key").Value;
            var bijlagen_oms = "";
            var bijlagen_lijst = [];

            var sql = "SELECT k.mld_kenmerk_key"
                    + "     , t.mld_srtkenmerk_omschrijving" // suspect
                    + "     , CASE"
                    + "       WHEN BITAND(k.mld_kenmerk_inlijst,1) = 1"
                      + "     THEN 1"
                      + "     ELSE 0"
                    + "       END in_overzicht_tonen"
                    + "  FROM mld_melding m"
                    + "     , mld_stdmelding s"
                    + "     , mld_srtkenmerk t"
                    + "     , mld_kenmerk k,"
                    + "       mld_discipline d"
                    + " WHERE m.mld_stdmelding_key = s.mld_stdmelding_key"
                    + "   AND s.mld_ins_discipline_key = d.ins_discipline_key"
                    + "   AND ((k.mld_stdmelding_key IS NULL AND k.mld_kenmerk_niveau = 'A')"
                      + "   OR (k.mld_stdmelding_key = s.mld_stdmelding_key AND k.mld_kenmerk_niveau = 'S')"
                      + "   OR (k.mld_stdmelding_key = s.mld_ins_discipline_key AND k.mld_kenmerk_niveau = 'D')"
                      + "   OR (k.mld_stdmelding_key = d.ins_srtdiscipline_key  AND k.mld_kenmerk_niveau = 'T'))"
                    + "   AND k.mld_srtkenmerk_key = t.mld_srtkenmerk_key"
                    + "   AND t.mld_srtkenmerk_kenmerktype = 'M'"
                    + "   AND k.mld_kenmerk_verwijder IS NULL"
                    + "   AND t.mld_srtkenmerk_verwijder IS NULL"
                    + "   AND m.mld_melding_key = " + mld_key;
            var oRs_k = Oracle.Execute(sql);

            while (!oRs_k.eof)
            {
                if (oRs_k("in_overzicht_tonen").Value == 1)
                {
                    var kenmerk_key = oRs_k("mld_kenmerk_key").Value;
                    var bijlagen_oms = oRs_k("mld_srtkenmerk_omschrijving").Value;  // suspect
                    var bestanden = flexProps("MLD", mld_key, kenmerk_key, "M", {getFiles: true});
                    var km_aantal = bestanden.files.length;
                    for (i=0; i<km_aantal; i++)
                    {
                        bijlagen_lijst.push(bestanden.files[i].name);
                    }
                    bijlagen_aantal += km_aantal;
                }
                oRs_k.MoveNext();
            }

            oRs_k.Close();
        }
        return (flexval ? safe.html(flexval.replace(/\r/g, "\n")+ "\n") : "")
             + ( bijlagen_aantal > 0
               ?   "<span title='" +  safe.htmlattr(bijlagen_lijst.join("\n"))  + "'>"
                 + safe.html(bijlagen_oms) + ": " + bijlagen_aantal
                 + "</span>"
               : ""
               );
      }


      var buttons = [];

      buttons.push({ icon: "fa-columns",  title: L("lcl_scf_columns"), action: "openColumns()"});
      // Als we een subframe onder ins_show_deel zijn dan vooralsnog hier geen toevoeg knop.
      // Misschien mag je dat namelijk helemaal niet voor dat object en daar staat wel een
      // toverstafje die veel nauwkeuriger werkt.
      if (!treat && canAdd && !params.deel_key && !params.deelsrtcont_key && !(params.mldgroup_key > 0 ))
      {
        var addurl = "appl/mld/mld_melding.asp?urole=" + (backo ? "fo" : urole);  // backo mag niet toevoegen
        if (params.srtdisc_key_arr.length === 1)
            params.srtdisc = params.srtdisc_key_arr[0];
        addurl += buildTransitParam(["srtdisc", "ins_key", "rsv_ruimte_key", "ref_key", "ref_type"], params);

        if (loc_key_arr.length == 1)
          addurl += "&loc_key=" + loc_key_arr[0];
        if (bld_key_arr.length == 1)
          addurl += "&bld_key=" + bld_key_arr[0];
        if (flr_key_arr.length == 1)
          addurl += "&flr_key=" + flr_key_arr[0];
        if (room_key_arr.length == 1)
          addurl += "&room_key=" + room_key_arr[0];

        buttons.push({ icon: "fa-plus", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + safe.jsstring(L("lcl_add")) + "')" });
      }
      buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
      if (!frontend)
        buttons.push({ icon: "fa-list-ul",  title: L("lcl_mld_legenda"), action: 'openLegenda()' });

      if ((behandel_key_arr && behandel_key_arr.length == 1) || (disc_key_arr.length == 1)) { // als ik filter op 1 behandelaar en/of 1 vakgroep (discipline).
        var calendarurl = "appl/shared/fullcalendar.asp?worker=mldlist"
                        + (behandel_key_arr && behandel_key_arr.length == 1? "&bk=" + behandel_key_arr[0] : "")
                        + (disc_key_arr.length == 1? "&disc=" + disc_key_arr[0] : "")
                        + (stdm_key_arr.length == 1? "&stdm=" + stdm_key_arr[0] : "");
        buttons.push({ icon: "fa-calendar", title: L("lcl_calendar"), action: "FcltMgr.openDetail('" + calendarurl + "', '" + safe.jsstring(L("lcl_mld_melding_lopende")) + "')" });
      }

      // Heb toegang tot de inline opdrachten details?
      var authparamsORDBOF = user.checkAutorisation("WEB_ORDBOF", true);
      var authparamsEXTORD = user.checkAutorisation("WEB_EXTORD", true);
      var authparamsORDBO2 = user.checkAutorisation("WEB_ORDBO2", true);
      // Je moet rechten hebben om opdrachten te mogen zien, maar fe krijgt bij het openklappen toch nooit
      // iets te zien, dus kan dat dan beter weg. Alternatief dat bij nrOrders het mogen zien door de fe
      // meebeschouwt, maar daar zijn ook andere zaken van afhankelijk (bv. Niet Opgelost) dus dat zo maar niet
      var accessOpdr = (authparamsORDBOF || authparamsEXTORD || authparamsORDBO2) && !frontend;

      if (treat)
        var rst = new ResultsetTable({ keyColumn: "mld_melding_key",
                                       sql: sqln,
                                       ID: "treatmenttable",
                                       tabs_code: "treat_list-" + urole,
                                       flexModule: "MLD",
                                       flexId: "mld_melding_key",
                                       flexGroupId: "mld_stdmelding_key", // Kenmerken zijn ook op stdmelding niveau gedefinieerd
                                       flexParentGroupId: "ins_discipline_key", // Kenmerken zijn ook op stdmelding niveau gedefinieerd
                                       flexChangeNiveau: "S", // Niveau voor extra headers (met kenmerken) in excel
                                       flexParams: (urole=="fe" && (print || excel)) ? fnrowFlexParams : null,
                                       filterParams: params,
                                       outputmode: outputmode,
                                       title: (params.mldgroup_key > 0 ? L("lcl_mld_groeperingmeldingen") : L("lcl_complains")),
                                       endText: fnendText,
                                       showAll: showall,
                                       buttons: buttons
                                      });
      else
        var rst = new ResultsetTable({ keyColumn: "mld_melding_key",
                                       sql: sqln,
                                       ID: "complainstable",
                                       tabs_code: "mld_list-" + urole,
                                       rowClass: mldlist.fnrowClass,
                                       rowData: fnrowData,
                                       disableInlineActions: S("inline_actions_mld") == 0 || tiny && (S("inline_actions_mld") & 2),
                                       rowActionEnabler: (urole=="fo" || urole =="bo") ? fnrowActionEnabler : null,
                                       multiActionEnabler: (urole=="fo" || urole =="bo") ? fnmultiActionEnabler : null,
                                       flexModule: "MLD",
                                       flexId: "mld_melding_key",
                                       flexGroupId: "mld_stdmelding_key", // Kenmerken zijn ook op stdmelding niveau gedefinieerd
                                       flexParentGroupId: "ins_discipline_key", // Kenmerken zijn ook op stdmelding niveau gedefinieerd
                                       flexChangeNiveau: "S", // Niveau voor extra headers (met kenmerken) in excel
                                       flexParams: (urole=="fe" && (print || excel)) ? fnrowFlexParams : null,
                                       filterParams: params,
                                       outputmode: outputmode,
                                       title: (params.mldgroup_key > 0 ? L("lcl_mld_groeperingmeldingen") : L("lcl_complains")),
                                       inlineDetails: accessOpdr ? "inlineOrdersUrl" : null,
                                       hasInlineDetails: accessOpdr ? fnHasOrders : null,
                                       inlineDetailsChanged: accessOpdr ? true : false,
                                       summaryCalc: fnsummaryCalc,
                                       summaryShow: fnsummaryShow,
                                       endText: fnendText,
                                       showAll: showall,
                                       buttons: buttons,
                                       totalCalc: fntotalCalc,
                                       totalShow: fntotalShow
                                      });

      rst.addAction({ action: "mld_edit", caption: L("lcl_edit"), isDefault: true } ); // Deze 'altijd'
      if (treat)
      {
        rst.addColumn(new Column({caption: L("lcl_mld_number"), datatype: "number", content: fncolKey, colName: "fncolKey" }));
        rst.addColumn(new Column({caption: L("lcl_mld_meldinggroep"), content: "mld_stdmeldinggroep_naam"}));
        rst.addColumn(new Column({caption: L("lcl_vakgroup"), content: "ins_discipline_omschrijving", combine: false}));
        rst.addColumn(new Column({caption: L("lcl_mld_complain"), content: "mld_stdmelding_omschrijving", combine: true }));
        rst.addColumn(new Column({caption: L("lcl_mld_subject"), content: fncolSubject, colName: "fncolSubject", thClass: "sorttable_alpha"}));
        for (var i = 0; i < kenm.key.length; i++)
        {
          rst.addColumn(new Column({caption: String(kenm.omschr[i]),
                                    content: fnfnHandled(String(kenm.key[i])),
                                    colName: "fnfnHandled_" + String(kenm.key[i]),
                                    tdClass: fnfncolClass(String((kenm.key[i])))
                                   }));
        }
        rst.addColumn(new Column({caption: L("lcl_mld_progress"), content: fnfnProgress, colName: "fnfnProgress", colText: L("lcl_mld_progress"), align: "center"}));
      }
      else
      {
        rst.addColumn(new Column({caption: (outputmode == 0? I("fa-bell", { fastyle: "fas" }) : L("lcl_mld_actiecode")), content: fncolActiecode, colName: "fncolActiecode", colText: L("lcl_mld_actiecode"), align: "center"}));
        if (S("mld_melding_flags") > 0 && (!frontend || (frontend && S("fac_flags_visible_for_fe") == 1)))
          rst.addColumn(new Column({caption: (outputmode == 0? I("fa-fclt-flag0") : L("lcl_mld_flags")), content: fncolFlags, colName: "fncolFlags", colText: L("lcl_mld_flags"), align: "center"}));
        rst.addColumn(new Column({caption: (outputmode == 0? I("fa-triangle-exclamation") : L("lcl_mld_urg")), content: fncolSpoed, colName: "fncolSpoed", colText: L("lcl_mld_urg"), hasActions: true}));
        rst.addColumn(new Column({caption: L("lcl_mld_number"), datatype: "number", content: fncolKey, colName: "fncolKey" }));
        if (anyexternnr)
          rst.addColumn(new Column({caption: L("lcl_mld_externr"), content: "mld_melding_externnr", combine: true }));
        if (!frontend && anygrdisc)
          rst.addColumn(new Column({caption: L("lcl_mld_groep"), content: "mldgroup_prefix", align: "center" }));
        if (!frontend)
          rst.addColumn(new Column({caption: L("lcl_mld_meldinggroep"), content: "mld_stdmeldinggroep_naam"}));
        if (!minfo)
        {
          rst.addColumn(new Column({caption: L("lcl_vakgroup"), content: "ins_discipline_omschrijving", combine: false}));
          if (!tiny) // In tiny we show the stdm with the subject
              rst.addColumn(new Column({caption: L("lcl_mld_complain"), content: "mld_stdmelding_omschrijving", combine: true }));
        }
        rst.addColumn(new Column({caption: L("lcl_mld_date"), content: "mld_melding_datum", datatype: "date", nowrap: true}));
        rst.addColumn(new Column({caption: L("lcl_time"), combine: true, content: "mld_melding_datum", colName: "mld_melding_tijd", datatype: "time", nowrap: true, nomidnight: true}));
        if (minfo)
        {
          rst.addColumn(new Column({caption: L("lcl_region"), content: "alg_regio_omschrijving", purpose: PRINTING_ONLY}));
          rst.addColumn(new Column({caption: L("lcl_district"), content: "alg_district_omschrijving"}));
        }
        if (anygeo) {
          if (loc_key_arr.length != 1) rst.addColumn(new Column({caption: L("lcl_location"), content: "alg_locatie_code"}));
          if (bld_key_arr.length != 1) rst.addColumn(new Column({caption: L("lcl_bld_terra"), content: fncolGebouwTerrein, colName: "fncolGebouwTerrein"}));
          if (anydetailedgeo)
          {
            if (flr_key_arr.length != 1) rst.addColumn(new Column({caption: L("lcl_floor"), content: fncolVerdieping, colName: "fncolVerdieping"}));
            if (room_key_arr.length != 1) rst.addColumn(new Column({caption: L("lcl_room"), content: fncolRuimte, colName: "fncolRuimte", nowrap: true}));
          }
          rst.addColumn(new Column({caption: L("lcl_place"), content: "plaatsmelding"}));
        }
        if (anyins) {
          rst.addColumn(new Column({caption: L("lcl_mld_nr_objects"), content: fncolObject, colName: "fncolObject", combine: anygeo}));
        }

        // even 2 printonly kolommen tussendoor
        if (S("mld_print_loc_address") == 1) {
          rst.addColumn(new Column({caption: L("lcl_prs_address_bezoek_adres"), content: "alg_locatie_adres", purpose: PRINTING_ONLY}));
          rst.addColumn(new Column({caption: L("lcl_prs_address_bezoek_plaats"), content: "alg_locatie_plaats", purpose: PRINTING_ONLY}));
        }
        if (minfo)
          rst.addColumn(new Column({caption: L("lcl_complain"), content: fncolSoortMelding, colName: "fncolSoortMelding", purpose: PRINTING_ONLY}));

        rst.addColumn(new Column({caption: L("lcl_mld_subject"), content: fncolSubject, colName: "fncolSubject", thClass: "sorttable_alpha"}));
        if (tiny)  // In tiny we show the stdm with the subject
          rst.addColumn(new Column({caption: L("lcl_mld_complain"), content: "mld_stdmelding_omschrijving", combine: true }));
        else // In tiny we prefer subject-only, unless our subject is empty
          rst.addColumn(new Column({caption: L("lcl_txt"), content: "mld_melding_omschrijving", combine: true}));
        if (S("mld_print_loc_address") == 2 || S("mld_print_loc_address") == 3)
        {
            rst.addColumn(new Column({caption: L("lcl_prs_address_bezoek_adres"), content: "alg_locatie_adres", combine: false}));
            if (S("mld_print_loc_address") == 2)
                rst.addColumn(new Column({caption: L("lcl_estate_gebouw_man_name"), content: "alg_gebouw_naam", combine: true}));
            else
                rst.addColumn(new Column({caption: L("lcl_prs_address_bezoek_plaats"), content: "alg_locatie_plaats", combine: true}));
        }
        if (minfo)
        {
          rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: fncolBehandelaar, colName: "fncolBehandelaar"}));
          rst.addColumn(new Column({caption: L("lcl_behandelgegevens"), content: "mld_melding_opmerking"}));
          if (mldlist.anybeh)
          {
            rst.addColumn(new Column({caption: L("mld_processing_group"), content: "behandelteam"}));
            rst.addColumn(new Column({caption: L("lcl_mld_processor"), content: fncolBehandelaar2, colName: "fncolBehandelaar2", combine: true}));
          }
        }
        // Meldernaam werd niet getoond bij FE, nieuw, en handig met collegas
        rst.addColumn(new Column({caption: L("lcl_caller"), content: "melder"}));
        // Behandelaar hoeft niet met de tooltip van de status getoond te worden. De behandelaar wordt wel in een kolom getoond indien het nodig is.
        rst.addColumn(new Column({caption: L("lcl_mld_status"), content: fncolStatus, colName: "fncolStatus"}));
        if (!frontend)
          rst.addColumn(new Column({caption: L("lcl_mld_note"), content: "notitie", colName: "fncolNote", combine: outputmode == 0, tooltip: (outputmode == 0 && !frontend? fncolNoteTooltip : null)}));
        if (backo)
        {
          // Als er geen meldingen zijn met een referentie, dan heeft deze kolom geen zin en wordt het niet getoond.
          var refsql = mld.reference_sql();
          var ref_oRs = Oracle.Execute(refsql);
          if (!ref_oRs.eof)
            rst.addColumn(new Column({caption: L("lcl_mld_kto"), content: fncolReferentie, colName: "fncolReferentie"}));
          ref_oRs.Close();
        }
        if (!minfo)
        {
          rst.addColumn(new Column({caption: L("lcl_behandelgegevens"), content: "mld_melding_opmerking"}));

          // als de frontend bij de statusinfo niet mag zien Wie het doet, mag die hier ook niet de behandelaar zien
          if (!(frontend && S("mld_fe_show_statusnames") == 0))
            rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: fncolBehandelaar, colName: "fncolBehandelaar", combine: (params.mldgroup_key > 0 ? true : false)}));

          if (mldlist.anybeh)
          {
            rst.addColumn(new Column({caption: L("mld_processing_group"), content: "behandelteam"}));
            if (!(frontend && S("mld_fe_show_statusnames") == 0))
                rst.addColumn(new Column({caption: L("lcl_mld_processor"), content: fncolBehandelaar2, colName: "fncolBehandelaar2", combine: true }));
          }
          if (anySla) {
            rst.addColumn(new Column({caption: L("lcl_mld_stduitvoer"), content: fnUitvoertijdTekst, colName: "fnUitvoertijdTekst", nowrap: true }));
          }
          rst.addColumn(new Column({caption: L("lcl_mld_actiondate"), content: "mld_melding_actiedatum", datatype: "date", nowrap: true}));
          rst.addColumn(new Column({caption: L("lcl_end_date_plan"), content: fncolEindDatum, colName: "fncolEindDatum", datatype: "date", nowrap: true}));
          rst.addColumn(new Column({caption: L("lcl_time"), content: fncolEindTijd, colName: "fncolEindTijd", datatype: "time", nowrap: true, combine: true }));
          rst.addColumn(new Column({caption: L("mld_melding_tag_naam"), content: "mld_melding_tag_naam", nowrap: true}));
          rst.addColumn(new Column({caption: L("mld_melding_tag_einddatum"), content: "mld_melding_tag_datum_tot", datatype: "date", nowrap: true, showDefault: false }));
        }
        else // if (minfo)
        {
          rst.addColumn(new Column({caption: L("lcl_prs_organisatie"), content: "organisatie"}));
          rst.addColumn(new Column({caption: L("lcl_account"), content: "kostenplaats" }));
          rst.addColumn(new Column({caption: L("lcl_mld_oordeel"), content: fnOordeel, colName: "fnOordeel", datatype: "float", decimals: 1, total: true}));
          if (excel || print)
            rst.addColumn(new Column({caption: L("lcl_fac_like_remark"), content: "oordeel_opm"}));
        }

        if (anyflex)
        {
          rst.addColumn(new Column({caption: flexlabel, content: fncolFlexBijlagen, colName: "fncolFlexBijlagen" }));
        }

        // laatste actiedatum
        if (!frontend)
        {
          rst.addColumn(new Column({caption: L("lcl_mld_laatste_actie"), content: fncolLaatsteActieDatum, colName: "fncolLaatsteActieDatum", datatype: "date", nowrap: true}));
          rst.addColumn(new Column({caption: L("lcl_time"), content: fncolLaatsteActieTijd, colName: "fncolLaatsteActieTijd", datatype: "time", nowrap: true, combine: true}));
        }

        /* de mogelijke acties */
        var multiActions = !tiny || params.mldgroup_key > 0;
        if ((urole=="fo" || urole =="bo") && !params.full) // dan hebben we fnrowActionEnabler aangezet
        {
          rst.addAction({ action: "mld_reject", caption: L("lcl_reject"), enabler:"eReject", multi: multiActions, multiOnce: true } );
          if (S("mld_melding_close") == 0)  // als ik dit via de enabler doe, heb ik em multi nog steeds
            rst.addAction({ action: "mld_close", caption: L("lcl_close"), enabler:"eClose", multi: multiActions, multiOnce: true } );
          rst.addAction({ action: "mld_accept", caption: L("lcl_mld_accept"), enabler:"eAccept", multi: multiActions, multiOnce: true } );
          rst.addAction({ action: "mld_continue", caption: L("lcl_mld_continuation"), enabler: "eContinue", multi: multiActions, multiOnce: true } );
          // Eén van beiden, eEmptyRequiredFields of eForward, is true.
          rst.addAction({ action: "mld_forward_disc", caption: L("lcl_mld_forward_disc"), enabler: "eForward" } );
          rst.addAction({ action: "mld_forward_empty", caption: L("lcl_mld_forward_disc"), enabler: "eEmptyRequiredFields" } );
          // eForward & eForwardTeam niet mutually exclusive
          rst.addAction({ action: "mld_forward_team", caption: L("lcl_mld_forward_team"), enabler: "eForwardTeam" } );
          rst.addAction({ action: "mld_group", caption: L("lcl_groeperen"), enabler:"eGroup", multi: multiActions, multiOnce: true } );

          rst.addAction({ action: "mld_terugzet", caption: L("lcl_terugzet"), enabler: "eTerugzet", multi: multiActions, multiOnce: true } );
          rst.addAction({ action: "mld_doorzet", caption: L("lcl_doorzet"), enabler: "eDoorzet", multi: multiActions, multiOnce: true } );
          rst.addAction({ action: "mld_verwerk", caption: L("lcl_mld_verwerk"), enabler: "eVerwerk", multi: multiActions, multiOnce: true } );
          rst.addAction({ action: "mld_herplan", caption: L("lcl_reschedule"), enabler: "eHerplan",  multi: multiActions, multiOnce: true });
          rst.addAction({ action: "mld_kenmerk", caption: L("lcl_properties"), enabler: "eKenmerk", multi: multiActions, multiOnce: true } );
        }
      }

      var cnt = rst.processResultset();

if (!excel && !print)
{%>
      <!-- LEGENDA  -->
    <script type="text/javascript">
<%    if (Request.ServerVariables("REQUEST_METHOD") == "POST") { %>
        if (FcltMgr._frmaccessible(parent) && FcltMgr._safe_parent() !== window && typeof parent.window.doSubmit === "function") {
          var fnReloadByPost = parent.window.doSubmit.bind(null, 0);
        }
<%    } %>
        $(function() {
          $(".clickParent").parent().on("click", function(e) { e.stopPropagation(); $(this).find("> .clickParent").trigger("click"); });
        });

        function openLegenda()
        {
            var myPosition = "right top+30";
            if (elems.$originalHeaderRow && elems.$originalHeaderRow.length)
                myPosition = "right-15 top+"+(parseInt(elems.$fcltFrameHeader.css("top"))+30);
            params = { width: 250,
                       minWidth: 250,
                       minHeight: 10,
                       resizable: false,
                       position: {my: "right top", at: myPosition},
                       title: L("lcl_mld_legenda"),
                       create: FcltMgr.fnCreateCloseButton("div#legenda")
                     };
		        $('div#legenda').dialog(params).dialog('open');
            FcltMgr.resized();
        }
    </script>

    <%=mldlist.legendaHtml({ treat: treat, anyorders: mldlist.anyorders })%>
<% } %>
    </body>
  </html>
<%
}
%>
