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

     File:        reservering_new_by_placetime_ruimte.asp
     Description: Alternatieve interface om (eenvoudig) een reserveerbare ruimte en tijd te kunnen kiezen
                  zoals koppelzaal
     Parameters:  res_disc:  required de res_discipline van de ruimten
                  geb_key:   optioneel voorgeselecteerd gebouw
                  resdate:   optioneel voorgeselecteerde datum

                  en verder wat sturings- en overrule-parameters zoals hieronder genoemd
     Context:     -
     Note:        - Dit is de MOBILE versie van res_rsv_ruimte_by_placetime.asp

*/%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../res/res.inc" -->
<!-- #include file="./mobile.inc" -->
<!-- #include file="../Shared/FlexFiles.inc" -->
<!-- #include file="./iface.inc" -->
<!-- #include file="./resultset_table.inc" -->
<!-- #include file="../res/res_rsv_ruimte_by_placetime.inc" -->
<%
var res_disc_key_arr = getQParamIntArray("res_disc");  // required, misschien default uit Setting?

// Check of de juiste res-catalogi gebruikt worden.
var sql = "SELECT "+lcl.xsqla("rdis.ins_discipline_omschrijving", "rdis.ins_discipline_key")
        + "  FROM res_discipline rdis"
        + " WHERE ins_discipline_min_level IN (3, 5) "
        + "   AND ins_discipline_key IN (" + res_disc_key_arr.join(",") + ")";
var oRs = Oracle.Execute(sql);
if (!oRs.eof)
    var catalogusnaam = oRs("ins_discipline_omschrijving").Value;
else
{
    Response.Write("No, this is an inappropriate value for parameter res_disc")
    Response.End;
}
oRs.Close();

var authparams = user.checkAutorisation("WEB_RESUSE", false, res_disc_key_arr);

var act_key     = getQParamInt("act_key", -1);
var geb_key     = getQParamInt("geb_key", -1);
var floor_key   = getQParamInt("floor_key", -1);
var room_key    = getQParamInt("room_key", -1);
var werkpl_key  = getQParamInt("wsp_key", -1);
var daylimit    = getQParamInt("daylimit", 12);           // na daylimit kun je voor de eerste dag niet meer reserveren, default 12:00, werkt niet icm offset
var afternoon   = new Date().getHours() >= daylimit;
var dateoffset  = getQParamInt("offset", afternoon?1:0);  // 12:00 default morgen ipv vandaag
var datelimit   = getQParamInt("limit", 7);               // aantal te kiezen dagen tov offset
var floorselect = getQParamInt("floorselect", 0);         // na gebouw ook de verdiepingen laten kiezen
var mapselect   = getQParamInt("mapselect", 1) == 1;      // werkplek via plattegrond kiezen
var zoom        = getQParamFloat("zoom", 2);

var resdate     = getQParamDate("date", null);            // hoe geef je zelf een date mee?

var dagcapaciteit          = getQParamFloat("capaciteit", 9); // aantal uren beschikbaar per dag tbv berekening van globale vulling
var minimumbeschikbaarheid = getQParamFloat("minbes", 1.1);   // minder dan zoveel uur beschikbaar beschouwen we onbeschikbaar
var onlyfree               = getQParamInt("onlyfree", 0);     // moeten bezette werkplekken wel (0) of niet (1) (onklikbaar) getoond worden in de lijst

var transitParam = buildTransitParam(["zoom", "daylimit", "offset", "res_disc", "act_key", "geb_key", "floor_key", "wsp_key", "date", "onlyfree", "floorselect", "mapselect", "thema_key", "themaI_key", "bordlabel_key", "limit", "capaciteit", "minbes"]);

var qrc = getQParamInt("qrc", 0) != 0;

var thema_key     = getQParamInt("thema_key", 12);
var themaI_key    = getQParamInt("themaI_key", 13);
var bordlabel_key = getQParamInt("bordlabel_key", 13);
%>
<html>
  <head>
<% FCLTMHeader.Generate(); %>
    <style>
    li.beschikb0 i.fa {
        color:  #E50012;
    }
    li.beschikb10 i.fa {
        color:  #FF8504;
    }
    .beschikb50 a img {
        outline: 4px solid #A5D200;
    }
    li.beschikb50 i.fa{
        color:  #A5D200;
    }
    li.beschikb100 i.fa {
        color:  #0AAA32;
    }
    li.vrijweekend i.fa, li.vrijedag i.fa {
        color:  #eee;
    }

    li.beschikb0 {
        color: #FFF;
        background-color: #E50012;
    }
    li.beschikb10 {
        color: #FFF;
        background-color: #FF8504;
    }
    li.beschikb50 {
        color: #FFF;
        background-color: #A5D200;
    }
    li.beschikb100 {
        color : #FFF;
        background-color : #0AAA32;
    }
    li.vrijedag {
        color : #333;
        background-color : #eee;
        cursor: auto;
    }
    li.vrijweekend {
        color : #f33;
        background-color : #eee;
        cursor: auto;
    }
    li.werkweekend {
        color : #f33;
        background-color : inherit;
    }
    </style>
    <script>
    // shows the floorplan
    function plan(verdieping_key, res_disc_key_arr, thema_key, themaI_key, res_van, bordlabel_key)
    {
        window.location.href = "<%=rooturl%>/appl/pda/res_plattegrond.asp?zoom=<%=zoom%>&verdieping_key=" + verdieping_key + "&res_disc=" + res_disc_key_arr + "&thema_key=" + thema_key + "&themaI_key=" + themaI_key + "&bordlabel_key=" + bordlabel_key + "&res_van=" + res_van;
    }
    </script>
  </head>

  <body>
<%
    var buttons =  [];
    function getGebouw(p_geb_key)
    {
        var sql = "SELECT g.alg_gebouw_werkdagen"
                + "     , g.alg_gebouw_naam"
                + "  FROM alg_v_aanweziggebouw g"
                + " WHERE g.alg_gebouw_key = " + geb_key;
        var oRs = Oracle.Execute(sql);
        var result = { alleenwerkdagen: oRs("alg_gebouw_werkdagen").Value
                     , naam: oRs("alg_gebouw_naam").Value
                     };
        oRs.Close();

        return result;
    }

    // 1: KIES GEBOUW INDIEN NOG NIET BEKEND
    if (geb_key == -1)
    {
        PAGE_START({id: "page-1", pclass: "reservering-new"});
            HEADER({title: L("lcl_beschikbaarheid_by_bld").format(catalogusnaam), back:!qrc, home:!qrc});
            CONTENT_START();
             //   // Toon eerst maximaal 3 favorieten (eerder gereserveerde werkplekken).
             //   function fnFavWP_Submit(oRs)
             //   {
             //     return "?geb_key=" + oRs("alg_gebouw_key").Value
             //          + "&floor_key=" + oRs("alg_verdieping_key").Value
             //          + "&wsp_key=" + oRs("res_deel_key").Value + transitParam;
             //   }
             //   function fnFavWP_colSubHeader(oRs)
             //   {
             //       var result = oRs("alg_gebouw_naam").Value;
             //       result += (result ? ", " : "") + oRs("alg_locatie_plaats").Value;
             //       return result;
             //   }
             //
             //   var sql = rrpt.mijn_verdiepingen_met_resdelen_hist_sql(res_disc_key_arr, authparams.ALGwritelevel)
             //   var rst = new ResultsetTable({ sql: sql
             //                               ,  tableTitle: L("lcl_res_recent")
             //                               ,  keyColumn: "alg_gebouw_key"
             //                               ,  linkColumn: fnFavWP_Submit
             //                               ,  headerColumn: "res_deel_omschrijving"
             //                               ,  detailColumn: "alg_verdieping_omschrijving"
             //                               ,  subheaderColumn: fnFavWP_colSubHeader
             //                               ,  iconColumn: fnRecentIcon
             //                               ,  ID: "resgebtable"
             //                               ,  showAll: true
             //                               ,  emptyWhenNoResult: true
             //                               });
             //   var fav = rst.processResultset();
                var fav = -1;

                // Toon de gebouwen waar werkplekken gereserveerd kunnen worden.
                function fnSubmit(oRs)
                {
                  return "?geb_key="+ oRs("alg_gebouw_key").Value + transitParam;
                }
                function fnRecentIcon(oRs)
                {
                    return "fa-history";
                }
                function fnGebouwIcon(oRs)
                {
                    return SYMBOL(oRs("alg_gebouw_image").Value, { "module": "ALGPHG", "key": oRs("alg_gebouw_key").Value, "defVal": "fa-building" });
                }

                var sql = rrpt.mijn_verdiepingen_met_resruimten_sql(res_disc_key_arr, act_key, geb_key, authparams.ALGwritelevel, dateoffset);
                var rst = new ResultsetTable({ sql: sql
                                            ,  tableTitle: fav > 0 ? L("lcl_mobile_gebouwen") : ""
                                            ,  keyColumn: "alg_gebouw_key"
                                            ,  linkColumn: fnSubmit
                                            ,  singleLink: true
                                            ,  headerColumn: "alg_gebouw_naam"
                                            ,  subheaderColumn: "alg_locatie_plaats"
                                            ,  detailColumn: "alg_locatie_plaats"
                                            ,  iconColumn: fnGebouwIcon
                                            ,  ID: "resgebtable"
                                            ,  showAll: true
                                            ,  emptySetString: L("lcl_empty")
                                            });
                var cnt = rst.processResultset();
            CONTENT_END();
            FOOTER();
        PAGE_END();
    }   // geb_key


    // 2: KIES DATUM VOOR GEGEVEN GEBOUW INDIEN NOG NIET BEKEND
    if (geb_key>0 && resdate == null)
    {
        var gebouw = getGebouw(geb_key);

        PAGE_START({id: "page-2", pclass: "reservering00"});
            HEADER({title: L("lcl_beschikbaarheid_by_day").format(gebouw.naam), back:true, home:!qrc });
            CONTENT_START();
                function fnrowClassD(oRs)
                {
                    var bcls ="";
                    if (oRs("vrijedag").Value > 0)
                        bcls += "vrijedag";
                    else if (gebouw.alleenwerkdagen && (oRs("weekdag").Value == 1 || oRs("weekdag").Value == 7))
                    {
                        bcls += " vrijweekend";
                    }
                    else
                    {
                        bcls += rrpt.bezettings_class_ruimte(oRs("gevuld").Value, dagcapaciteit*aantalitems, minimumbeschikbaarheid*aantalitems);
                    }
                    return bcls;
                }

                function fnBeschikbaarheid(oRs)
                {
                    var txt = "";
                    if (oRs("vrijedag").Value == 0 && (!gebouw.alleenwerkdagen || (gebouw.alleenwerkdagen && (oRs("weekdag").Value != 1 && oRs("weekdag").Value != 7))))
                    {
                        var beschikbaarheid = ((1 - (oRs("gevuld").Value/gebouwcapaciteit))*100).toFixed(0); // 0..100
                        txt = L("lcl_res_dagbeschikbaarpct")+" "+beschikbaarheid+"%";
                    }
                    else
                    {
                        if (oRs("vrijedag").Value > 0) txt += L("mld_vrije_dagen")+" ";
                        if (oRs("weekdag").Value == 1 || oRs("weekdag").Value == 7)
                        {
                            if (gebouw.alleenwerkdagen)
                                txt += L("lcl_res_weekend");
                        }
                    }
                    return txt;
                }

                function fnDetail (oRs)
                {
                    return "";
                }

                function fnDagIcon(oRs)
                {
                    return "fa-calendar";
                }

                function fncolDatum(oRs)
                {
                    return toDateString(oRs.Fields("datum").Value);
                }

                function fnSubmitD(oRs)
                {
                    var purl = "";
                    if (oRs("vrijedag").Value == 0 && (!gebouw.alleenwerkdagen ||(gebouw.alleenwerkdagen && (oRs("weekdag").Value != 1 && oRs("weekdag").Value != 7))))
                        purl = "?date="+ (new Date(oRs("datum").Value).getTime()) + transitParam;
                    return purl;
                }

                // Bepaal het aantal items in dit gebouw
                var sql = rrpt.aantal_resruimten_in_gebouw_sql(res_disc_key_arr, act_key, geb_key, floor_key, resdate);
                var oRs = Oracle.Execute(sql)
                var aantalitems = oRs("aantal").Value;
                oRs.Close();
                var gebouwcapaciteit = aantalitems * dagcapaciteit;  // in uren

                var sql = rrpt.dagbezetting_resruimten_in_gebouw_sql(res_disc_key_arr, act_key, geb_key, floor_key, dateoffset, datelimit, resdate)

                var rst = new ResultsetTable({ sql: sql
                                     ,  keyColumn: "datum"
                                     ,  linkColumn: fnSubmitD
                                     ,  singleLink: true
                                     ,  headerColumn: fncolDatum
                                     ,  subheaderColumn: fnBeschikbaarheid
                                     ,  detailColumn: fnDetail
                                     ,  iconColumn: fnDagIcon
                                     ,  rowClass: fnrowClassD
                                     ,  ID: "datetable"
                                     ,  showAll: true
                                     ,  emptySetString: L("lcl_empty")
                                     });
                var cnt = rst.processResultset();
            CONTENT_END();
            FOOTER();
        PAGE_END();
    } // resdate


    // 3. KIES VERDIEPING INDIEN GEWENST EN NOG NIET BEKEND
    if (resdate && floorselect == 1 && geb_key > -1 && floor_key == -1)
    {
        var gebouw = getGebouw(geb_key);

        PAGE_START({id: "page-2b", pclass: "reservering00"});
            HEADER({title: L("lcl_beschikbaarheid_by_flr").format(catalogusnaam,gebouw.naam)+" "+toDateString(resdate), back:true, home:!qrc });
            CONTENT_START();
                function fnSubmitF(oRs)
                {
                    return "?floor_key="+ oRs("alg_verdieping_key").Value + transitParam;
                }

                function fnAantal(oRs)
                {
                    return oRs("aantal").Value + " " + safe.html(catalogusnaam);
                }

                function fnFloorIcon(oRs)
                {
                    return "fa-list";
                }

                // Onderstaande 2 functies hebben dezelfde berekening nodig, die vrij duur is, dat wil je optimaliseren
                // Omdat het aantal regels beperkt is (<25, vaker minder) doe ik het toch maar zo
                function fnrowClassF(oRs)
                {
                    var bcls= "";
                    var sql2 = rrpt.dagbezetting_resruimten_in_gebouw_sql(res_disc_key_arr, act_key, geb_key, oRs("alg_verdieping_key").Value, dateoffset, datelimit, resdate);
                    oRs2 = Oracle.Execute(sql2);
                    bcls += rrpt.bezettings_class_ruimte(oRs2("gevuld").Value, dagcapaciteit*oRs("aantal").Value, minimumbeschikbaarheid*oRs("aantal").Value);
                    oRs2.Close();
                    return bcls; // te duur
                }

                function fnBeschikbaarheidF(oRs)
                {
                    var txt = "";
                    var vloercapaciteit = oRs("aantal").Value * dagcapaciteit;  // in uren
                    var sql2 = rrpt.dagbezetting_resruimten_in_gebouw_sql(res_disc_key_arr, act_key, geb_key, oRs("alg_verdieping_key").Value, dateoffset, datelimit, resdate);
                    oRs2 = Oracle.Execute(sql2);
                    // Stop when invalid date is detected
                    if (oRs2.eof)
                    {
                        __DoLog("Data verwacht in fnBeschikbaarheidF, maar geen data aanwezig!");
                        __DoLogForm();
                        // Strip de datum er vanaf, dan komen we weer terug bij de datum-selectie
                        var transitParam = buildTransitParam(["zoom", "daylimit", "offset", "res_disc", "geb_key", "wsp_key", "onlyfree", "floorselect", "mapselect", "thema_key", "themaI_key", "bordlabel_key", "limit"]);
                        Response.Redirect("?1=1" + transitParam);
                    }
                    else
                    {
                        var beschikbaarheid = ((1 - (oRs2("gevuld").Value/vloercapaciteit))*100).toFixed(0); // 0..100
                        txt = L("lcl_res_dagbeschikbaarpct")+" "+beschikbaarheid+"%";
                    }
                    oRs2.Close();
                    return txt;
                }

                var sql = rrpt.mijn_verdiepingen_met_resruimten_sql(res_disc_key_arr, act_key, geb_key, authparams.ALGwritelevel, dateoffset, resdate);

                var rst = new ResultsetTable({ sql: sql
                                     ,  keyColumn: "alg_verdieping_key"
                                     ,  linkColumn: fnSubmitF
                                     ,  singleLink: true
                                     ,  headerColumn: "alg_verdieping_omschrijving"
                                     ,  detailColumn: fnAantal
                                     ,  subheaderColumn: fnBeschikbaarheidF
                                     ,  rowClass: fnrowClassF
                                     ,  iconColumn: fnFloorIcon
                                     ,  ID: "resflrtable"
                                     ,  showAll: true
                                     ,  emptySetString: L("lcl_empty")
                                     });
                var cnt = rst.processResultset();
            CONTENT_END();
            FOOTER();
        PAGE_END();
    } // floor_key


    // 4: ALS JE HIER BENT, WEET JE EEN GEBOUW(A) EN EEN DATUM(B)
    //    DAN WILLEN WE VERDER TOT EEN RES_RUIMTE_KEY en concrete van/tot-tijden
    if (resdate && geb_key > 0)
    {
        if (werkpl_key > -1)
        {   // Is er al een werkplek bekend? Kijk dan of deze voor vandaag vrij is.
            var is_beschikbaar = 2;
            var sql = "SELECT totaal"
                    + "     , CASE WHEN totaal = 0 THEN 2" // geheel beschikbaar
                    + "            WHEN " + dagcapaciteit + " - totaal < " + minimumbeschikbaarheid + " THEN 0" // niet meer beschikbaar
                    + "            ELSE 1" // gedeeltelijk beschikbaar
                    + "        END beschikbaarheid"
                    + "  FROM ("
                            +  "SELECT SUM(r.res_rsv_ruimte_tot - r.res_rsv_ruimte_van)*24 totaal"
                            +  "  FROM res_rsv_ruimte        r"
                            +  "     , res_ruimte_opstelling o"
                            +  "     , res_ruimte            d"
                            +  " WHERE r.res_ruimte_opstel_key = o.res_ruimte_opstel_key"
                            +  "   AND o.res_ruimte_key = d.res_ruimte_key"
                            +  "   AND d.res_ruimte_verwijder IS NULL"
                            +  "   AND (  d.res_ruimte_startdatum IS NULL"
                            +  "       OR d.res_ruimte_startdatum <= " + resdate.toSQL()
                            +  "       )"
                            +  "   AND (  d.res_ruimte_vervaldatum IS NULL"
                            +  "       OR d.res_ruimte_vervaldatum > " + resdate.toSQL()
                            +  "       )"
                            +  "   AND r.res_rsv_ruimte_verwijder IS NULL"
                            +  "   AND TRUNC(r.res_rsv_ruimte_van) = " + resdate.toSQL()
                            +  "   AND r.res_ruimte_key = " + room_key
                    + "       )"
            var oRs = Oracle.Execute(sql);
            is_beschikbaar = oRs("beschikbaarheid").Value;
            oRs.Close();
            if (is_beschikbaar > 0)
            {   // Ruimte is voor deze datum nog niet gereserveerd.
                // Gelijk de popup om te reserveren.
                var url = "../pda/reserveringen.asp?qrc="+(qrc?1:0)+"&res_ruimte_key="+ruimte_key+"&res_van="+(new Date(resdate).getTime());
                Response.Redirect(url);
            }
        }
        else
        {
            var gebouw = getGebouw(geb_key);

            PAGE_START({id: "page-3", pclass: "reservering00"});
                HEADER({title: catalogusnaam+" "+gebouw.naam+" "+toDateString(resdate), back:true, home:!qrc });
                CONTENT_START();
                    function fncolSubHeader(oRs)
                    {
                        var res = rrpt.getIntervalString(oRs("res_ruimte_key").Value, resdate, bloktijden);
                        if (res =="")
                            res = "";//L("lcl_res_interval_nietbeschikbaar");
                        else
                            res = "<div class='listbodytext'>" + I("fa-calendar") + "&nbsp;"+res+"</div>";
                        return "<div class='listbodykop'>"+safe.html(oRs("alg_verdieping_omschrijving").Value)+ "</div>"+res;
                    }

                    function fnrowClassRD(oRs)
                    {
                      return rrpt.bezettings_class_ruimte(oRs("bezet").Value, dagcapaciteit, minimumbeschikbaarheid);
                    }

                    function fnResRuimteIcon(oRs)
                    {
                        var icon = "fa-tv-retro";
                        if (oRs.Fields("res_ruimte_image").Value != null)
                        {
                          icon = oRs.Fields("res_ruimte_image").Value;
                          if (!icon.match(/^http/))
                              icon = safe.htmlattr(S("res_image_path") + icon);
                        }
                        return icon;
                    }

                    function fnRuimte(oRs)
                    {
                        return safe.html(oRs("plaats").Value||"");
                    }

                    function fnPlaats(oRs)
                    {
                        return safe.html((oRs("res_ruimte_nr").Value||"")+" "+(oRs("res_ruimte_omschrijving").Value||""));
                    }

                    function fnSubmitRD(oRs)
                    {
                        var purl = "";
                        if (oRs("bezet").Value < dagcapaciteit - minimumbeschikbaarheid)
                            purl = "../pda/reserveringen.asp?qrc="+(qrc?1:0)+"&res_ruimte_key=" + oRs("res_ruimte_key").Value + "&res_van="+(new Date(resdate).getTime())

                        return purl;
                    }

                    if (floor_key > -1 && themaI_key > -1 && thema_key > -1)
                    {
                        var sql = "SELECT COUNT(*) tekeningen"
                                + "  FROM cad_tekening t"
                                + "     , alg_v_aanwezigverdieping v"
                                + " WHERE t.alg_verdieping_key = v.alg_verdieping_key"
                                + "   AND t.cad_tekening_verwijder IS NULL"
                                + "   AND v.alg_verdieping_key = " + floor_key;
                        var oRs = Oracle.Execute(sql);
                        var aantaltekeningen = oRs("tekeningen").Value;
                        oRs.Close();
                        if (aantaltekeningen > 0 && mapselect)
                        {
                            CONTROLGROUP_START();
                                BUTTON(L("lcl_prs_wp_fgraph"), {click: "plan(" + floor_key + ", [" + res_disc_key_arr.join(",") + "], " + thema_key + ", " + themaI_key + ", "  + (new Date(resdate).getTime()) + ", " + bordlabel_key + ");", icon: "fa-map-marker-alt"});
                            CONTROLGROUP_END();
                        }
                    }

                    // bepaal de discipline-afhankelijke reserveringsintervallen
                    // Neem bij meerdere disciplines alleen de eerste: De bloktijden zouden hetzelfde moeten zijn.
                    // Mergen van twee disciplines is niet mogelijk.
                    bloktijden = res.getBloktijden(act_key, res_disc_key_arr[0], resdate, geb_key);

                    // Per ruimte in dit gebouw hoeveel er die dag bezet is
                    var sql = rrpt.res_ruimte_bezetting_op_dag_sql(res_disc_key_arr, act_key, geb_key, floor_key, authparams.ALGwritelevel, resdate, (onlyfree ? dagcapaciteit - minimumbeschikbaarheid : null));

                    var rst = new ResultsetTable({ sql: sql
                                                 , keyColumn: "res_ruimte_key"
                                                 , linkColumn: fnSubmitRD
                                                 , singleLink: true
                                                 , headerColumn: fnRuimte
                                                 , detailColumn: fnPlaats
                                                 , subheaderColumn: fncolSubHeader
                                                 , iconColumn: fnResRuimteIcon
                                                 , ID: "datetable"
                                                 , rowClass: fnrowClassRD
                                                 , showAll: true
                                                 });
                    var cnt = rst.processResultset();
                CONTENT_END();
                FOOTER();
            PAGE_END();
        }
    }
PDA_PAGE_END(); %>
	</body>
</html>
<% ASPPAGE_END(); %>