<% /*
     $Revision$
     $Id$

    File:        opdr_list.inc
    Description: Definieert de serverside functie opdr_list() die een lijst van opdrachten toont die
                 voldoen aan de gegeven parameters/criteria.
                 Zoals altijd wordt hierbij wel autorisatie betrokken,
                 maar verder geen contextafhankelijke zaken; dat behoort de aanroeper te doen.
    Parameters:  -
    Context:     Word sinds 5.3.1 ook gebruikt vanuit Maninfo als je groepering 2 (opdrachten)
                 of 16 (opdrachten-->kosten) kiest. Overigens is deze laatste geen andere groepering maar
                 toont hij alleen iets meer kolommen dan 2
    Note:        -
*/ %>

<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="../Shared/status.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../MLD/mld.inc" -->
<!-- #include file="../Shared/flexfiles.inc" -->

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

function opdr_list(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.print         : true | false
  // params.excel         : true | false
  // params.cnt_key       : key
  // params.bes           : true | false
  // params.offerte(s)    : -1, 0 or 1

  // params.withflex      : boolean


  // if a parameter has a value of -1, then it is assumed not to be set and to be ignored.

  ///     Deze functie toont de opdrachten, en kan op diverse manieren gebruikt worden:
  ///
  ///     a. als overzicht van opdrachten die IK uit moet voeren (En kan aanpassen en afmelden).
  ///        urole == 'fe', interne uitvoerder
  ///
  ///     b. als overzicht van opdrachten die decentraal door mij afgehandeld kunnen worden
  ///        urole=b2, interne uitvoerder decentraal of externe uitvoerder
  ///        dit zijn dan opdrachten met opdrachttype.decentraal = 1 die binnen mijn WEB_ORDBOF scope vallen
  ///        (melding.ins_discipline: afdeling in PRS scope en plaats in ALG scope)
  ///
  ///     c. als overzicht van opdrachten die centraal door mij beheerd (ingevoerd en/of afgemeld) kunnen worden
  ///        urole == 'bo'
  ///        dit zijn opdrachten die binnen mijn WEB_ORDBOF scope vallen
  ///        Om een opdracht te kunnen maken moet de melding aan mijn MLDBOF [en ORDBOF] scope voldoen
  ///        de minima van beides scope gelden hier dan
  ///
  ///     d. tiny: Als passief overzicht (geen event op rows) van opdrachten behorende bij melding, geen headers en dergelijke
  ///        inline: samen met tiny: Dit is een inline overzicht, Samen met tiny, ook geen headers en dergelijke
  ///

  var urole = params.urole;
  var fronto = (urole == "fo");
  var backo = (urole == "bo");
  var frontend  = (urole == "fe");

  // 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 mld_key = params.mld_key;
  var contract = params.contract
  var cnt_key = params.cnt_key;
  var ks_key = params.ks_key;
  var intopdr_key = params.intopdr_key;
  // Er kunen twee contract keys meegegeven worden. Een extra contract key die bij contract hoort.
  // Als cnt_key en contract_key verschillen kun het nooit een resultaat opleveren
  if (contract > 0)
    cnt_key = cnt_key + (cnt_key != ""? ", " : "") + contract;

  var bes = params.bes;
  var tiny = params.tiny;
  var inline = params.inline;
  //var justClose = params.justClose;

  var mldstpen = params.mldstpen;
  var mldstnew = params.mldstnew;
  var mldstacc = params.mldstacc;
  var mldstuit = params.mldstuit;
  var mldstrej = params.mldstrej;
  var mldstafm = params.mldstafm;
  var mldstver = params.mldstver;
  var mldnieto = params.mldnieto;
  var mldopdrstrej = params.mldopdrstrej;
  var mldopdrstnak = params.mldopdrstnak;
  var mldopdrsttfi = params.mldopdrsttfi;
  var mldopdrstfia = params.mldopdrstfia;
  var mldopdrstuit = params.mldopdrstuit;
  var mldopdrstafm = params.mldopdrstafm;
  var mldopdrstver = params.mldopdrstver;
  var mldopdrstacp = params.mldopdrstacp;
  var mldopdrstafr = params.mldopdrstafr;
  var mldopdrstgoe = params.mldopdrstgoe;

  var showstatus = "";
  if (mldstpen)  showstatus = (showstatus == ""? "" : showstatus + ",") + "0";
  if (mldstrej)  showstatus = (showstatus == ""? "" : showstatus + ",") + "1";
  if (mldstnew)  showstatus = (showstatus == ""? "" : showstatus + ",") + "2";
  if (mldstacc)  showstatus = (showstatus == ""? "" : showstatus + ",") + "4";
  if (mldstafm)  showstatus = (showstatus == ""? "" : showstatus + ",") + "5";
  if (mldstver)  showstatus = (showstatus == ""? "" : showstatus + ",") + "6";
  if (mldstuit)  showstatus = (showstatus == ""? "" : showstatus + ",") + "7";
  if (mldnieto)  showstatus = (showstatus == ""? "" : showstatus + ",") + "99";
  var from_mld = (showstatus != "");
  params.showstatus = showstatus;
  params.from_mld = from_mld;

  var showopdrstatus = "";
  if (mldopdrstrej) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "1";
  if (mldopdrstnak) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "2";
  if (mldopdrsttfi) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "3"; // Verderop wordt wel bepaald of 'b2' status 3 mag zien
  if (mldopdrstfia) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "4";
  if (mldopdrstuit) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "5";
  if (mldopdrstafm) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "6";
  if (mldopdrstver) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "7";
  if (mldopdrstacp) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "8";
  if (mldopdrstafr) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "9";
  if (mldopdrstgoe) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "10"; // Verderop wordt wel bepaald of 'b2' status 10 mag zien
  params.showopdrstatus = showopdrstatus;
  params.mldopdrstrej = mldopdrstrej;
  params.mldopdrstafm = mldopdrstafm;
  params.mldopdrstver = mldopdrstver;

  var groepering_key = params.groepering_key; // Voor maninfo. 2 en 16 ondersteund

  params.uitvoerder = false;
  if (frontend)
  {
    // Dan zijn het alleen opdrachten van *mijn* meldingen waarop ik MLDUSE-read rechten heb
    // en van het type waarbij mld_typeopdr_zichtbaarfe = 1  als ik een mld_key heb
    // Omdat uitsluitend vanuit subframe van mld_melding wordt aangeroepen in deze mode veronderstellen we dat geregeld.
    // OF het zijn de opdrachten waarvan ik uitvoerende ben (MLDORD)
    if (params.mld_key)
        var pautfunction = "WEB_MLDUSE";
    else
    {
        var pautfunction = "WEB_MLDORD";
        params.uitvoerder = true;
    }
  }
  else if (from_mld)
    var pautfunction = ["WEB_EXTORD","WEB_ORDBO2","WEB_ORDBOF"];
  else if (urole == 'b2')
    var pautfunction = ["WEB_EXTORD","WEB_ORDBO2"];
  else if (urole == 'bgt')
    var pautfunction = "WEB_BGTORD";
  else
    var pautfunction = "WEB_ORDBOF";

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

  // Even een simplistische 'ben ik -externe- uitvoerder'-check
  var exhandler = urole == "b2" && !(user.checkAutorisation("WEB_ORDBO2", true)) && user.iamContact();

  var mld_melding = { isTemplate: false };
  if (mld_key)
  { // Bestaat de gezochte melding?
    var sql = "SELECT '1' FROM mld_melding WHERE mld_melding_key = " + mld_key;
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    { // Melding bestaat. Dan kan de info opgevraagd worden.
      mld_melding = mld.mld_melding_info(mld_key);
      srtdisc_key = mld_melding.srtdisc_key;
      lcl.set_dialect(srtdisc_key, "MLD_SRTDISCIPLINE_KEY");
      // Moet hier eigenlijk niet ook gecontroleerd worden of ik de opdrachten van deze melding wel mag zien?
      // var this_mld = mld.func_enabled_melding(mld_key, {verynew: verynew}); // Wat heb ik zoal aan rechten op deze specifieke melding
      // var hasFOBOread = this_mld.canFOread || this_mld.canBOread;
    }
    oRs.Close();
    // Als de melding een fac_activiteit_key heeft dan is de melding een sjabloon of een geplande actie.
    if (mld_melding.act_key > -1)
    {
      var sql = "SELECT fac_activiteit_eenheid"
              + "  FROM fac_activiteit"
              + " WHERE fac_activiteit_key = " + mld_melding.act_key;
      var oRs = Oracle.Execute(sql);
      mld_melding.isTemplate = (oRs("fac_activiteit_eenheid").Value == 5);
      oRs.Close();
    }
  }
  params.isTemplate = mld_melding.isTemplate;

  if (params.withflex && !excel && !print)
  {
    // Fast check to see if we have any listable flex at all, to prevent superfluous empty column
    var sql = "SELECT 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
            +"    AND sk.mld_srtkenmerk_key = k.mld_srtkenmerk_key"
            +"    AND k.mld_kenmerk_niveau IN ('P', 'O')"
            +"    AND k.mld_kenmerk_verwijder IS NULL"
            +"    AND sk.mld_srtkenmerk_verwijder IS NULL";
    var oRs = Oracle.Execute(sql);
    params.anyflex = !oRs.eof;
    if (params.anyflex)
    {
        params.multiflex = false;
        params.bijlageflex = (oRs("mld_srtkenmerk_kenmerktype").Value == "M");
        var flexlabel = oRs("mld_kenmerk_omschrijving").Value;
        oRs.MoveNext();
        if (!oRs.Eof)
        {
            params.multiflex = true;
            flexlabel = L("lcl_flexlist");

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

  // We really need to suppress columns that are obviously irrelevant for this configuration
  // Fast check to see if we have anything to do with geographics
  var algsql= "SELECT COUNT(*) FROM ins_srtdiscipline WHERE ins_srtdiscipline_alg > 0 AND ins_srtdiscipline_verwijder IS NULL";
  var algoRs = Oracle.Execute(algsql);
  var anyalg = algoRs(0).value > 0;
  algoRs.close();

  // Fast check to see if we have just one opdrachttype
  var otsql= "SELECT COUNT(*) FROM mld_typeopdr";
  var otoRs = Oracle.Execute(otsql);
  var singleOT = otoRs(0).value == 1;
  otoRs.close();

  // Fast check to see if we have any vakgroeptypes
  var inssql = "SELECT 1 FROM ins_srtdiscipline WHERE ins_srtdiscipline_ins = 1"
      + (srtdisc_key > 0 ? " AND ins_srtdiscipline_key = " + srtdisc_key : "")
      + " AND ROWNUM = 1 AND ins_srtdiscipline_verwijder IS NULL";
  var insoRs = Oracle.Execute(inssql);
  params.anyins = !insoRs.eof;
  insoRs.close();

  // Fast check to see if we are using 'urenregistratie'
  var opdrtypesql = "SELECT COUNT(*) aantal"
                  + "  FROM mld_typeopdr"
                  + " WHERE mld_typeopdr_uren IN (3, 4, 5)";
  var opdrtypeoRs = Oracle.Execute(opdrtypesql);
  params.includeHours = opdrtypeoRs("aantal").Value > 0;
  opdrtypeoRs.Close();

%>
  <html>
    <head>
<%
      if (!params.inline)
        FCLTHeader.Generate({ outputmode: params.outputmode });
%>
      <script type="text/javascript">
        // Text strings used by opdr_list.js
        var urole = "<%=urole%>";
        var mld_key = "<%=mld_key%>";
        var opdr_key = "<%=params.opdr_parent_key%>";
        var setting_mld_accept_confirm = <%=S("mld_accept_confirm")?1:0%>;
      </script>
    </head>

    <body id="listbody">
<%
      var prefix = ';-)';  // even if no result it must have a value

      var sql = mld.getopdroverzicht_sql(pautfunction, params);

      var status_oms = new Array();
      var status_cnt = new Array();

      /**********************************
       * Callback functies ResultsetTable
       *********************************/
      var recent = new Date();
      recent.setMinutes(recent.getMinutes() - S("mld_opdracht_recent"));
      function fnrowClass(oRs)
      {
        if (mld_melding.isTemplate)
        { // Geen class zetten bij sjablonen
          class1 = "";
        }
        else
        {
          if (oRs("mld_opdr_einddatum").Value > oRs("nu").Value ||
              oRs("mld_statusopdr_key").Value == 1 ||
              oRs("mld_statusopdr_key").Value == 2 ||
              oRs("mld_statusopdr_key").Value == 6 ||
              oRs("mld_statusopdr_key").Value == 7 ||
              oRs("mld_statusopdr_key").Value == 9)
          { // Alleen open opdrachten kunnen een rode kleur krijgen.
            class1 = "";
          }
          else
          {
            class1 = " expired2";
          }

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

          if (laatstgewijzigd > laatstgezien)
          {
            class1 += " recentlychangedopdr";
          }
        }
        return class1;
      }

      // Extra data voor de client om daar dynamisch buttons te kunnen activeren.
      function fnrowData(oRs)
      {
        var mldKey = oRs("mld_melding_key").Value;
        var mldPrefix = oRs("ins_srtdiscipline_prefix").Value ? oRs("ins_srtdiscipline_prefix").Value : "";
        var mldVolgnr = oRs("mld_opdr_bedrijfopdr_volgnr").Value;
        var act_key = oRs("mld_action").Value || -1;
        var opdrKey = oRs("mld_opdr_key").Value;

        var data = {mldKey: mldKey, mldPrefix: mldPrefix, mldVolgnr: mldVolgnr, act_key: act_key, opdrKey: opdrKey};

        return JSON.stringify(data);
      }

      // Opdracht rechten.
      var my_mldrechten = user.func_enabled("MLD");
      var canWriteORDBOF = my_mldrechten.canWrite("WEB_ORDBOF");
      var canReadORDBOF = my_mldrechten.canRead("WEB_ORDBOF");
      var canWriteORDAFR = my_mldrechten.canWrite("WEB_ORDAFR");
      var canWriteEXTORD = my_mldrechten.canWrite("WEB_EXTORD");
      var canWriteORDBO2 = my_mldrechten.canWrite("WEB_ORDBO2");
      // Factuur rechten.
      var authparamsEXTORD = user.checkAutorisation("WEB_EXTORD", true);
      var authparamsEXTFIN = user.checkAutorisation("WEB_EXTFIN", true);
      var authparamsFINFOF = user.checkAutorisation("WEB_FINFOF", true);
      var authparamsFINBOF = user.checkAutorisation("WEB_FINBOF", true);
      var authparamsMLDFIN = user.checkAutorisation("WEB_MLDFIN", true);
      // Alleen ALGreadlevel en ALGwritelevel van belang want fac_functie_min_level = 3 (lezen en schrijven plaats)
      var hasAddFactuurRightsFINFOF = (authparamsFINFOF && authparamsFINFOF.ALGwritelevel < 9);
      var hasListFactuurRights = ((user.iamContact() && authparamsEXTFIN) ||
                                  authparamsFINFOF ||
                                  authparamsFINBOF ||
                                  user.isBudgethouder() ||
                                  authparamsMLDFIN);

      function fnrowActionEnabler(oRs)
      {
        var o_stat = oRs("mld_statusopdr_key").Value;

        eAdd = (urole == "bo") && canWriteORDBOF /* && TODO melding binnen scope daarvan maar dat maakt de query erg ingewikkeld */;

        var eClose  = (o_stat == 5 || o_stat == 8) && authparams.ALGwritelevel < 9;

        // Een afmelder (EXTORD of ORDBO2) mag externe opdrachten afmelden onder bepaalde voorwaarden:
        // EXTORD: Hij mag opdrachten zien/afmelden van externe bedrijven waar hij contactpersoon van is,
        //         als hij ALG read/write rechten (WEB_EXTORD) heeft op de plaats van de bijbehorende melding van de opdracht.
        // ORDBO2: Setting mld_typeopdr_afmelden_extern: Afmelder (ORDBO2) mag externe opdrachten (0=Niet zien, 1=Zien, 2=Afmelden)
        //         Als hij een interne (decentraal/intern) uitvoerder is mag hij de externe opdrachten afmelden als mld_typeopdr_afmelden_extern==2.
        //         De voorwaarde en setting geldt niet als:
        //         1) de opdracht toegekend is aan een (intern) persoon (P). Dan mag hij alleen eigen opdrachten zien.
        //         2) de opdracht toegekend is aan het eigen (intern) bedrijf (BI). Opdrachten van het eigen bedrijf mag hij alleen zien.
        var iamBedrijfContact = oRs("uitv_type").Value == "BE" && user.iamContact(oRs("uitv_key").Value); // Ben ik contactpersoon van het externe uitvoerende bedrijf?
        var BOXCanClose = iamBedrijfContact && canWriteEXTORD;                                                                // Contactpersoon extern bedrijf (BE) + canWrite.
        var BO2CanClose = (canWriteORDBO2 &&
                           (oRs("mld_typeopdr_afmelden_extern").Value == 2 ||                                                 // Setting mld_typeopdr_afmelden_extern 2=Afmelden.
                            (oRs("uitv_type").Value != "BE" &&                                                                // Intern.
                             ((oRs("B_OF_P").Value == "P" && oRs("uitv_key").Value == user_key) ||                            // Intern persoon (P).
                              (oRs("B_OF_P").Value == "B" && oRs("uitv_key").Value == user.afdeling().prs_bedrijf_key())))    // Intern bedrijf (BI).
                           ));
        if (urole == "b2" && !BOXCanClose && !BO2CanClose)
            eClose = false;

        if (urole == "bo" && oRs("mld_typeopdr_decentraal").Value == 2)
            eClose = false; // Exclusief decentraal

        // Als kosten bij afmelden verplicht zijn:
        var tonen_totaal = !(oRs("mld_typeopdr_uren").Value == 0 &&
                             oRs("mld_typeopdr_materiaal").Value == 0 &&
                             oRs("mld_typeopdr_totaal").Value);
        var req_type  = oRs("mld_typeopdr_kosten_verplicht").Value;
        var req_opdr  = oRs("mld_disc_params_opdr_kosten").Value || 0;
        var kosten_verplicht_afm = (tonen_totaal && (req_type & 2 || (req_type == 0 && req_opdr & 2))? 1 : 0) == 1;
        var opdr_kosten = oRs("mld_opdr_kosten").Value;
        if (kosten_verplicht_afm && opdr_kosten == null)
            eClose = false;

        var eVerwerk = (o_stat == 6 || o_stat == 9) && S("mld_opdr_archive_by_gui") && canWriteORDAFR && canReadORDBOF;

        // Voor het accepteren van meldingen gelden bijna dezelfde conditites als voor het sluiten
        // Alleen mag dat natuurlijk niet als een melding al is geaccepteerd.
        // And the order-type is explicitily accepted
        var eAccept = eClose && o_stat == 5 && oRs("mld_typeopdr_accept").Value == 1;

        var eCopy   = eAdd;

        var isofferte = oRs("mld_typeopdr_isofferte").Value == 1;
        var typehas_cost = oRs("mld_typeopdr_kosten").Value == 1;
        var is_planned_action = oRs("mld_action").Value != null || oRs("opdr_action").Value > 0;

        var eFinish  = (o_stat == 6 && // Opdracht status Afgemeld(6)
                        !isofferte &&
                        typehas_cost &&
                        canWriteORDAFR &&
                        !is_planned_action);

        var has_facturen = oRs("aantal_facturen").Value > 0; // De opdracht heeft facturen.

        // Kan rechtstreeks vanuit deze opdracht een factuur aanmaken.
        var eAddFactuur = typehas_cost && !has_facturen &&
                          o_stat != 1 && o_stat != 2 && o_stat != 3 && o_stat != 10 &&
                          ((iamBedrijfContact && authparamsEXTFIN && authparamsEXTFIN.ALGwritelevel < 9) ||
                           hasAddFactuurRightsFINFOF);
        // Mag lijst met facturen zien die bij deze opdracht horen.
        var eListFactuur = typehas_cost && has_facturen &&
                           ((iamBedrijfContact && authparamsEXTFIN) ||
                            authparamsFINFOF ||
                            authparamsFINBOF ||
                            user.isBudgethouder() ||
                            authparamsMLDFIN);

        var data = {eAdd: eAdd, eClose: eClose, eVerwerk: eVerwerk, eCopy: eCopy, eAccept: eAccept, eFinish: eFinish, eAddFactuur: eAddFactuur, eListFactuur: eListFactuur};
        return data;
      }

      function fncolSpoed(oRs)  // kopie van mld_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 fncolKey(oRs)
      {
        return oRs("ins_srtdiscipline_prefix").Value + oRs("mld_melding_key").Value + "/" + oRs("mld_opdr_bedrijfopdr_volgnr").Value;
      }

      function fnMldStatus(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_melding_status").Value);
        var nrOrders = oRs("nrOrders").Value;
        var nrActief = oRs("nrActief").Value;
        // Een melding is nog niet opgelost als er opdrachten/offertes zijn bij de melding en waarvan er geen enkele meer actief is.
        // De status voor deze meldingen is geaccepteerd(4).
        var not_solved = nrOrders > 0 && oRs("nrActief").Value == 0 && backo && mldStatus == 4;
        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)
        }
        var mld_status = mld.getmldstatustext(mldStatus);

        return mld_status;
      }

      function fnOpdrStatus(oRs)
      {
        var txt = mld.getextendedopdrstatustext(oRs("mld_statusopdr_key").Value, oRs("mld_opdr_key").Value);
        if (oRs("mld_opdr_verzonden").Value == null && L("lcl_mld_opdr_notyetsent"))
            txt += "<br>" + L("lcl_mld_opdr_notyetsent");
        return txt;
      }

      function fncolNote(oRs)
      {
        if (oRs("notitie").Value == null)
          return "";
        else
          return rst.truncMore(shared.stripbbcodes(oRs("notitie").Value), {isPrinting: print, isExcel: excel}); // Zorgt voor het afkappen van de tekst en het toevoegen van ... meer.
      }

      function fncolObject(oRs)
      {
        if (oRs("objCount").Value > 20)
          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 "";

        var obj = oRs("object").Value;
        var ret = (outputmode == 0 ? I("fa-hand-point-right") + " " : "") + obj.format(", ");
        if (obj.indexOf("{0}") == -1) // single object
            return "<span class=\"nowrap\">" + ret + "</span>";
        else
            return ret;
      }

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

      function fnsummaryCalc(oRs)
      {
        with (summaryParams)
        {
          var opd_status = status.getopdrstatustext(oRs("mld_statusopdr_key").Value);
          var order = oRs("mld_statusopdr_key").Value;

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

      function fnsummaryShow()
      {
        with (summaryParams)
        {
          status_row = "";
          status_row += (status_oms[10] != undefined ? status_oms[10] + "<span class='summary-badge'>" + status_cnt[10] + "</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[6]  != undefined ? status_oms[6]  + "<span class='summary-badge'>" + status_cnt[6]  + "</span>" : "");
          status_row += (status_oms[9]  != undefined ? status_oms[9]  + "<span class='summary-badge'>" + status_cnt[9]  + "</span>" : "");
          status_row += (status_oms[5]  != undefined ? status_oms[5]  + "<span class='summary-badge'>" + status_cnt[5]  + "</span>" : "");
          status_row += (status_oms[7]  != undefined ? status_oms[7]  + "<span class='summary-badge'>" + status_cnt[7]  + "</span>" : "");
          status_row += (status_oms[1]  != undefined ? status_oms[1]  + "<span class='summary-badge'>" + status_cnt[1]  + "</span>" : "");
          status_row += (status_oms[2]  != undefined ? status_oms[2]  + "<span class='summary-badge'>" + status_cnt[2]  + "</span>" : "");
          //status_row = status_row.substr(2);
        }
        return status_row;
      }

      function fnendText()
      {
        var endText = "";
        if (S("mld_max_history") > 0 && (mldopdrstrej || mldopdrstafm || mldopdrstver) && !mld_key)
          endText = L("lcl_newrows1") + S("mld_max_history") + L("lcl_newrows2");
        return endText;
      }

      var buttons = [];
      if (params.opdr_parent_key)
      { // Niet eerder nodig? Dan hier maar;
        var this_opdr = mld.func_enabled_opdracht(params.opdr_parent_key);
        if (this_opdr.canCopy)
            buttons.push({ title: L("lcl_add"), icon: "fa-plus", action: "opdr_continue()" });
      }

      var addallowed = false;
      if (mld_key)
      {
        var sqlm = "SELECT COUNT(*) aantal FROM mld_melding WHERE mld_melding_key = " + mld_key;
        var oRs3 = Oracle.Execute(sqlm);
        if (oRs3("aantal").Value == 1) // De mld_key moet ook echt bestaan.
        {
          var this_mld = mld.func_enabled_melding(mld_key);
          addallowed = this_mld.canAddOpdr;
          var canAccept = this_mld.canAccept;
        }
        oRs3.Close();

        if (addallowed)
        {
          if (!params.opdr_parent_key)
              buttons.push({ icon: "fa-plus", title: L("lcl_add"), action: "add_opdracht("+(canAccept?1:0)+")" });
          if (!inline)
              buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
          // else ooit eens testen/ netjes
          //    buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "parent.$('#tdinline').load(window.location.href, resizeWhenInIFrame);" });
        }
      }
      if (Request.ServerVariables("REQUEST_METHOD") == "POST") {
        // Bij GET wordt deze knop automatisch door CreateButtons al wel ingevoegd
        // Bij de POST (vanuit mld_search.asp) moeten we hem expliciet zelf toevoegen want er is een clientside afhankelijkheid (toegang tot mld_search.asp)
        buttons.push({ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
      }

      // Een kalender met opdrachten tonen; dit is niet zinvol als ik embedded ben
      // Je kunt dit bv afmeten aan tiny of aan het gedefinieerd zijn van een meldingkey
      // In b2 mode zie je minder opdrachten (alleen waar je ORDBO2 voor hebt), dan is de relatie
      // met de kalender verwarrend, dus dan ook liever weg.
      if (!mld_key && urole != 'b2' && urole != 'mi') {
          // Dit is het OCP filter van de persoonselector: *ik* kan een interne contactpersoon zijn
          // Dan is er een kalenderknop om mijn lopende in een overzicht te zien
          // Goedkoper is wellicht of er een exist is van mld_opdr.prs_perslid_key = me
          var csql = "SELECT prs_perslid_key"
                 + " FROM fac_v_webgebruiker f"
                 + ", fac_functie ff"
                 + " WHERE f.fac_functie_key = ff.fac_functie_key"
                 + "   AND prs_perslid_key = " + user_key
                 + "   AND (fac_functie_code = 'WEB_MLDBOF' OR fac_functie_code = 'WEB_MLDBO3')"
                 + "   AND f.fac_gebruiker_prs_level_write <9"
                 + "   AND f.fac_gebruiker_alg_level_write <9";
           var coRs = Oracle.Execute(csql);
           if (!coRs.eof) {
              var calendarurl = 'appl/shared/fullcalendar.asp?worker=opdrlist';
              buttons.push ({ icon: "fa-calendar", title: L("lcl_calendar"), action: "FcltMgr.openDetail('" + calendarurl + "', '" + L("lcl_mld_opdr_lopende") + "')" });
           }
           coRs.Close();
      }

      if (!mld_melding.isTemplate) {
        buttons.push({ icon: "fa-list-ul",  title: L("lcl_mld_legenda"), action: "openOpdrLegenda(" + (inline ? mld_key : '') + ")" });
      }

      if (!inline)
        buttons.push({ icon: "fa-columns",  title: L("lcl_scf_columns"), action: "openColumns()"});

      function fncolFiatteur(oRs)
      {
        if (oRs("mld_statusopdr_key").Value == 3)
          return oRs("fiatteur").Value;
        else
          return "";
      }

      function fncolContractnr(oRs)
      {
        var cnt_nr = oRs("cnt_contract_nummer_intern").Value;
        if (oRs("cnt_contract_versie").Value) {
          cnt_nr += "." + oRs("cnt_contract_versie").Value;
        }
        return safe.html(cnt_nr);
      }

      function fncolActiecode(oRs)
      {
        var actiecode = oRs("mld_opdr_actiecode").Value;
        var res = "";
        var iAmUitv =   exhandler
                    ||  oRs("uitv_key").Value == user_key
                    || (oRs("B_OF_P").Value === "B"
                        ? user.iamContact(oRs("uitv_key").Value)
                        : user.isCollega(oRs("uitv_key").Value));
        if (iAmUitv) { // Uitvoerder ziet een signaal als de bal bij de BO ligt
            if (actiecode & 512) { // Attentie bij Uitvoerder
                res = L("lcl_mld_actiecodeATT");
                if (outputmode == 0) {
                    res = "<span class='ac512' title='"+res+"'>"
                        + I("fa-bell fa-lg", { fastyle: "fas" })
                        + "</span>";
                }
            } else if (S("mld_opdr_actiecode") > 0 && (actiecode & 1) && (actiecode & 128)) { // Actie & Attentie bij BO
                res = L("lcl_opdr_actiecodeBO");
                if (outputmode == 0) {
                    res = "<span class='ac' title='"+res+"'>"
                        + I("fa-user-cog fa-lg", { fastyle: "fas" })
                        + "</span>";
                }
            } else if (S("mld_opdr_actiecode") > 0 && (actiecode & 1)) { // Actie bij BO
                res = L("lcl_opdr_actiecodeBO");
                if (outputmode == 0) {
                    res = "<span class='ac' title='"+res+"'>"
                        + I("fa-user-cog fa-lg", { fastyle: "fal" })
                        + "</span>";
                }
            }
        } else { // Niet-uitvoerders (altijd FOBO?)
            if (outputmode == 0) {
                if (actiecode & 128) { // Attentie bij FOBO
                    res = "<span class='ac128' title='"+L("lcl_mld_actiecodeATT")+"'>"
                        + I("fa-bell fa-lg", { fastyle: "fas" })
                        + "</span>";
                } else if (S("mld_opdr_actiecode") > 0 && (actiecode & 1)) { // Actie bij BO
                    res = "<span class='ac' title='"+L("lcl_opdr_actiecodeBO")+"'>"
                        + I("fa-bell fa-lg", { fastyle: "fal" })
                        + "</span>";
                }
            } else {
                if (actiecode & 128) { // Attentie bij FOBO
                    res = L("lcl_mld_actiecodeATT");
                } else if (S("mld_opdr_actiecode") > 0 && (actiecode & 1)) { // Actie bij BO
                    res = L("lcl_opdr_actiecodeBO");
                }
            }
        }
        return res;
      }

      function fncolFlags(oRs)
      {
        var opdrkey = oRs("mld_opdr_key").Value;
        var flagkey = oRs("mld_opdr_flag").Value || 0;
        var ttl = L("lcl_opdr_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 = I("fa-fclt-flag" + (flagkey == 0 ? "0" : ""));
            // Met hidden flagkey voor sortering. 999 zorgt dat bij 1 keer sorteren de gevlagde direct bovenaan staan
            displ = "<div class='clickParent' " + ((urole == "bo" || urole == "fo" || S("mld_performer_can_change_flags")) ? "onclick='toggleOpdrFlag(event, "+ opdrkey +");'":"")
                  + " title='"+safe.htmlattr(ttl)+"'>"
                  + "<span id='opdrflag"+opdrkey+"' class='opdrflag"+flagkey+"' flagkey='"+flagkey+"'>" + flagIcon + "</span>"
                  + "<span style='display:none'>"+(flagkey||999)+"</span></div>";
        }
        return displ;
      }

      function fncolFlexBijlagen(oRs)
      {
        var flexval = oRs("flex").Value;
        var bijlagen_aantal = 0;
        if (params.bijlageflex)
        {
            var opdr_key = oRs("mld_opdr_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_opdr o"
                    + "     , mld_srtkenmerk t"
                    + "     , mld_kenmerk k"
                    + " WHERE o.mld_typeopdr_key = k.mld_typeopdr_key"
                    + "   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 o.mld_opdr_key = " + opdr_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", opdr_key, kenmerk_key, "O", {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>"
               : ""
               );
      }

      function fncolLaatsteActieDatum(oRs)
      {
        var laatste_actie = oRs("recentdatum").Value != null? new Date(oRs("recentdatum").Value) : null;
        var datumbegin =  new Date(oRs("mld_opdr_datumbegin").Value);
        if (excel)
          return laatste_actie != null? laatste_actie : datumbegin;
        else
          return toDateString(laatste_actie != null? laatste_actie : datumbegin);
      }

      function fncolLaatsteActieTijd(oRs)
      {
        var laatste_actie = oRs("recentdatum").Value != null? new Date(oRs("recentdatum").Value) : null;
        var datumbegin =  new Date(oRs("mld_opdr_datumbegin").Value);
        return toTimeString(laatste_actie != null? laatste_actie : datumbegin);
      }

      var rst = new ResultsetTable({ keyColumn: "mld_opdr_key",
                                     ID: "opdrtable",
                                     tabs_code: "opdr_list-" + urole,
                                     rowClass: fnrowClass,
                                     rowData: fnrowData,
                                     rowActionEnabler: fnrowActionEnabler,
                                     sql: sql,
                                     flexModule: "OPDR",
                                     flexId: "mld_opdr_key",
                                     flexGroupId: "mld_typeopdr_key", // Flexkenmerken verschillen per opdrachttype (mld_typeopdr_key)
                                     filterParams: params,
                                     outputmode: outputmode,
                                     title: (!params.opdr_parent_key ? L("lcl_orders") : L("frm_vervolgopdrlistframe")),
                                     inline: inline,
                                     summaryCalc: (!tiny ? fnsummaryCalc : null),
                                     summaryShow: (!tiny ? fnsummaryShow : null),
                                     summaryId : (!tiny && mld_key ? mld_key : null),
                                     endText: fnendText,
                                     showAll: showall,
                                     buttons: buttons
                                  });

      // Gebruik (!tiny) om bepaalde kolommen in compacte mode niet te tonen,
      // handig voor (meldings)info die al in een ander frame staat
      var hasMLDFOBO = user.has(["WEB_MLDBOF","WEB_MLDFOF"]);
      var hasFINFOBO = user.has(["WEB_FINBOF","WEB_FINFOF"]);  // moet misschien nog anders
      var nrtooltip = (!tiny ?  "mld_typeopdr_omschrijving" : null);

      // Wat bolletjes en markeringen
      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_opdracht_flags") > 0)  // mag ook best voor de fe (uitvoerende) zichtbaar toch?
        rst.addColumn(new Column({caption: (outputmode == 0 ? I("fa-fclt-flag0") : L("lcl_opdr_flags")), colText: L("lcl_opdr_flags"), content: fncolFlags, colName: "fncolFlags", align: "center"}));
      rst.addColumn(new Column({caption: I("fa-exclamation-triangle"), colText: L("lcl_mld_urg"), content: fncolSpoed, colName: "fncolSpoed"}));

      // de identificatie
      rst.addColumn(new Column({caption: L("lcl_shared_order"), content: fncolKey, colName: "fncolKey", tooltip: nrtooltip, hasActions: true }));
      rst.addColumn(new Column({caption: L("lcl_opdr_id"), content: "mld_opdr_id", combine: true, showDefault: !tiny }));

      // wat typering
      if (!singleOT)  // niet nodig als je uberhaupt maar 1 type hebt
        rst.addColumn(new Column({caption: L("lcl_mld_typeopdr"), content: "mld_typeopdr_omschrijving", showDefault: !tiny }));
      if (excel)
      {
        rst.addColumn(new Column({caption: L("lcl_vakgroup_type"), content: "ins_srtdiscipline_omschrijving"}));
        rst.addColumn(new Column({caption: L("lcl_vakgroup"),      content: "ins_discipline_omschrijving"}));
      }
      rst.addColumn(new Column({caption: (cnt_key? L("lcl_cnt_service_name") : L("lcl_complain")), content: "mld_stdmelding_omschrijving", showDefault: tiny }));

      // De herkomst, purpose-setting: {0=no | 1=print only | 2=view only | 3=both}
      rst.addColumn(new Column({caption: L("lcl_requestor"), content: "aanvrager", purpose: S("mld_opdr_show_requestor_in_list"), showDefault: !tiny }));

      // de plaats
      if (anyalg && !tiny)
      {
          rst.addColumn(new Column({caption: L("lcl_district"), content: "alg_district_omschrijving", purpose: PRINTING_ONLY}));
          // zou aardig zijn om hier nog kolommen voor locatie, gebouw, verdieping, ruimte voor PRINTING_ONLY op te nemen
          rst.addColumn(new Column({caption: L("lcl_place"), content: "plaatsmelding"}));
      }
      // betreffende objecten combined
      if (params.anyins && !tiny)
      {
          rst.addColumn(new Column({caption: L("lcl_mld_nr_objects"), content: fncolObject, colName: "fncolObject", combine: anyalg}));
      }
      // verder met de plaats
      if (anyalg && !tiny)
      {
          if (S("mld_print_loc_address") == 1)  // serviceadres op de print
          {
            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 (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}));
              rst.addColumn(new Column({caption: L("lcl_prs_address_bezoek_postcode"), content: "alg_locatie_postcode", combine: false}));
              if (S("mld_print_loc_address") == 2)
                  rst.addColumn(new Column({caption: L("lcl_estate_gebouw_man_name"), content: "alg_gebouw_naam", colName: "alg_gebouw_naam", combine: true}));
              else // dus S("mld_print_loc_address") == 3
                  rst.addColumn(new Column({caption: L("lcl_prs_address_bezoek_plaats"), content: "alg_locatie_plaats", colName: "alg_locatie_plaats", combine: true}));
          }
      }

      // de opdrachttekst
      rst.addColumn(new Column({caption: L("lcl_mld_opdr_description"), content: "mld_opdr_omschrijving"}));

      if (!mld_melding.isTemplate)
      { // timing and statusses
        rst.addColumn(new Column({caption: L("lcl_orderdate"), content: "mld_opdr_datumbegin", datatype: "date", nowrap: true, showDefault: !tiny }));
        rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_datumbegin", colName: "mld_opdr_datumbegin_time", datatype: "time", combine: true, nomidnight: true, showDefault: !tiny }));
        // statussen; tooltips op voorwaardelijke en gecombineerde kolommen is ingewikkeld, alleen de tooltip van de eerste waarde doet wat, daarom allemaal
        rst.addColumn(new Column({caption: L("lcl_mld_mldstatus"), content: fnMldStatus, colName: "fnMldStatus", showDefault: !tiny }));
        rst.addColumn(new Column({caption: L("lcl_mld_opdr_status"), content: fnOpdrStatus, colName: "fnOpdrStatus", combine: !tiny }));
        // Notities
        if (!frontend)
            rst.addColumn(new Column({caption: I("fa-comment")+"&nbsp;"+L("lcl_mld_note"), colText: L("lcl_mld_note"), content: fncolNote, colName: "fncolNote"}));

        // Plandata
        rst.addColumn(new Column({caption: L("lcl_opdr_plandate"), content: "mld_opdr_plandatum", datatype: "date", nowrap: true}));
        rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_plandatum", colName: "mld_opdr_plandatum_time", datatype: "time", combine: true, nomidnight: true}));
        rst.addColumn(new Column({caption: L("lcl_opdr_plandate2"), content: "mld_opdr_plandatum2", datatype: "date", nowrap: true, showDefault: (S("mld_use_plandate2") & 1) }));
        rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_plandatum2", colName: "mld_opdr_plandatum2_time", datatype: "time", combine: true, nomidnight: true, showDefault: (S("mld_use_plandate2") & 1) }));
        rst.addColumn(new Column({caption: L("lcl_opdr_enddate"), content: "mld_opdr_einddatum", datatype: "date", nowrap: true}));
        rst.addColumn(new Column({caption: L("lcl_time"), content: "mld_opdr_einddatum", colName: "mld_opdr_einddatum_time", datatype: "time", combine: true, nomidnight: true}));
      }

      // de uitvoerder enzo (onderdrukken indien meegegeven)
      if (params.handler_key > 0)
          rst.addColumn(new Column({caption: L("lcl_handler"), content: "uitv_naam", purpose: PRINTING_ONLY}));
      else
          rst.addColumn(new Column({caption: L("lcl_handler"), content: "uitv_naam"}));
      if (params.behandel_key_arr && params.behandel_key_arr.length)
        rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: "behandelaar", colName: "behandelaar", combine: (!params.handler_key > 0), purpose: PRINTING_ONLY}));
      else
        rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: "behandelaar", colName: "behandelaar", combine: (!params.handler_key > 0)}));

      rst.addColumn(new Column({caption: L("lcl_mld_contactpersoon"), content: "contactpersoon"}));
      // Contractnummer. Erg zinloos als frame onder het contract, als print dan maar
      if (cnt_key)
      {
          rst.addColumn(new Column({caption: L("lcl_cnt_contractnr"), content: "cnt_contract_nummer", purpose: PRINTING_ONLY}));
          rst.addColumn(new Column({caption: L("lcl_cnt_intern_nr"), content: fncolContractnr, colName: "fncolContractnr", purpose: PRINTING_ONLY}));
      }

      rst.addColumn(new Column({ caption: L("lcl_mld_inf_Opmerking"), content: "mld_opdr_opmerking"}));

      if (!mld_melding.isTemplate)
      { // Bedragen, geld enz
        rst.addColumn(new Column({ caption: L("lcl_account"), content: "kpstring", showDefault: (groepering_key == 16) }));
        rst.addColumn(new Column({ caption: L("lcl_hours"), content: "mld_opdr_uren", datatype: "currency", total: true, showDefault: (tiny || groepering_key == 16) }));
        if (params.includeHours) {
          rst.addColumn(new Column({caption: L("lcl_mlduren_booked"), content: "mld_opdr_uren_besteed", datatype: "currency", total: true}));
        }
        rst.addColumn(new Column({ caption: L("lcl_hour_rate") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "mld_opdr_uurloon", datatype: "currency", total: true, showDefault: (groepering_key == 16) }));
        rst.addColumn(new Column({ caption: L("lcl_mater_cost") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "mld_opdr_materiaal", datatype: "currency", total: true, showDefault: (groepering_key == 16) }));
        rst.addColumn(new Column({ caption: L("lcl_correct") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "correctie", datatype: "currency", total: true, showDefault: (groepering_key == 16) }));
        rst.addColumn(new Column({ caption: L("lcl_opdr_kosten") + "&nbsp;(" + L("lcl_valutasign") + ")", colText: L("lcl_opdr_kosten"), content: "mld_opdr_kosten", datatype: "currency", total: true, showDefault: (!tiny || groepering_key == 16) }));
      }

      // Voor de profs: wie is de fiatteur?
      if (fronto || backo)
         rst.addColumn(new Column({ caption: L("lcl_mld_approver"), content: fncolFiatteur, colName: "fncolFiatteur" }));

      // Gefactureerd bedrag
      if (hasFINFOBO)  // zou ik zeggen
        rst.addColumn(new Column({ caption: L("lcl_mld_invoiced") + "&nbsp;(" + L("lcl_valutasign") + ")", content: "gefactureerd", datatype: "currency", total: true, showDefault: (groepering_key == 16) }));
      // flex
      if (params.anyflex)
      {
        rst.addColumn(new Column({caption: flexlabel, content: fncolFlexBijlagen, colName: "fncolFlexBijlagen"}));
      }

      // laatste actiedatum. Groepering opdracht en opdracht+kosten hebben de datum niet berekend dus onderdrukken
      if (!frontend && groepering_key != 2 && groepering_key != 16 && !mld_melding.isTemplate)
      {
        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}));
      }

      // actions
      rst.addAction({ action: "opdr_edit", caption: L("lcl_details"), isDefault: true });
      if (!mld_melding.isTemplate)
      {
        if (urole=="fo" || urole =="bo" || urole =="b2")
        {
          if (!mld_key || addallowed)
              rst.addAction({ action: "opdr_copy", caption: L("lcl_mld_copy"), enabler: "eCopy" });
          if (S("mld_opdr_close") == 0)
          {
            if (tiny)
              rst.addAction({ action: "opdr_close_one", caption: L("lcl_close"), enabler: "eClose", multi: false });
            else
              rst.addAction({ action: "opdr_close", caption: L("lcl_close"), enabler: "eClose", multi: true, multiOnce: true });
          }
          rst.addAction({ action: "opdr_accept", caption: L("lcl_accept"), enabler: "eAccept", multi: true, multiOnce: true });
          rst.addAction({ action: "opdr_finish", caption: L("lcl_opdr_closekosten"), enabler: "eFinish", multi: true, multiOnce: true });
          rst.addAction({ action: "opdr_verwerk", caption: L("lcl_mld_opdr_verwerk"), enabler: "eVerwerk", multi: true, multiOnce: true });
        }
        rst.addAction({ action: "opdr_add_invoice", caption: L("lcl_mld_invoicing"), enabler: "eAddFactuur" });
        rst.addAction({ action: "opdr_list_invoice", caption: L("lcl_mld_invoicing"), enabler: "eListFactuur" });
      }

      var count = 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() {
          if ($(".clickParent").parent().attr("click")) // to fix infinite click events in case there is no click event on the parent
            $(".clickParent").parent().on("click", function(e) { e.stopPropagation(); $(this).find("> .clickParent").trigger("click"); });
        });

<% if (mld_key > 0 && mld_melding) {
%>
        function add_opdracht(canAccept)
        {
            var act_key = <%=mld_melding.act_key%>;
            if (act_key > -1)
            { // opdracht bij meldingsjabloon
              var addurl = "appl/mld/mld_opdr.asp?urole=bo&mld_key=<%=mld_key%>&act_key=" + act_key;
              FcltMgr.openDetail(addurl, L("lcl_add"));
            }
            else
            {
              var addurl = "appl/mld/mld_opdr.asp?urole=bo&mld_key=<%=mld_key%>";
              if (canAccept) // we negeren S("mld_accept_confirm") verder en slaan accept-dialoog over.
              {
                doAccept( { mld_key     : mld_key,
                            prefix      : "<%=safe.jsstring(mld_melding.prefix)%>",
                            autoConfirm : false
                          },
                          function()
                          {
                            if (window.parent.mldframe && window.parent.mldframe.mld_melding_reload)
                                window.parent.mldframe.mld_melding_reload(mld_key)
                            FcltMgr.openDetail(addurl, L("lcl_add"));
                          }
                        );
              }
              else
                FcltMgr.openDetail(addurl, L("lcl_add"));
            }
          }
<% }
%>

        function openOpdrLegenda(id)
        {
            params = { width: 250,
                       minWidth: 250,
                       //height: 130,
                       minHeight: 10,
                       resizable: false,
                       position: {my: "right top", at: "right top+30"},
                       title: L("lcl_mld_legenda"),
                       create: FcltMgr.fnCreateCloseButton("div#legenda"+(id || ""))
                     }
            $('div#legenda'+(id || "")).dialog(params).dialog('open');
            FcltMgr.resized();
        }
      </script>
    <div id="legenda<%=(inline ? mld_key : "")%>" style="display:none; line-height: 30px;">
      <table id="opdrachtlegenda">
        <tr>
          <td title="<%=safe.htmlattr(L("lcl_mld_legenda_normal_tt"))%>"><%= L("lcl_mld_legenda_normal") %></td>
        </tr>
        <tr class="expired2">
          <td title="<%=safe.htmlattr(L("lcl_mld_legenda_expired2_tt"))%>"><%= L("lcl_mld_legenda_expired2") %></td>
        </tr>
        <tr class="updated">
          <td title="<%=safe.htmlattr(L("lcl_mld_legenda_updated_tt"))%>"><%= L("lcl_mld_legenda_updated") %></td>
        </tr>
        <tr class="recentlychangedopdr">
          <td title="<%=safe.htmlattr(L("lcl_mld_legenda_unviewed_tt"))%>"><%= L("lcl_mld_legenda_unviewed") %></td>
        </tr>
        <tr class="expired2 updated">
          <td title="<%=safe.htmlattr(L("lcl_mld_legenda_expired2_tt"))%>/<%=safe.htmlattr(L("lcl_mld_legenda_updated_tt"))%>"><%= L("lcl_mld_legenda_expired2") %>/<%= L("lcl_mld_legenda_updated") %></td>
        </tr>
    <%  // Vlag 0 tonen we niet
        for (var flagkey = 1; flagkey < S("mld_opdracht_flags"); flagkey++)
        { %>
            <tr><td>
            <span class="opdrflag<%=flagkey%>">
              <%=I("fa-fclt-flag")%>
            </span>
            &nbsp;<%=L("lcl_opdr_flag"+flagkey)%></td></tr><%
        }
    %>
      </table>
    </div>
<%
    }
%>
    </body>
  </html>
<%
}
%>
