<% /*
     $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/json2.js" -->
<!-- #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" -->

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

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.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       : key
  // params.dist_key      : key
  // params.loc_key       : key
  // params.bld_key       : key
  // params.flr_key       : key
  // params.room_key      : key
  // params.behandel_key  : key
  // params.srtdisc_key   : key
  // 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.kp            : wildcard string
  // params.handler_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_str: 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.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
  // cnt_key: contract,
  // params.deel_key      : ins_deel_key
  // params.rsv_ruimte_key: res_rsv_ruimte_key

  // 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)
  // afdel =
  // kp = kostenplaats (wildcard)
  //
  // 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);

  // AUTORISATIES
  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 mld_key = params.mld_key;
  var behandel_key = params.behandel_key;
  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();
%>
  <html>
    <head>
<%
      FCLTHeader.Generate({ outputmode: outputmode });
%>
      <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">
<%
      sqln = "SELECT "
           + " m.mld_melding_key"
           + ", mld_melding_datum"
           + ", m.mld_melding_onderwerp"
           + ", m.mld_melding_omschrijving"
           + ", m.prs_kostenplaats_key"
           + ", m.mld_melding_opmerking"
           + ", m.mld_melding_einddatum"
           + ", m.mld_melding_t_uitvoertijd.tijdsduur uitvoertijd_tijdsduur"
           + ", m.mld_melding_t_uitvoertijd.eenheid uitvoertijd_eenheid"
           + ", m.mld_melding_parentkey"
           + ", m.mld_adres_key"
           + ", std.mld_stdmelding_volgnr"
           + ", std.mld_stdmelding_doublecheck"
           + ", std.mld_stdmelding_planbaar"
           + ", std.mld_stdmelding_slabewaken"
           + ", mld_melding_status mld_status"
           + ", DECODE(mld_melding_status, 2, 1, 3, 1, 0, 2, 4, 2, 7, 2, 1, 3, 5, 3, 6, 3, 4) sortinggroup"
           + ", 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";

      // 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 += ", " + 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_adres"
              + (minfo
                ? ", di.alg_district_omschrijving"
                : "");

      sqln += ", sd.ins_srtdiscipline_prefix"
            + ", sd.ins_srtdiscipline_alg"
            + ", sd.ins_srtdiscipline_ins"
            + ", sd.ins_srtdiscipline_bes"
            + ", md.ins_discipline_key"
            + ", md.ins_discipline_kpnverplicht"
            + ", std.ins_srtinst_verplicht"
            + ", std.mld_stdmelding_freetext"
            + ", std.alg_onrgoed_niveau"
            + ", 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"

      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"
              + ", 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 += (minfo
              ? ", TO_DATE('01-01-1970', 'DD-MM-YYYY')"
              : ", (SELECT MAX(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')")
            + " recentdatum";

      // Voeg de flag toe
      sqln += ", 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"

      // Voeg aan de sql het FROM en WHERE gedeelte toe
      sqln += mld.getfromwherelist_sql(pautfunction, params);
      if (minfo)
      {
        sqln += (params.ingevoerd == "fe" ? " AND m.prs_perslid_key = invoerder.prs_perslid_key" : "");
        sqln += (params.ingevoerd == "fo" ? " AND m.prs_perslid_key <> invoerder.prs_perslid_key" : "");
      } // minfo only

      // apply 3D authorization to the locations and to the organisations (both ALG and PRS)
      sqln = discx3d (sqln,
                      "md.ins_discipline_key",
                      "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,
                      (!mld_key && disc_key_arr ? disc_key_arr.join(",") : ""),
                      2);

      sqln = "SELECT * FROM (" + sqln + ") rec2 ORDER BY"
           + (excel ? " UPPER("+lcl.xsql('ins_discipline_omschrijving', 'ins_discipline_key')+"), mld_stdmelding_volgnr, mld_stdmelding_omschrijving," : "")
           + ((backo && (bosort == 0))
             ? " sortinggroup, mld_melding_einddatum" + (params.mldstafm||params.mldstver||params.mldstrej ? " DESC" : "")
             : " mld_melding_key DESC");   //ORDER BY mld_melding_key

      /**********************************
       * Callback functies ResultsetTable
       *********************************/
      var recent = new Date();
      recent.setMinutes(recent.getMinutes() - S("mld_melding_recent"));
      function fnrowClass(oRs)
      {
          if (oRs("mld_melding_parentkey").Value > 0)
            return " child";

          var mldStatus = oRs("mld_status").Value;
          var class1 = "";
          if (!frontend)
          {
            var lnow = new Date();
            // Alles wat al geaccepteerd had moeten zijn wordt expired1
            // in deze statussen zijn geen opdrachten aanwezig dus kan nooit status unsolved optreden
            if ((mldStatus == 2 || mldStatus == 3) && oRs("eindacceptatie").Value < lnow) class1 += ' expired1';

            // Alles wat al klaar had moeten zijn wordt expired2
            if (((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';

            // Meldingen waaraan je nog niet hoeft te beginnen tonen we sleepy.
            if (oRs("mld_melding_datum").Value > lnow) class1 += ' sleepy';
          }

          // 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";

          class1 += " sd_"+oRs("ins_srtdiscipline_prefix").Value || "";
          class1 += " d_"+oRs("ins_discipline_key").Value;

          return class1;
      }

      // 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 data = {mldStatus: mldStatus, mldPrefix: mldPrefix};

        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)
      {
        // 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, 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 eForward = this_mld.canForward;   // Doorsturen
        // 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: oRs("mld_adres_key").Value,
                             srtinst_verplicht: (oRs("ins_srtinst_verplicht").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 data = { eEdit: eEdit,
                     eReject: eReject,
                     eClose: eClose,
                     eAccept: eAccept,
                     eContinue: eContinue,
                     eForward: eForward,
                     eEmptyRequiredFields: eEmptyRequiredFields,
                     eTerugzet: eTerugzet,
                     eDoorzet: eDoorzet
                   };
        return data;
      }

      function fncolSpoed(oRs)  // exacte kopie vanuit mld_list.inc
      {
        var displ = mld.getpriotext(oRs("mld_melding_spoed").Value);
        var hprio = "<div style='display:none'>"+oRs("mld_melding_spoed").Value+"</div>";  // for sorting i presume
        if (outputmode ==0) {  // maak er dan nog leuke plaatjes van
            switch (oRs("mld_melding_spoed").Value)
            {
              case 1:  displ = "<span class='fa fa-exclamation-triangle fa-lg fa-fw' id='urg_kritiek1' title='" + displ+"'>"+hprio+"</span>"; break;
              case 2:  displ = "<span class='fa fa-exclamation-triangle fa-lg fa-fw' id='urg_hoog1' title='" + displ+"'>"+hprio+"</span>"; break;
              case 3:  displ = "<span id='urg_normaal1' title='" + displ + "'>"+hprio+"</span>"; break;
              case 4:  displ = "<span class='fa fa-arrow-circle-o-down fa-lg  fa-fw' id='urg_laag1' title='" + displ+"'>"+hprio+"</span>"; break;
              case 5:  displ = "<span class='fa fa-pause-circle-o fa-lg fa-fw' id='urg_hold1' title='" + displ+"'>"+hprio+"</span>"; break;
            }
        }
        return displ;
      }

      function fnHasOrders(oRs)
      {
        if (oRs("nrOrders").Value > 0)
          return oRs("nrOrders").Value == 1 ? "1 " + L("lcl_shared_order") : oRs("nrOrders").Value + " " + L("lcl_orders");
        else
          return null;
      }

      function fncolKey(oRs)
      {
        var tekst = oRs("ins_srtdiscipline_prefix").Value + oRs("mld_melding_key").Value
        + (oRs("mld_melding_parentkey").Value ? L("lcl_mld_references")+oRs("mld_melding_parentkey").Value : "");
        return  tekst;
      }

      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 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 '<span style="white-space: nowrap">'+mld_status+'</span>';
      }

      function fncolNote(oRs)
      {
        if (oRs("notitie").Value != null)
          return (outputmode == 0? I("fa-comment"): oRs("notitie").Value);
        else return "";
      }

      function fncolNoteTooltip(oRs)
      {
        if (oRs("notitie").Value != null)
        {
          var notitietext = (oRs("notitie").Value.length > 30? oRs("notitie").Value.substr(0, 30) + "..." : oRs("notitie").Value)
          return (outputmode == 0? toDateTimeString(oRs("notitiedatum").Value) + ": " +  notitietext : "");
        }
        else return "";
      }

      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)
        {
            if (flagkey != 0) displ = safe.html(ttl);  // else blijft-ie gewoon leeg
        }
        else if (excel)  // dan gewoon maar de code, handig groeperen
        {
            displ = flagkey||"";
        }
        else  // maak er dan nog leuke plaatjes van
        {
            if (flagkey == 0)
                var flagimg = "<i id='mldflagimg"+mldkey+"' flagkey='0' class='fa fa-circle-o mldflag"+flagkey+"'>";
            else
                var flagimg = "<i id='mldflagimg"+mldkey+"' flagkey='"+flagkey+"' class='fa fa-circle mldflag"+flagkey+"'>";
            // Met hidden flagkey voor sortering. 999 zorgt dat bij 1 keer sorteren de gevlagde direct bovenaan staan
            displ = "<div " + ((urole == "bo" || urole == "fo") ? "onclick='toggleFlag(event, "+ mldkey +");'":"")
                  + " title='"+safe.htmlattr(ttl)+"'>"
                  + flagimg
                  + "<span style='display:none'>"+(flagkey||999)+"</span></div>";
        }
        return displ;
      }

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

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

      function fncolEindTijd(oRs)
      {
        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))
        {
            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 fncolSoortMelding(oRs)
      {
        var mldSoortMelding = safe.html(oRs("ins_discipline_omschrijving").Value + "/" + oRs("mld_stdmelding_omschrijving").Value);
        return mldSoortMelding;
      }

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

      function fnsummaryCalc(oRs)
      {
        with (summaryParams)
        {
          var mldStatus = parseInt(oRs("mld_status").Value);
          var not_solved = oRs("nrOrders").Value > 0 && oRs("nrActief").Value == 0 && backo && mldStatus == 4;
          var mld_status = (not_solved? L("lcl_mld_not_solved") : mld.getmldstatustext(mldStatus));
          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] + " <b>" + status_cnt[0] + "</b>":"");
          status_row += (status_oms[2] != undefined? ", " + status_oms[2] + " <b>" + status_cnt[2] + "</b>":"");
          status_row += (status_oms[3] != undefined? ", " + status_oms[3] + " <b>" + status_cnt[3] + "</b>":"");
          status_row += (status_oms[4] != undefined? ", " + status_oms[4] + " <b>" + status_cnt[4] + "</b>":"");
          status_row += (status_oms[8] != undefined? ", " + status_oms[8] + " <b>" + status_cnt[8] + "</b>":"");
          status_row += (status_oms[7] != undefined? ", " + status_oms[7] + " <b>" + status_cnt[7] + "</b>":"");
          status_row += (status_oms[5] != undefined? ", " + status_oms[5] + " <b>" + status_cnt[5] + "</b>":"");
          status_row += (status_oms[6] != undefined? ", " + status_oms[6] + " <b>" + status_cnt[6] + "</b>":"");
          status_row += (status_oms[1] != undefined? ", " + status_oms[1] + " <b>" + status_cnt[1] + "</b>":"");
          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)
          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;
      }

      var buttons = [];
      if (params.rsv_ruimte_key)
        buttons.push({ icon: "page_refresh.png", title: L("lcl_refresh"), action: "FcltMgr.reload()" });
      // 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 (canAdd && !params.deel_key)
      {
        var addurl = "appl/mld/mld_melding.asp?urole=" + (backo ? "fo" : urole);  // backo mag niet toevoegen
        addurl += buildTransitParam(["loc_key", "bld_key", "flr_key", "room_key", "srtdisc", "ins_key", "rsv_ruimte_key"], params);
        buttons.push({ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', '" + L("lcl_add") + "')" });
      }
      if (!frontend)
        buttons.push({ icon: "legenda.png",  title: L("lcl_mld_legenda"), action: 'openLegenda()' });

      if (behandel_key) {  // als ik filter op ik als behandelaar
          var calendarurl = 'appl/shared/fullcalendar.asp?worker=mldlist&bk='+behandel_key;
          buttons.push({ icon: "calendar_1.png", title: L("lcl_calendar"), action: "FcltMgr.openDetail('" + calendarurl + "', '" + L("lcl_mld_melding_lopende") + "')" });
       }

      // Heb toegang tot de inline opdrachten details?
      var authparamsORDBOF = user.checkAutorisation("WEB_ORDBOF", true);
      var authparamsORDBO2 = user.checkAutorisation("WEB_ORDBO2", true);
      var accessOpdr = (authparamsORDBOF || authparamsORDBO2);

      var rst = new ResultsetTable({ keyColumn: "mld_melding_key",
                                     sql: sqln,
                                     ID: "complainstable",
                                     rowClass: fnrowClass,
                                     rowData: fnrowData,
                                     rowActionEnabler: (urole=="fo" || urole =="bo")?fnrowActionEnabler: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: L("lcl_complains"),
                                     inlineDetails: (accessOpdr)? "inlineOrdersUrl" : null,
                                     hasInlineDetails: fnHasOrders,
                                     summaryCalc: fnsummaryCalc,
                                     summaryShow: fnsummaryShow,
                                     endText: fnendText,
                                     showAll: showall,
                                     buttons: buttons,
                                     totalCalc: fntotalCalc,
                                     totalShow: fntotalShow
                                    });

      if (S('mld_melding_flags') > 0 && !frontend)
        rst.addColumn(new Column({caption: I("fa-circle"), content: fncolFlags, align: "center"}));
      rst.addColumn(new Column({caption: "!", content: fncolSpoed, hasActions: true}));
      rst.addColumn(new Column({caption: L("lcl_mld_number"), datatype: "number", content: fncolKey }));
      if (!minfo)
      {
        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_date"), content: "mld_melding_datum", datatype: "date", nowrap: true}));
      rst.addColumn(new Column({caption: L("lcl_time"), combine: true, content: "mld_melding_datum", datatype: "time", nowrap: true, nomidnight: true}));
      if (minfo)
        rst.addColumn(new Column({caption: L("lcl_district"), content: "alg_district_omschrijving", purpose: PRINTING_ONLY}));
      if (anygeo) {
        rst.addColumn(new Column({caption: L("lcl_place"), content: "plaatsmelding"}));
      }
      rst.addColumn(new Column({caption: L("lcl_mld_subject"), content: "mld_melding_onderwerp", thClass: 'sorttable_alpha'}));
      if (S("mld_print_loc_address") == 1)
        rst.addColumn(new Column({caption: L("lcl_location_address"), content: "alg_locatie_adres", purpose: PRINTING_ONLY}));
      if (minfo)
        rst.addColumn(new Column({caption: L("lcl_complain"), content: fncolSoortMelding, combine: true, purpose: PRINTING_ONLY}));
      rst.addColumn(new Column({caption: L("lcl_txt"), content: "mld_melding_omschrijving", combine: true}));
	    if (S("mld_print_loc_address") == 2)
      {
          rst.addColumn(new Column({caption: L("lcl_location_address"), content: "alg_locatie_adres", combine: false}));
          rst.addColumn(new Column({caption: L("lcl_estate_gebouw_man_name"), content: "alg_gebouw_naam", combine: true}));
      }
      if (minfo)
      {
        rst.addColumn(new Column({caption: L("lcl_behandelgegevens"), content: "mld_melding_opmerking"}));
        rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: fncolBehandelaar, 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, tooltip: (outputmode == 0 && !frontend? fncolNoteTooltip : null)}));
      if (!frontend)
        rst.addColumn(new Column({caption: L("lcl_fin_note"), content: fncolNote, combine: outputmode == 0}));
      if (!minfo)
      {
        // als je er op filtert weet je het wel, maar op de print vind ik wel leuk
        // als de frontend bij de statusinfo niet mag zien Wie het doet, mag die hier ook niet de behandelaar zien
        if ((!behandel_key || print) && !(frontend && S("mld_fe_show_statusnames") == 0))
          rst.addColumn(new Column({caption: L("lcl_mld_behandelaar"), content: fncolBehandelaar }));

        rst.addColumn(new Column({caption: L("lcl_end_date_plan"), content: fncolEindDatum, nowrap: true}));
        rst.addColumn(new Column({caption: L("lcl_time"), content: fncolEindTijd, nowrap: true, combine: true }));
      }
      else
      {
        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_laatste_actie"), content: "laatste_actie"}));
        rst.addColumn(new Column({caption: L("lcl_mld_oordeel"), content: fnOordeel, datatype: "float", decimals: 1, total: true}));
        if (excel || print)
          rst.addColumn(new Column({caption: L("lcl_fac_like_remark"), content: "oordeel_opm"}));
      }

      /* de mogelijke acties */
      rst.addAction({ action: "mld_edit", caption: L("lcl_edit"), isDefault: true } );
      if (urole=="fo" || urole =="bo") // dan hebben we fnrowActionEnabler aangezet
      {
        rst.addAction({ action: "mld_reject", caption: L("lcl_reject"), enabler:"eReject", multi: !tiny, 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: !tiny, multiOnce: true } );
        rst.addAction({ action: "mld_accept", caption: L("lcl_mld_accept"), enabler:"eAccept", multi: !tiny, multiOnce: true } );
        rst.addAction({ action: "mld_continue", caption: L("lcl_mld_continuation"), enabler: "eContinue" } );
        // Eén van beiden, eEmptyRequiredFields of eForward, is true.
        rst.addAction({ action: "mld_forward", caption: L("lcl_forward"), enabler: "eForward" } );
        rst.addAction({ action: "mld_forward_empty", caption: L("lcl_forward"), enabler: "eEmptyRequiredFields" } );

        rst.addAction({ action: "mld_terugzet", caption: L("lcl_terugzet"), enabler: "eTerugzet", multi: !tiny, multiOnce: true } );
        rst.addAction({ action: "mld_doorzet", caption: L("lcl_doorzet"), enabler: "eDoorzet", multi: !tiny, multiOnce: true } );
      }

      var cnt = rst.processResultset();

if (!excel && !print)
{%>
      <!-- LEGENDA  -->
    <script type="text/javascript">
        function openLegenda()
        {
            params = { width: 250,
                       minWidth: 250,
                       //height: 130,
                       minHeight: 10,
                       resizable: false,
                       position: {my: "right top", at: "right top+30"},
                       title: "<%=L("lcl_mld_legenda")%>"
                     }
            $('div#legenda').dialog(params).dialog('open');
            FcltMgr.resized();
        }
    </script>
    <div id="legenda" style="display:none; line-height: 30px;">
      <table id="meldinglegenda">
        <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>
        <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>
      </table>
      <table id="mldflaglegenda">
    <%  // Vlag 0 tonen we niet
        for (var flagkey=1; flagkey < S('mld_melding_flags'); flagkey++)
        {
            %><tr><td><i class='fa fa-circle mldflag<%=flagkey%>'></i>&nbsp;<%=L("lcl_mld_flag"+flagkey)%></td></tr><%
        }
    %>
      </table>
    </div>
<% } %>
    </body>
  </html>
<%
}
%>
