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

    File:        res_bez_desk.asp
    Description: De pool-reserveringen interface
    Parameters:
    Context:
    Note:        LET OP: Die bestand maakt gebruik van data_recordset.
                         In plaats van oRs("veld_key").Value moet je
                                       oRs.Fields("veld_key").Value doen
*/ %>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/data_recordset.inc" -->
<!-- #include file="../shared/calendar.inc" -->
<!-- #include file="../Shared/resultset_table_v2.inc" -->

<%
//var res_room_key = getQParamInt("res_room_key", -1); // loket waar medewerker nu achter zit

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

var res_key = getQParamInt("key", -1);
var forDateTime = getQParamDate("forDateTime", new Date);
var datepicker = getQParamInt("datepicker", 0); // undocumented debug: show datepicker
if (datepicker)
{
    FCLTHeader.Requires({ js: ["jquery.timepicker-table.js"],
                          css: ["timePicker-table.css"] });
}

var meekijken = false;
if (res_key > -1)
{
    // Alleen meekijken als men WEB_RESMSU rechten heeft.
    var resauthParams = user.checkAutorisation("WEB_RESMSU", false);
    meekijken = true;
}
%>

<html>
  <head>
<%  FCLTHeader.Generate() %>

    <script type="text/javascript">
        function loket_oproepen(row)
        {
          $(row).addClass('dirty');
          var bez_key = row.getAttribute("ROWKEY");
          var data = { bez_key: bez_key };
          protectRequest.dataToken(data);
          $.post("res_bez_oproep.asp",
                 data,
                 FcltCallbackRefresh,
                 "json");
        }
        function loket_opnieuw_oproepen(row)
        {
          var bez_key = row.getAttribute("ROWKEY");
          var data = { bez_key: bez_key, opnieuw: 1 };
          protectRequest.dataToken(data);
          $.post("res_bez_oproep.asp",
                 data,
                 FcltCallbackRefresh,
                 "json");
        }
        function next_oproepen(res_key)
        {
          var data = { res_key: res_key };
          protectRequest.dataToken(data);
          $.post("res_bez_oproep.asp",
                 data,
                 FcltCallbackRefresh,
                 "json");
        }
        function reload()
        {
            var url = "res_bez_desk.asp?key=<%=res_key%>";
            if (<%=datepicker%> == 1)
            {
                url += "&datepicker=1&forDateTime=" + $("#forDateTime").val();
            }
            window.location.href = url;
        }
        setTimeout('reload()', <%=S("res_bez_desk_refresh")%> * 1000)
    </script>
  </head>

  <body class="showmode">
<%
    if (datepicker) // debugging
    {
        %><table><%
        FCLTcalendar("forDateTime",
                       { label   : "TEST met specifieke datum <span onclick='reload()'><em>Reload</em></span>",
                         datum    : forDateTime,
                         timeField: true,
                         timeStep : 15, // TODO: Is nog wel erg hard. Zie ook mld_edit_melding.js
                         startTime: 8,
                         endTime  : 18
                         //trclass: "trenddate",
                         //addClass: (mld_melding.rsv_ruimte_key > 0? "mldres" : null) // Als de melding onder een reservering valt dan addClass toevoegen.
                       });
        %></table><%
    }

    if (meekijken)
    {
        // Gebruiker met WEB_RESMSU rechten kan meekijken
        var ressql = "SELECT " + res_key + " res_reservering_key"
                   + "  FROM DUAL";
    }
    else
    {
        // Alle ruimte reserveringen met (minstens) een deelreservering vandaag waar ik host ben
        var ressql = "SELECT res_reservering_key"
                   + "  FROM res_v_aanwezigrsv_ruimte rrr "
                   + " WHERE rrr.res_ruimte_opstel_key IS NOT NULL"
                   + "   AND rrr.res_rsv_ruimte_host_key = " + user_key
                   + "   AND res_rsv_ruimte_van BETWEEN " + forDateTime.toSQL() + " AND " + forDateTime.toSQL(true) + " + " + S("res_pool_early")/60/24
                   + "   AND res_rsv_ruimte_tot BETWEEN " + forDateTime.toSQL(true) + " - " + S("res_pool_late")/60/24 + " AND " + forDateTime.endToSQL();
        //Oracle.Execute(sql);
    }

    // Alle deelreserveringen (vandaag) van bovenstaande reserveringen
    // Bij een pool-reserering zullen de andere deelreserveringen voor andere contact's zijn
    // We zijn vooral geintereseerd in de bezoekers
    var sql = "SELECT rrr.res_reservering_key"
            + "     , res_reservering_ispool"
            + "     , rrr.res_rsv_ruimte_key"
            + "     , rrr.res_rsv_ruimte_volgnr"
            + "     , res_rsv_ruimte_van"
            + "     , rrr.res_rsv_ruimte_tot"
            + "     , res_rsv_ruimte_omschrijving"
            + "     , " + lcl.xsqla('rr.res_ruimte_nr', 'rr.res_ruimte_key')
            + "     , res_rsv_ruimte_host_key"
            + "     , prs_perslid_naam_full"
            + "     , bez_afspraak_naam"
            + "     , bez_bezoekers_key"
            + "     , bez_bezoekers_pasnr"
            + "     , bez_bezoekers_done"   // aangemeld bij receptie
            + "     , bez_bezoekers_oproep" // opgeroepen
            + "     , bez_bezoekers_out"    // helemaal klaar
            + "     , CASE WHEN (rr.res_ruimte_startdatum  IS NULL OR rr.res_ruimte_startdatum <= rrr.res_rsv_ruimte_van)"
                    + "     THEN 1"
                    + "     ELSE 0"
                    + "     END startr"
            + "     , CASE WHEN (rr.res_ruimte_vervaldatum IS NULL OR rr.res_ruimte_vervaldatum > rrr.res_rsv_ruimte_van)"
                    + "     THEN 1"
                    + "     ELSE 0"
                    + "     END verval"
            + "  FROM res_ruimte rr, "
            + "       res_ruimte_opstelling rro,"
            + "       res_v_aanwezigrsv_ruimte rrr ,"
            + "       res_reservering r ,"
            + "       prs_v_perslid_fullnames p,"
            + "       bez_afspraak a,"
            + "       bez_actie ba,"
            + "       bez_bezoekers bb"
            + " WHERE rrr.res_reservering_key = r.res_reservering_key"
            + "   AND (res_reservering_ispool = 1 OR rrr.res_rsv_ruimte_host_key = " + user_key + ")"
            + "   AND BITAND(COALESCE(bez_actie_flags, 1), 1) = 1" // Alleen oproepers, geen gewone reserveringen met afhaal bezoekers
            + "   AND rr.res_ruimte_key = rro.res_ruimte_key"
            + "   AND rro.res_ruimte_opstel_key = rrr.res_ruimte_opstel_key"
            + "   AND rrr.res_rsv_ruimte_host_key = p.prs_perslid_key"
            + "   AND rrr.res_rsv_ruimte_key = a.res_rsv_ruimte_key(+)" // bezoeker of afspraak hoeft niet te bestaan
            + "   AND a.bez_afspraak_key = bb.bez_afspraak_key(+)"
            + "   AND a.bez_actie_key = ba.bez_actie_key(+)"
            + "   AND bb.bez_bezoekers_out IS NULL"
                // Dit is nodig als de deelreserveringen van een POOL verschillende datums hebben. Dat kan
            + "   AND res_rsv_ruimte_van BETWEEN " + forDateTime.toSQL() + " AND " + forDateTime.endToSQL()
            + "   AND EXISTS (SELECT 1 FROM (" + ressql + ") res2"
            + "                WHERE res2.res_reservering_key = rrr.res_reservering_key)"
            + "   ORDER BY res_reservering_key, res_ruimte_nr, "
            + "            bez_bezoekers_oproep DESC NULLS LAST, "
            + "            bez_bezoekers_done NULLS LAST, "
            + "            bez_afspraak_naam"; // Langst wachtende bezoeker bovenaan
            // JGL: Bovenstaande ORDER BY werkt niet zoals ik wil: bezoekers die nog niet zijn opgeroepen
            //      worden nu gesorteerd per ruimte waar ze oorspronkelijk onder aangemeld zijn terwijl
            //      dat helemaal niet mag uitmaken. Ik kreeg het niet simpel in de order-by opgelost dus
            //      maar in show_freebezoekers
    var oRs = Oracle.Execute(sql);

    var prev_res_key = -1;
    var prev_rsv_key = -1;
    var prev_descr = "";
    var loketten = [];        // de loketten onder deze reservering (= deelreserveringen)
    var freebezoekers = []; // nog niet opgeroepen bezoekers
    var anyfound = false;
    while (!oRs.Eof)
    {
        // Als het geen pool-reservering is en er zijn geen bezoekers dan heeft
        // deze reservering niets te zoeken in dit scherm. Het was echter moeilijk
        // in de SQL-query uit te sluiten (outer join op bezoekers als ispool, anders inner join)
        if (!oRs("res_reservering_ispool").Value && !oRs("bez_bezoekers_key").Value)
        {
            oRs.MoveNext();
            continue;
        }
        anyfound = true;
        var res_key = oRs("res_reservering_key").Value;
        var rsv_key = oRs("res_rsv_ruimte_key").Value;
        var descr = L("lcl_res_desk_head").format(res_key + (oRs("res_reservering_ispool").Value?"":"/" + oRs("res_rsv_ruimte_volgnr").Value),
                                                  oRs("res_rsv_ruimte_omschrijving").Value||"",
                                                  toTimeString(oRs("res_rsv_ruimte_van").Value),
                                                  toTimeString(oRs("res_rsv_ruimte_tot").Value));
        if (prev_res_key != res_key)
        {
            // vorige freebezoekers afronden
            if (prev_res_key > 0)
            {
                show_loketten(prev_res_key, prev_descr, loketten);
              %></div><%
                show_freebezoekers(prev_res_key, freebezoekers);
              %></div><%
            }

            prev_res_key = res_key;
            prev_descr = descr;
            prev_rsv_key = -1;
            freebezoekers = [];
            loketten = [];
        }
        if (prev_rsv_key != rsv_key)
        {
            var data = { volgnr: oRs("res_rsv_ruimte_volgnr").Value,
                         ruimtenr: oRs("res_ruimte_nr").Value,
                         host: oRs("prs_perslid_naam_full").Value,
                         self: oRs("res_rsv_ruimte_host_key").Value == user_key,
                         oproep: oRs("bez_bezoekers_oproep").Value,
                         bez_key: oRs("bez_bezoekers_key").Value,
                         start: oRs("startr").Value,
                         verval: oRs("verval").Value
                       }
            // Bezoekers die binnen zijn maar nog niet opgeroepen kunnen toevallig aan
            // ons loket gekoppeld zijn. Dan willen we ze nog niet tonen bij onze loket
            if (oRs("bez_bezoekers_oproep").Value != null)
            {
                data.beznaam = oRs("bez_afspraak_naam").Value;
                data.badge = oRs("bez_bezoekers_pasnr").Value;
                data.aangemeld = oRs("bez_bezoekers_done").Value;
             }

            loketten.push(data);
            prev_rsv_key = rsv_key;
        }
        if (oRs("bez_afspraak_naam").Value != null && oRs("bez_bezoekers_oproep").Value == null)
        {
            freebezoekers.push({ bez_key: oRs("bez_bezoekers_key").Value,
                                 naam: oRs("bez_afspraak_naam").Value,
                                 badge: oRs("bez_bezoekers_pasnr").Value,
                                 aangemeld: oRs("bez_bezoekers_done").Value
                               });
        }

        oRs.MoveNext()
    }
    oRs.Close();
    if (!anyfound)
    {
        Response.Write("<body class='simpelpage'>");
        Response.Write(L("lcl_norespool"));
        Response.Write("</body></html>")
        Response.End;
        //shared.simpel_page(L("lcl_norespool") + "<script>setTimeout('reload()', " + S("res_bez_desk_refresh")*1000 + ")</script>");
    }
    if (prev_res_key > 0)
    {
        show_loketten(prev_res_key, prev_descr, loketten);
      %></div><%
        show_freebezoekers(prev_res_key, freebezoekers);
      %></div><%
    }

function fnrowBezoekerEnabler(oRs)
{
    return { eOproep: (!meekijken && oRs.Fields("aangemeld").Value != null)
           }
}

function fnrowHerhaalEnabler(oRs)
{
    var enableHerOproep = false;
    if (oRs.Fields("self").Value)
        enableHerOproep = (oRs.Fields("aangemeld").Value != null);
    return { eHerOproep: enableHerOproep
           }
}

function fnWacht(oRs)
{
    if (oRs.Fields("oproep").Value == null)
        return "";
    var aangemeld = new Date(oRs.Fields("aangemeld").Value);
    var oproep = new Date(oRs.Fields("oproep").Value);
    var wachttijd = Math.floor((oproep - aangemeld) / 1000 / 60);
    return wachttijd + "&nbsp;" + L("lcl_res_bez_minutes");
}

function fnInside(oRs)
{
    if (oRs.Fields("oproep").Value == null)
        return "";
    var nu = new Date();
    var oproep = new Date(oRs.Fields("oproep").Value);
    var intijd = Math.floor((nu - oproep) / 1000 / 60);
    return intijd + "&nbsp;" + L("lcl_res_bez_minutes");
}

function fnLoketRowClass (oRs)
{
    if (oRs.Fields("self").Value)
        return "bezPoolLoketself"  + (oRs.Fields("startr").Value == 0 || oRs.Fields("verval").Value == 0? " res_fatal" : "");
    else
        return "bezPoolLoketother" + (oRs.Fields("startr").Value == 0 || oRs.Fields("verval").Value == 0? " res_fatal" : "");
}

function fnRuimtenr (oRs)
{
    return oRs.Fields("ruimtenr").Value + (oRs.Fields("startr").Value == 0 || oRs.Fields("verval").Value == 0? L("lcl_inactive_data_suffix") : "");
}

function show_loketten(res_key, descr, loketten)
{
    var buttons = [{ icon: "fa-fclt-refresh", title: L("lcl_refresh"), action: "reload()" } ];
    if (!meekijken) // Alleen de hosts kunnen bezoekers oproepen.
        buttons.push({ icon: "fa-volume-up", title: L("lcl_res_bez_oproepen"), action: "next_oproepen(" + res_key + ")" });

    IFRAMER_HEADER(descr , buttons, { id: 1 });
    var rst = new ResultsetTable({ dataset: loketten,
                                   rstableNr: 1,
                                   keyColumn: "bez_key",
                                   ID: "lokettable" + res_key,
                                   rowClass: fnLoketRowClass,
                                   rowActionEnabler: fnrowHerhaalEnabler,
                                   noSetSummary: true,
                                   noPrint:true,
                                   noLoading: true // scrollbar verdwijnt anders?
                                  });

    rst.addColumn(new Column({caption:"#", content:"volgnr", align: "center" }));
    rst.addColumn(new Column({caption: L("lcl_res_bez_loket"), content: fnRuimtenr }));
    rst.addColumn(new Column({caption: L("lcl_host"), content:"host" }));

    rst.addColumn(new Column({caption: L("lcl_res_bez_name"), content: "beznaam" }));
    rst.addColumn(new Column({caption: L("lcl_res_bez_badgenr"), content: "badge" }));
    rst.addColumn(new Column({caption: L("lcl_bez_done_date"), content: "aangemeld", datatype: "time" }));
    rst.addColumn(new Column({caption: L("lcl_res_bez_wait"), content: fnWacht }));
    rst.addColumn(new Column({caption: L("lcl_res_bez_called"), content: "oproep", hasActions: true, datatype: "time"}));
    rst.addColumn(new Column({caption: L("lcl_res_bez_inside"), content: fnInside }));

    rst.addAction({action: "loket_opnieuw_oproepen", caption: L("lcl_res_bez_opnieuw_oproepen"), enabler: "eHerOproep" });

    rst.processResultset();
}

function fnBezRowClass (oRs)
{
    if (oRs.Fields("aangemeld").Value != null)
        return "bezPoolBinnen";
    else
        return "";
}
function show_freebezoekers(res_key, freebezoekers)
{
    // Sorteren: langst wachtende bovenaan, daarbinnen op alfabet
    function date_sort(dta, dtb)
    {
        if (dta != null)  // Let op: dta is nog een OLEDB date en dan werkt if (dta) ... niet
        {
            if (dtb == null)
                return -1;
            else
                return new Date(dta) - new Date(dtb)
        }
        else
            if (dtb != null)
                return 1;
    }

    function bez_sort(a, b)
    {
        if (a.aangemeld != null || b.aangemeld != null)
            return date_sort(a.aangemeld, b.aangemeld);
        return a.naam > b.naam?1:-1;
    }
    freebezoekers.sort(bez_sort);

    IFRAMER_HEADER(L("lcl_res_desk_expected"), [], { id: 2 });
    var rst = new ResultsetTable({ dataset: freebezoekers,
                                   rstableNr: 2,
                                   keyColumn: "bez_key",
                                   ID: "freebeztable" + res_key,
                                   noSetSummary: true,
                                   rowClass: fnBezRowClass,
                                   rowActionEnabler: fnrowBezoekerEnabler,
                                   noPrint:true,
                                   noLoading: true, // scrollbar verdwijnt anders?
                                   emptySetString: "" // Doen we zelf verderop
                                  });

    rst.addColumn(new Column({caption: L("lcl_res_bez_name"), content:"naam" }));
    rst.addColumn(new Column({caption: L("lcl_bez_done_date"), content: "aangemeld", datatype: "time"}));
    rst.addColumn(new Column({caption: L("lcl_res_bez_badgenr"), content:"badge", hasActions: true}));
    rst.addAction({action: "loket_oproepen", caption: L("lcl_res_bez_oproepen"), enabler: "eOproep" });
    rst.processResultset();
}
%>
  </body>
</html>
<% ASPPAGE_END(); %>
