<% /*
     $Revision$
     $Id$

    File:               SLE/sle_list.inc
    Description:        Show an overview of objects (sleutels/cilinders) in list-form.
                        which meets with the given requirements
                        User can select on or more lines and edit/delete them
    Parameters:
        outputmode      behave in an output mode, print to 0 = screen, 1 = printer, 2 = excel, etc.
        showall         show all objects which meets with the given requirements
        loc_key         search for objects with the given location key
        bld_key         search for objects with the given building key
        terr_key        search for objects with the given terrein key
        flr_key         search for objects with the given floor key
        room_key        search for objects with the given room key
        dep_key         search for objects with the given department key
        persoon_key     search for objects with the given persoon key
    Context:            - SLE/sle_search.asp (Search action from bes_search.asp form)
                        - Self (when printing)
    Note:
*/ %>

<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->
<!-- #include file="../Shared/getkenmerksql.inc" -->
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="./sle.inc" -->

<%
FCLTHeader.Requires({ plugins:["jQuery"],
                      js: ["../sle/sle_list.js"]
                    });

function sle_list (params)
{
  var addButton = [];

  // 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 loc_key = params.loc_key;
  var bld_key = params.bld_key;
  var terr_key = params.terr_key;
  var flr_key = params.flr_key;
  var room_key = params.room_key;
  var deel = params.deel;
  var dep_key = params.dep_key;
  var persoon_key = params.persoon_key;
  var sletype = params.sletype;

  var hasOwner = false;
  var hasPosition = false;
  if (loc_key || bld_key || terr_key || flr_key || room_key)
    hasPosition = true;
  else if (dep_key || persoon_key)
    hasOwner = true;

  // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
  var authparams = user.checkAutorisation(sletype == "S"? ["WEB_SLEBOF", "WEB_SLEFOF"] : ["WEB_SLEBOF"]);
  // Na deze check heb ik in ieder geval rechten 1) sletype == "S": WEB_SLEBOF en/of WEB_SLEFOF rechten 2) sletype == "C" WEB_SLEBOF rechten.

  // WEB_SLEBOF: PRSread/PRSwrite: Niet van belang.
  // WEB_SLEBOF: ALGread: Hiermee kan ik sleutels/cilinders zien (met eventuale autorisatie op ruimte).
  // WEB_SLEBOF: ALGwrite: Hiermee kan ik cilinders koppelen aan/van een ruimte en kan ik sleutels en cilinders aan elkaar koppelen.
  var authparamsSLEBOF = user.checkAutorisation("WEB_SLEBOF", true);

  // WEB_SLEFOF: PRSread: NIET VAN BELANG (als iemand mijn sleutel (FOF-ALG-scope) heeft, en ik heb FOF-rechten, dan mag ik ook zien Wie)
  // WEB_SLEFOF: PRSwrite: Hiermee kan ik sleutels uitgeven aan een persoon binnen de PRS-scope
  // WEB_SLEFOF: ALGread: Hiermee kan ik sleutels zien (met eventuele autorisatie op ruimte).
  // WEB_SLEFOF: ALGwrite: Sleutels die vallen in deze scope mag ik uitgeven/innemen
  var authparamsSLEFOF = user.checkAutorisation("WEB_SLEFOF", true);

%>

  <html>
    <head>
<%    FCLTHeader.Generate({ outputmode: outputmode }); %>
    </head>
    <body id="listbody">

<%    // =======================================================
      // All header information been emitted. Now start building
      // the SQL-queries to do actual data retrieval
      // =======================================================


      var sqlPlaats = "";
      if (room_key)
        sqlPlaats += " AND d1.ins_alg_ruimte_key = " + room_key
                   + " AND d1.ins_alg_ruimte_type = 'R'";
      else if (flr_key)
        sqlPlaats += " AND aog.alg_verdieping_key = " + flr_key
                   + " AND d1.ins_alg_ruimte_type = 'R'";
      else if (terr_key)
        sqlPlaats += " AND d1.ins_alg_ruimte_key = " + terr_key
                   + " AND d1.ins_alg_ruimte_type = 'T'";
      else if (bld_key)
        sqlPlaats += " AND aog.alg_gebouw_key = " + bld_key
                   + " AND d1.ins_alg_ruimte_type = 'R'";
      else if (loc_key)
        sqlPlaats += " AND d1.ins_alg_locatie_key = " + loc_key
                   + " AND d1.ins_alg_ruimte_type = 'R'";

      // Nu filtercondities voor flexkenmerken toevoegen
      var sqlFlex = getKenmerkSql(sletype == "C"? "CIL" : "SLE", "s.ins_srtdeel_key");

      var sqlSleutels = "";
      var sqlCilinders = "";
      if (sletype != "C")
      { // ***** SLEUTELS *****//
        var sqlBasisSelect = " SELECT s.ins_srtdeel_key"
                           + "      , s.ins_srtdeel_omschrijving"
                           + "      , d.ins_deel_key"
                           + "      , d.ins_alg_ruimte_key_org"
                           + "      , s.ins_srtdeel_code"
                           + "      , sg.ins_srtgroep_key";
        var sqlBasisFrom = "   FROM ins_v_aanwezigsrtdeel s"
                         + "      , ins_v_aanwezigdeel d"
                         + "      , ins_v_aanwezigsrtgroep sg"
                         + "      , alg_v_aanweziglocatie l";
        var sqlBasisWhere = " WHERE s.ins_srtgroep_key = sg.ins_srtgroep_key"
                          + "   AND s.ins_srtdeel_key = d.ins_srtdeel_key"
                          + "   AND sg.ins_srtgroep_key = " + S("sle_ins_srt_groep_key")
                          + (deel
                            ? " AND d.ins_deel_upper LIKE " + safe.quoted_sql_wild("%" + deel + "%")
                            : "")
                          + sqlPlaats
                          + sqlFlex;

        // WEB_SLEFOF: ALGread: Kan eigen sleutels zien die ik uitgegeven heb of die nog op mijn bureau liggen (met scope op eigen ruimte (alg_ruimte_key/alg_ruimte_key_org))
        // Uitgegeven sleutels voor uitgegeven cilinders aan ruimte
        if (authparamsSLEFOF)
          sqlSleutels += sqlBasisSelect
                       + ", l.alg_locatie_code || '-' || aog.alg_gebouw_code || '-' || aog.alg_verdieping_code || '-' || aog.alg_ruimte_nr plaats"
                       + sqlBasisFrom
                       + ", alg_v_allonrgoed_gegevens aog"
                       + ", ins_v_aanwezigdeel d1"
                       + ", ins_v_aanwezigsrtdeel s1"
                       + ", ins_srtdeel_srtdeel ss"
                       + sqlBasisWhere
                       + " AND aog.alg_locatie_key = l.alg_locatie_key"
                       + " AND aog.alg_onroerendgoed_keys = d1.ins_alg_ruimte_key"
                       + " AND aog.alg_type = d1.ins_alg_ruimte_type"
                       + " AND d1.ins_alg_ruimte_key_org IS NOT NULL"
                       + " AND d.ins_alg_ruimte_type_org = 'R'"
                       + " AND d1.ins_alg_ruimte_type = 'R'" // Cilinder uitgegeven aan een ruimte
                       + " AND s1.ins_srtdeel_key = d1.ins_srtdeel_key"
                       + " AND ss.ins_srtdeel_key_1 = s1.ins_srtdeel_key" // cilinder
                       + " AND ss.ins_srtdeel_key_2 = s.ins_srtdeel_key" // sleutel
                       + (persoon_key
                         ? " AND d.ins_alg_ruimte_key = " + persoon_key
                         : "")
                       + (authparamsSLEFOF && authparamsSLEFOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_FOF_rooms"
                           + "   WHERE alg_ruimte_key = d.ins_alg_ruimte_key_org"
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        // Uitgegeven sleutels voor uitgegeven cilinders aan terrein
        if (authparamsSLEFOF && ! (bld_key || flr_key || room_key))
          sqlSleutels += " UNION "
                       + sqlBasisSelect
                       + ", l.alg_locatie_code || '-' || t.alg_terreinsector_code plaats"
                       + sqlBasisFrom
                       + ", alg_terreinsector t"
                          + ", ins_v_aanwezigdeel d1"
                          + ", ins_v_aanwezigsrtdeel s1"
                          + ", ins_srtdeel_srtdeel ss"
                       + sqlBasisWhere
                       + " AND d1.ins_alg_ruimte_key = t.alg_terreinsector_key"
                       + " AND l.alg_locatie_key = t.alg_locatie_key"
                       + " AND d1.ins_alg_ruimte_type = 'T'"
                       + " AND d1.ins_alg_ruimte_key_org IS NOT NULL"
                       + " AND d.ins_alg_ruimte_type_org = 'R'"
                       + " AND d1.ins_alg_ruimte_type = 'R'" // Cilinder uitgegeven aan een ruimte
                       + " AND s1.ins_srtdeel_key = d1.ins_srtdeel_key"
                       + " AND ss.ins_srtdeel_key_1 = s1.ins_srtdeel_key" // cilinder
                       + " AND ss.ins_srtdeel_key_2 = s.ins_srtdeel_key" // sleutel
                       + (persoon_key
                         ? " AND d.ins_alg_ruimte_key = " + persoon_key
                         : "")
                       + (authparamsSLEFOF && authparamsSLEFOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_FOF_rooms"
                           + "   WHERE alg_ruimte_key = d.ins_alg_ruimte_key_org"
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        // Uitgegeven sleutels voor niet uitgegeven cilinders (geen plaats)
        if (authparamsSLEFOF && sqlPlaats == "") // Niet uitgegeven cilincers uitsluiten bij filteren van plaats. (Toegang tot die plaats. Dan moet de cilinder uitgegeven en in de deur zitten.)
          sqlSleutels += " UNION "
                       + sqlBasisSelect
                       + ", null plaats"
                       + sqlBasisFrom
                       + ", alg_v_allonrgoed_gegevens aog"
                       + sqlBasisWhere
                       + " AND aog.alg_locatie_key = l.alg_locatie_key"
                       + " AND aog.alg_onroerendgoed_keys = d.ins_alg_ruimte_key_org"
                       + " AND aog.alg_type = d.ins_alg_ruimte_type_org"
                       + " AND d.ins_alg_ruimte_type_org = 'R'"
                       + (persoon_key
                         ? " AND d.ins_alg_ruimte_key = " + persoon_key
                         : "")
                       + (authparamsSLEFOF && authparamsSLEFOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_FOF_rooms"
                           + "   WHERE alg_ruimte_key = d.ins_alg_ruimte_key_org"
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        // Niet uitgegeven sleutels voor uitgegeven cilinders aan ruimte
        if (!hasOwner && authparamsSLEFOF)
          sqlSleutels += " UNION "
                       + sqlBasisSelect
                       + ", l.alg_locatie_code || '-' || aog.alg_gebouw_code || '-' || aog.alg_verdieping_code || '-' || aog.alg_ruimte_nr plaats"
                       + sqlBasisFrom
                       + ", alg_v_allonrgoed_gegevens aog"
                       + ", ins_v_aanwezigdeel d1"
                       + ", ins_v_aanwezigsrtdeel s1"
                       + ", ins_srtdeel_srtdeel ss"
                       + sqlBasisWhere
                       + " AND aog.alg_locatie_key = l.alg_locatie_key"
                       + " AND aog.alg_onroerendgoed_keys = d1.ins_alg_ruimte_key"
                       + " AND aog.alg_type = d1.ins_alg_ruimte_type"
                       + " AND d1.ins_alg_ruimte_type_org IS NOT NULL"
                       + " AND d1.ins_alg_ruimte_type = 'R'" // Cilinder uitgegeven aan een ruimte
                       + " AND d.ins_alg_ruimte_type = 'R'"
                       + " AND d.ins_alg_ruimte_type_org IS NULL"
                       + " AND s1.ins_srtdeel_key = d1.ins_srtdeel_key"
                       + " AND ss.ins_srtdeel_key_1 = s1.ins_srtdeel_key" // cilinder
                       + " AND ss.ins_srtdeel_key_2 = s.ins_srtdeel_key" // sleutel
                       + (authparamsSLEFOF && authparamsSLEFOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_FOF_rooms"
                           + "   WHERE alg_ruimte_key = d.ins_alg_ruimte_key"
                           + ")" // Er is een scope-beperking van kracht
                         : "");
        // Niet uitgegeven sleutels voor uitgegeven cilinders aan terrein
        if (!hasOwner && authparamsSLEFOF && ! (bld_key || flr_key || room_key))
          sqlSleutels += " UNION "
                       + sqlBasisSelect
                       + ", l.alg_locatie_code || '-' || t.alg_terreinsector_code plaats"
                       + sqlBasisFrom
                       + ", alg_terreinsector t"
                       + ", ins_v_aanwezigdeel d1"
                       + ", ins_v_aanwezigsrtdeel s1"
                       + ", ins_srtdeel_srtdeel ss"
                       + sqlBasisWhere
                       + " AND d1.ins_alg_ruimte_key = t.alg_terreinsector_key"
                       + " AND l.alg_locatie_key = t.alg_locatie_key"
                       + " AND d1.ins_alg_ruimte_type = 'T'"
                       + " AND d1.ins_alg_ruimte_type_org IS NOT NULL"
                       + " AND d.ins_alg_ruimte_type = 'R'"
                       + " AND d.ins_alg_ruimte_type_org IS NULL"
                       + " AND s1.ins_srtdeel_key = d1.ins_srtdeel_key"
                       + " AND ss.ins_srtdeel_key_1 = s1.ins_srtdeel_key" // cilinder
                       + " AND ss.ins_srtdeel_key_2 = s.ins_srtdeel_key" // sleutel
                       + (authparamsSLEFOF && authparamsSLEFOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_FOF_rooms"
                           + "   WHERE alg_ruimte_key = d.ins_alg_ruimte_key"
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        // Niet uitgegeven voor niet uitgegeven cilinders (geen plaats)
        if (!hasOwner && authparamsSLEFOF && sqlPlaats == "") // Niet uitgegeven cilincers uitsluiten bij filteren van plaats. (Toegang tot die plaats. Dan moet de cilinder uitgegeven en in de deur zitten.)
          sqlSleutels += " UNION "
                       + sqlBasisSelect
                       + ", null plaats"
                       + sqlBasisFrom
                       + ", alg_v_allonrgoed_gegevens aog"
                       + sqlBasisWhere
                       + " AND aog.alg_locatie_key = l.alg_locatie_key"
                       + " AND aog.alg_onroerendgoed_keys = d.ins_alg_ruimte_key"
                       + " AND aog.alg_type = d.ins_alg_ruimte_type"
                       + " AND d.ins_alg_ruimte_type = 'R'"
                       + " AND d.ins_alg_ruimte_type_org IS NULL"
                       + (authparamsSLEFOF && authparamsSLEFOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_FOF_rooms"
                           + "   WHERE alg_ruimte_key = d.ins_alg_ruimte_key"
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        // WEB_SLEBOF: ALGread: Kan sleutels zien die passen op mijn scope van ruimten of die nog op mij bureau liggen (alg_ruimte_key/alg_ruimte_key_org)
        // Dus kijken naar de scope van de cilinders. Welke sleutel passen daarop.
        //sqlBasisSelect = " SELECT s.ins_srtdeel_key"
        //               + "      , s.ins_srtdeel_omschrijving"
        //               + "      , d.ins_deel_key"
        //               + "      , d.ins_alg_ruimte_key_org"
        //               + "      , s.ins_srtdeel_code"
        //               + "      , sg.ins_srtgroep_key";
        sqlBasisFrom = "   FROM ins_v_aanwezigsrtdeel s1"
                     + "      , ins_v_aanwezigsrtdeel s"
                     + "      , ins_v_aanwezigdeel d1"
                     + "      , ins_v_aanwezigdeel d"
                     + "      , ins_srtdeel_srtdeel ss"
                     + "      , ins_v_aanwezigsrtgroep sg"
                     + "      , alg_v_allonrgoed_gegevens aog"
                     + "      , alg_v_aanweziglocatie l";
        sqlBasisWhere = " WHERE s1.ins_srtdeel_key = d1.ins_srtdeel_key"
                      + "   AND s.ins_srtdeel_key = d.ins_srtdeel_key"
                      + "   AND s1.ins_srtgroep_key = " + S("cil_ins_srt_groep_key")
                      + "   AND s.ins_srtgroep_key = " + S("sle_ins_srt_groep_key")
                      + "   AND ss.ins_srtdeel_key_1 = s1.ins_srtdeel_key" // cillinder
                      + "   AND ss.ins_srtdeel_key_2 = s.ins_srtdeel_key" // Sleutel
                      + "   AND s.ins_srtgroep_key = sg.ins_srtgroep_key"
                      + "   AND aog.alg_locatie_key = l.alg_locatie_key"
                      + "   AND sg.ins_srtgroep_key = " + S("sle_ins_srt_groep_key")
                      + (deel
                        ? " AND d.ins_deel_upper LIKE " + safe.quoted_sql_wild("%" + deel + "%")
                        : "")
                      + sqlPlaats
                      + sqlFlex;

        // Sleutels die passen op uitgegeven cilinders
        if (!hasOwner && authparamsSLEBOF)
          sqlSleutels += (sqlSleutels != ""
                         ? " UNION " // De string sqlSleutels is nog leeg indien geen SLEFOF rechten.
                         : "")
                       + sqlBasisSelect
                       + ", l.alg_locatie_code || '-' || aog.alg_gebouw_code || '-' || aog.alg_verdieping_code || '-' || aog.alg_ruimte_nr plaats"
                       + sqlBasisFrom
                       + sqlBasisWhere
                       + " AND aog.alg_onroerendgoed_keys = d1.ins_alg_ruimte_key"
                       + " AND aog.alg_type = d1.ins_alg_ruimte_type"
                       + " AND d1.ins_alg_ruimte_type_org = 'R'"
                       + " AND d1.ins_alg_ruimte_type = 'R'" // Cilinder uitgegeven aan een ruimte
                       + (authparamsSLEBOF && authparamsSLEBOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_ruimte_key FROM all_my_BOF_rooms"
                           + "   WHERE alg_ruimte_key = d1.ins_alg_ruimte_key"  // De ruimten waar de sleutel toegang tot geeft.
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        // Sleutels die passen op niet uitgegeven cilinders
        if (!hasOwner && authparamsSLEBOF && sqlPlaats == "") // Niet uitgegeven cilincers uitsluiten bij filteren van plaats. (Toegang tot die plaats. Dan moet de cilinder uitgegeven en in de deur zitten.)
          sqlSleutels += " UNION "
                      + sqlBasisSelect
                      + ", null plaats"
                      + sqlBasisFrom
                      + sqlBasisWhere
                      + " AND aog.alg_onroerendgoed_keys = d.ins_alg_ruimte_key"
                      + " AND aog.alg_type = d.ins_alg_ruimte_type"
                      + " AND d1.ins_alg_ruimte_type = 'R'"
                      + " AND d1.ins_alg_ruimte_type_org IS NULL"
                      + (authparamsSLEBOF && authparamsSLEBOF.ALGreadlevel > -1
                        ? " AND EXISTS"
                          + " (SELECT alg_ruimte_key FROM all_my_BOF_rooms"
                          + "   WHERE alg_ruimte_key = d1.ins_alg_ruimte_key"
                           + ")" // Er is een scope-beperking van kracht
                        : "");
      }
      else //(sletype == "C")
      { // ***** CILINDERS *****//
        // Cilinders zijn aan een ruimte of terrein gekoppeld. Cilinders die ergens anders aan zijn gekoppeld niet weergeven

        // WEB_SLEBOF: ALGread: Kan cilinders zien die in de deur zitten van mijn scope van ruimten of die nog op mij bureau liggen (alg_ruimte_key/alg_ruimte_key_org)
        // Uitgegeven en niet uitgegeven cilinders in een hek van een terrein
        if (!bld_key && !flr_key && !room_key)
          sqlCilinders = " SELECT s.ins_srtdeel_key"
                       + "      , s.ins_srtdeel_omschrijving"
                       + "      , d1.ins_deel_key"
                       + "      , d1.ins_alg_ruimte_key_org"
                       + "      , s.ins_srtdeel_code"
                       + "      , sg.ins_srtgroep_key"
                       + "      , l.alg_locatie_code || '-' || t.alg_terreinsector_code plaats"
                       + "   FROM ins_v_aanwezigsrtdeel s"
                       + "      , ins_v_aanwezigdeel d1"
                       + "      , ins_v_aanwezigsrtgroep sg"
                       + "      , alg_terreinsector t"
                       + "      , alg_v_aanweziglocatie l"
                       + " WHERE s.ins_srtgroep_key = sg.ins_srtgroep_key"
                       + "   AND s.ins_srtdeel_key = d1.ins_srtdeel_key(+)"
                       + "   AND sg.ins_srtgroep_key IN (" + S("sle_ins_srt_groep_key") + "," + S("cil_ins_srt_groep_key") + ")"
                       + (deel
                         ? " AND d1.ins_deel_upper LIKE " + safe.quoted_sql_wild("%" + deel + "%")
                         : "")
                       + "   AND s.ins_srtgroep_key = " + S("cil_ins_srt_groep_key") // Alleen cilinders kunnen aan een terrein gekoppeld zijn
                       + "   AND d1.ins_alg_ruimte_type = 'T'"
                       + "   AND d1.ins_alg_ruimte_key = t.alg_terreinsector_key"
                       + "   AND l.alg_locatie_key = t.alg_locatie_key"
                       + sqlPlaats
                       + (sqlPlaats != "" // Niet uitgegeven cilincers uitsluiten bij filteren van plaats. (Toegang tot die plaats. Dan moet de cilinder uitgegeven en in de deur zitten.)
                         ? " AND d1.ins_alg_ruimte_key_org IS NOT NULL"
                         : "")
                       + sqlFlex
                       + (authparamsSLEBOF && authparamsSLEBOF.ALGreadlevel > -1
                         ? " AND EXISTS"
                           + " (SELECT alg_locatie_key FROM fac_v_my_locations"
                           + "  WHERE prs_perslid_key = " + user_key
                           + "    AND niveau = " + authparamsSLEBOF.ALGreadlevel
                           + " AND alg_locatie_key = t.alg_locatie_key"
                           + ")" // Er is een scope-beperking van kracht
                         : "");

        var sqlBasisSelect = " SELECT s.ins_srtdeel_key"
                           + "      , s.ins_srtdeel_omschrijving"
                           + "      , d1.ins_deel_key"
                           + "      , d1.ins_alg_ruimte_key_org"
                           + "      , s.ins_srtdeel_code"
                           + "      , sg.ins_srtgroep_key";
        var sqlBasisFrom = "     FROM ins_v_aanwezigsrtdeel s"
                         + "        , ins_v_aanwezigdeel d1"
                         + "        , ins_v_aanwezigsrtgroep sg";
        var sqlBasisWhere =  "  WHERE s.ins_srtgroep_key = sg.ins_srtgroep_key"
                          + "     AND s.ins_srtdeel_key = d1.ins_srtdeel_key"
                          + "     AND aog.alg_locatie_key = l.alg_locatie_key"
                          + "     AND sg.ins_srtgroep_key = " + S("cil_ins_srt_groep_key")
                          + (deel
                            ? "   AND d1.ins_deel_upper LIKE " + safe.quoted_sql_wild("%" + deel + "%")
                            : "")
                          + sqlPlaats
                          + sqlFlex;

        // Uitgegeven cilinders in een deur van een ruimte binnen mijn scope en niet uitgegeven cilinders op mijn bureau
        sqlCilinders += (sqlCilinders != ""? " UNION " : "")
                      + sqlBasisSelect
                      + ", CASE"
                      + "  WHEN d1.ins_alg_ruimte_key_org IS NOT NULL"
                      + "  THEN l.alg_locatie_code || '-' || aog.alg_gebouw_code || '-' || aog.alg_verdieping_code || '-' || aog.alg_ruimte_nr"
                      + "  ELSE null"
                      + "  END plaats"
                      + sqlBasisFrom
                      + ", alg_v_allonrgoed_gegevens aog"
                      + ", alg_v_aanweziglocatie l"
                      + sqlBasisWhere
                      + (sqlPlaats != "" // Niet uitgegeven cilincers uitsluiten bij filteren van plaats. (Toegang tot die plaats. Dan moet de cilinder uitgegeven en in de deur zitten.)
                        ? " AND d1.ins_alg_ruimte_key_org IS NOT NULL"
                        : "")
                      + " AND aog.alg_onroerendgoed_keys = d1.ins_alg_ruimte_key"
                      + " AND aog.alg_type = d1.ins_alg_ruimte_type"
                      + " AND d1.ins_alg_ruimte_type = 'R'"
                      + (authparamsSLEBOF && authparamsSLEBOF.ALGreadlevel > -1
                        ? " AND EXISTS"
                          + " (SELECT alg_ruimte_key FROM all_my_BOF_rooms"
                          + "   WHERE alg_ruimte_key = d1.ins_alg_ruimte_key"
                           + ")" // Er is een scope-beperking van kracht
                        : "");

        // Uitgegeven cilinders die ik uitgegeven heb wil ik ook zien (Mijn eigen cilinders). Terwijl ik wellicht geen rechten heb op de deur van de ruimte waar de cilinder nu in zit.
        // Let op: Maar dan wel de plaats tonen van de ruimte/terreinsector waar de cilinder nu in de deur/hek zit (anders wordt die ook nog eens dubbel getoond).
        // De cilinder kan nu in een deur van een ruimte zitten of in een hek van een terreinsector.
        // Eerst de cilinders die in een deur van een ruimte zitten.
        sqlCilinders += " UNION "
                      + sqlBasisSelect
                      + ", l.alg_locatie_code || '-' || aog.alg_gebouw_code || '-' || aog.alg_verdieping_code || '-' || aog.alg_ruimte_nr plaats"
                      + sqlBasisFrom
                      + ", alg_v_allonrgoed_gegevens aog"
                      + ", alg_v_aanweziglocatie l"
                      + sqlBasisWhere
                      + " AND aog.alg_onroerendgoed_keys = d1.ins_alg_ruimte_key"
                      + " AND aog.alg_type = d1.ins_alg_ruimte_type"
                      + " AND d1.ins_alg_ruimte_type_org = 'R'"
                      + " AND aog.alg_locatie_key = l.alg_locatie_key"
                      + " AND d1.ins_alg_ruimte_type = 'R'"
                      + (authparamsSLEBOF && authparamsSLEBOF.ALGreadlevel > -1
                        ? " AND EXISTS"
                          + " (SELECT alg_ruimte_key FROM all_my_BOF_rooms"
                          + "   WHERE alg_ruimte_key = d1.ins_alg_ruimte_key_org"
                           + ")" // Er is een scope-beperking van kracht
                        : "");

        // Nu de cilinders die in een hek van een terreinsector zitten.
        sqlCilinders += " UNION "
                      + sqlBasisSelect
                      + ", l.alg_locatie_code || '-' || t.alg_terreinsector_code plaats"
                      + sqlBasisFrom
                      + ", alg_v_allonrgoed_gegevens aog"
                      + ", alg_v_aanweziglocatie l"
                      + ", alg_terreinsector t"
                      + sqlBasisWhere
                      + " AND aog.alg_onroerendgoed_keys = d1.ins_alg_ruimte_key"
                      + " AND aog.alg_type = d1.ins_alg_ruimte_type"
                      + " AND d1.ins_alg_ruimte_type_org = 'R'"
                      + " AND d1.ins_alg_ruimte_type = 'T'"
                      + " AND d1.ins_alg_ruimte_key = t.alg_terreinsector_key"
                      + " AND l.alg_locatie_key = t.alg_locatie_key"
                      + (authparamsSLEBOF && authparamsSLEBOF.ALGreadlevel > -1
                        ? " AND EXISTS"
                          + " (SELECT alg_ruimte_key FROM all_my_BOF_rooms"
                          + "   WHERE alg_ruimte_key = d1.ins_alg_ruimte_key_org"
                           + ")" // Er is een scope-beperking van kracht
                        : "");
      }

      var sql = sqlSleutels
              + (sqlSleutels != "" && sqlCilinders != ""
                ? " UNION " // Dubbelen sqlPosition/sqlOwner niet tonen
                : "")
              + sqlCilinders
              + " ORDER BY ins_srtgroep_key, ins_srtdeel_omschrijving ASC";

      sql = "SELECT tot.ins_srtdeel_key"
          + "     , tot.ins_srtdeel_omschrijving"
          + "     , COUNT (tot.ins_deel_key) aantalregels"
          + "     , COUNT (tot.ins_alg_ruimte_key_org) aantal_uitgegeven"
          + "     , tot.ins_srtdeel_code"
          + "     , tot.ins_srtgroep_key"
          + "     , MIN(tot.plaats) minplaats"
          + "     , MAX(tot.plaats) maxplaats"
          + "     , tot.ins_deel_key"
          + "  FROM (" + sql + ") tot"
          + "     , ins_v_aanwezigdeel deel"
          + " WHERE tot.ins_srtdeel_key = deel.ins_srtdeel_key"
          + " GROUP BY tot.ins_srtdeel_key"
          + "        , tot.ins_srtdeel_omschrijving"
          + "        , tot.ins_srtdeel_code"
          + "        , tot.ins_srtgroep_key"
          + "        , tot.ins_deel_key";

      sql = "SELECT totaal.ins_srtdeel_key"
          + "     , totaal.ins_srtdeel_omschrijving"
          + "     , COUNT(totaal.ins_deel_key) aantal" // Aantal sleutels
          + "     , SUM(totaal.aantal_uitgegeven) / (SUM(totaal.aantalregels) / COUNT(totaal.ins_deel_key)) aantal_uitgegeven" // Aantal uitgegeven is het aantal cilinder teveel (aantal uitgegeven / (aantal regels / aantal sleutels)
          + "     , totaal.ins_srtdeel_code"
          + "     , totaal.ins_srtgroep_key"
          + "     , MIN(minplaats) || CASE"
            + "                       WHEN MIN(minplaats) != MAX(maxplaats)"
            + "                       THEN '...'"
            + "                       ELSE ''"
            + "                       END plaats"
          + "  FROM (" + sql + ") totaal"
          + " GROUP BY totaal.ins_srtdeel_key"
          + "        , totaal.ins_srtdeel_omschrijving"
          + "        , totaal.ins_srtdeel_code"
          + "        , totaal.ins_srtgroep_key"
          // Ook de sleutel sets (ins_srtdeel) tonen die geen sleutels/cilinders bevatten
          + " UNION "
          + " SELECT s.ins_srtdeel_key"
          + "      , s.ins_srtdeel_omschrijving"
          + "      , 0 aantal"
          + "      , 0 aantal_uitgegeven"
          + "      , s.ins_srtdeel_code"
          + "      , sg.ins_srtgroep_key"
          + "      , NULL plaats"
          + "  FROM ins_v_aanwezigsrtdeel s"
          + "     , ins_v_aanwezigsrtgroep sg"
          + " WHERE s.ins_srtgroep_key = sg.ins_srtgroep_key"
          + "   AND sg.ins_srtgroep_key = " + (sletype == "S"? S("sle_ins_srt_groep_key") : S("cil_ins_srt_groep_key"))
          + "   AND NOT EXISTS (SELECT ins_deel_key"
          + "                     FROM ins_v_aanwezigdeel d"
          + "                    WHERE d.ins_srtdeel_key = s.ins_srtdeel_key)"
          + " ORDER BY ins_srtgroep_key"
          + "        , ins_srtdeel_omschrijving ASC";

        // Oracle 11g heeft de neiging fac_v_my_rooms te expanderen naar een
        // TEMP-tabel. Op zich niet eens zo'n slecht idee maar hij neemt daarbij
        // de filtering op prs_perslid_key nog niet mee
        // Dat forceren we dan maar via de WITH cluase.
        if (authparamsSLEFOF && authparamsSLEBOF && authparamsSLEFOF.ALGreadlevel == authparamsSLEBOF.ALGreadlevel)
            sql = sql.replace(/all_my_BOF_rooms/g, "all_my_FOF_rooms");

        var withs = [];
        if (sql.indexOf("all_my_FOF_rooms") > 0)
            withs.push("all_my_FOF_rooms AS"
                  + "   (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                  + "     WHERE prs_perslid_key = " + user_key
                  + "       AND niveau = " + authparamsSLEFOF.ALGreadlevel
                  + ")");

        if (sql.indexOf("all_my_BOF_rooms") > 0)
            withs.push("all_my_BOF_rooms AS"
                  + "   (SELECT alg_ruimte_key FROM fac_v_my_rooms"
                  + "     WHERE prs_perslid_key = " + user_key
                  + "       AND niveau = " + authparamsSLEBOF.ALGreadlevel
                  + ")");

        if (withs.length)
            sql = "SELECT * FROM (WITH " + withs.join(",") + "  " + sql + ")";

      ///////////////////////////////////////////////////////////
      //
      //      Now let's present the results:
      //
      //////////////////////////////////////////////////////////

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

      function fnrowData(oRs)
      {
        var sleSrtDeelKey = oRs("ins_srtdeel_key").value;
        var sleSrtGroepKey = oRs("ins_srtgroep_key").value;
        var sletype = (oRs("ins_srtgroep_key").value == S("sle_ins_srt_groep_key")? "S" : "C");

        var data = {sleSrtDeelKey: sleSrtDeelKey, sleSrtGroepKey: sleSrtGroepKey, sletype: sletype};
        return JSON.stringify(data);
      }

      function fnrowActionEnabler(oRs)
      {
        var eEdit = false;
        var eKoppelen = S("sle_cil_koppelen") == 1 && // Anders hoeven we het niet te weten
                        authparamsSLEBOF &&
                        authparamsSLEBOF.ALGwritelevel < 9 && // Minimale eis is veel goedkoper
                        sle.kanKoppelen(oRs("ins_srtdeel_key").value);

        if (authparamsSLEBOF && authparamsSLEBOF.ALGwritelevel < 9 && authparamsSLEBOF.PRSwritelevel < 9)
        {
          eEdit = true; // Indien enige actie dan wordt de actie niet getoond en is het de default actie op de hele regel
        }

        var data = {eEdit: eEdit, eKoppelen: eKoppelen};
        return data;
      }

      function fnBeschikbaar(oRs)
      {
          return oRs("aantal").value - oRs("aantal_uitgegeven").value;
      }

      var addurl = "appl/sle/sle_srtdeel.asp?couple=1";
      if (authparamsSLEBOF && authparamsSLEBOF.ALGwritelevel < 9 && authparamsSLEBOF.PRSwritelevel < 9)
      {
        addButton = [{ icon: "plus.png", title: L("lcl_add"), action: "FcltMgr.openDetail('" + addurl + "', L('lcl_add'))" }]
      }

      /***************************************************
       * End callback functies ResultsetTable for FO en BO
       **************************************************/

      // TODO conditionele Add button
      var rst = new ResultsetTable({ keyColumn: "ins_srtdeel_key",
                                     sql: sql,
                                     ID: "insdeeltable",
                                     rowData: fnrowData,
                                     rowActionEnabler: fnrowActionEnabler,
                                     flexModule: "INS",
                                     flexId: "ins_srtdeel_key",
                                     multiple: true,
                                     filterParams: params,
                                     outputmode: outputmode,
                                     title: params.sletype == "S"? L("lcl_sle_sleutel_sets") : L("lcl_cil_cilinder_sets"),
                                     showAll: showall,
                                     buttons: addButton
                                   });

      // Kolommen

      rst.addColumn(new Column({caption: L("lcl_sle_code"), content: "ins_srtdeel_code"}));
      rst.addColumn(new Column({caption: L("lcl_sle_sleutel_omsch"), content: "ins_srtdeel_omschrijving"}));
      rst.addColumn(new Column({caption: L("lcl_sle_toegang"), content: "plaats"})); // Op welke ruimten/terreinen hebben de sleutels of cilinders toegang toe
      rst.addColumn(new Column({caption: L("lcl_count"), content: "aantal", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_sle_lent_out"), content: "aantal_uitgegeven", datatype: "number"}));
      rst.addColumn(new Column({caption: L("lcl_sle_available"), content: fnBeschikbaar, datatype: "number"}));

      // Acties
      rst.addAction({ action: "sleEdit", caption: L("lcl_change"), isDefault: true});
      if (S("sle_cil_koppelen") == 1)
        rst.addAction({ action: "sleSleutelCilinder", caption: L("lcl_sle_koppelen"), enabler: "eKoppelen", multi: true, multiOnce: true });

      var count = rst.processResultset();
%>
    </body>
  </html>
<%
}
%>
