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

    File:               pda/reservering_new.asp
    Description:        Add reservering (Mobile version)
    Parameters:         rsv_ruimte_key voor bestaande deelreservering
                        rsv_ruimte_key=-1 voor nieuwe (deel)reservering

    Note:

*/ %>

<% REGISTERMENU_Disable = true; %>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/calendar.inc" -->
<!-- #include file="../Shared/selector.inc" -->
<!-- #include file="../Shared/Suggest/plaatsFilter.inc" -->
<!-- #include file="../Shared/discxalg3d.inc" -->
<!-- #include file="../RES/res.inc" -->
<!-- #include file="../RES/res_plan_room.inc" -->
<!-- #include file="./mobile.inc" -->
<!-- #include file="./iface.inc" -->
<!-- #include file="../shared/data_recordset.inc" -->
<!-- #include file="./resultset_table.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../shared/rater.inc" -->

<%
FCLTHeader.Requires({ js: ["./modernizr-3.3.0.custom.min.js"] });
FCLTHeader.Requires({ js: ["jquery.timepicker-table.js"],
                      css: ["timePicker-table.css"] });

var urole = "fe";
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key", -1);
var date_from      = getQParamDate("date_from", null);
var date_to        = getQParamDate("date_to", null);
var act_key        = getQParamInt("act_key", -1);
var bez_cnt        = getQParamInt("bez_cnt", null);
var loc_key        = getQParamInt("loc_key", -1);
var res_ruimte_key = getQParamInt("res_ruimte_key",-1);
var qrc            = getQParamInt("qrc", 0) != 0;

autfunction = ("WEB_RESUSE");
var authparams = user.checkAutorisation(autfunction);

var transitParam = buildTransitParam(["act_key", "date_from", "date_to", "bez_cnt", "loc_key", "loc_plaats", "res_ruimte_key"]);
var transitParamExtern = buildTransitParam(["date_from", "date_to", "bez_cnt", "loc_plaats"]);

var sql = "SELECT COALESCE(MIN(fac_gebruiker_alg_level_write), 9) writelevel"
        + "  FROM fac_v_webgebruiker g, fac_functie f "
        + " WHERE g.fac_functie_key = f.fac_functie_key "
        + "   AND f.fac_functie_code = " + safe.quoted_sql(autfunction)
        + "   AND g.prs_perslid_key = " + user_key;
var oRs = Oracle.Execute(sql);
var autlevel = oRs("writelevel").Value; // Pas op: kan ook '0' zijn (regio)
oRs.Close();

var subject = L("lcl_mobile_newreservering");
var curPage = 0;
if (rsv_ruimte_key == -1)
{
    if (!date_from && res_ruimte_key==-1)
    {
        curPage = 1;
        // geen parameters aanwezig.
        var srtact = getQParamInt("srtact", 1); // Vooralsnog alleen ruimte reserveringen.
        var sql = "SELECT res_srtactiviteit_metaantal"
                + "  FROM res_srtactiviteit"
                + " WHERE res_srtactiviteit_key = " + srtact;
        var oRs = Oracle.Execute(sql);
        var toonBez = oRs("res_srtactiviteit_metaantal").value;
        oRs.Close();

        // default begin en eindtijd
        var res_van = new Date().setFloatHours(S("res_t1") + 24, S("res_h")); // default morgen
        var res_tot = res_van.addFloatHours(S("res_dur"), S("res_h"));
        // Activiteiten
        var sql_a = "SELECT a.res_activiteit_key"
                  + "     , " + "CASE WHEN sa.res_srtactiviteit_prefix IS NULL"
                         + "          THEN ''"
                         + "          ELSE sa.res_srtactiviteit_prefix || '-'"
                         + "          END"
                         + "          || "+ lcl.xsqla("a.res_activiteit_omschrijving", "a.res_activiteit_key")
                  + "     , a.res_activiteit_duur"
                  + "     , a.res_activiteit_omsverplicht"
                  + "     , a.res_activiteit_aantalverplicht"
                  + "  FROM res_activiteit a"
                  + "     , res_srtactiviteit sa"
                  + " WHERE res_activiteit_verwijder IS NULL"
                  + "   AND a.res_srtactiviteit_key = sa.res_srtactiviteit_key"
                  + "   AND sa.res_srtactiviteit_key = " + srtact
                  + "   AND sa.res_srtactiviteit_soort = 0" // restype = "R"
                  + "   AND EXISTS (SELECT res_activiteit_key"
                  + "                 FROM res_activiteitdiscipline rad,"
                  + "                      ins_tab_discipline disc"
                  + "                    , fac_v_my_disciplines md"
                  + "                WHERE rad.res_discipline_key = md.ins_discipline_key"
                  + "                  AND md.prs_perslid_key = " + user_key
                  + "                  AND md.fac_functie_code = " + safe.quoted_sql(autfunction)
                  + "                  AND fac_gebruiker_alg_level_write < 9"
                  + "                  AND fac_gebruiker_prs_level_write < 9"
                  + "                  AND rad.res_discipline_key = disc.ins_discipline_key"
                  + "                  AND rad.res_activiteit_key = a.res_activiteit_key"
                  + "                  AND ins_discipline_verwijder IS NULL"
                  + "                  AND ins_discipline_min_level = 3"         // 1; Reserveerbaar object; 2; Verbruiksartikel; 3; Ruimte
                  + "              )"
                  + " ORDER BY res_activiteit_volgnr"
                  + "        , sa.res_srtactiviteit_prefix"
                  + "        , UPPER(" + lcl.xsql('a.res_activiteit_omschrijving', 'a.res_activiteit_key') +")";

        // Locaties (waar reserveerbare ruimten zijn binnen de scope van de user)
        var filtClause = getFiltClauseLocatie("RES");
        var sql_l = "SELECT l.alg_locatie_key"
                  + ", " + S("alg_loc_string") + " naam"
                  + ", alg_locatie_plaats"
                  + " FROM alg_v_aanweziglocatie l"
                  + filtClause.from
                  + " WHERE 1=1"
                  + filtClause.where
                  + " ORDER BY 2";
    };

    if (date_from && res_ruimte_key==-1)
    {
        curPage = 2;
        // verplicht: date_from:  begin van reservering
        //            act_key:    activiteit
        // optioneel: bez_cnt:    aantal bezoekers
        //            loc_key:    locatie key
        //            res_tot:    einde van reservering (niet meerdaags)

        var params = { loc: loc_key,
                       loc_plaats: getQParam("loc_plaats", ""),
                       forSelectRoom: true,
                       res_van: date_from,
                       res_tot: date_to,
                       vis: bez_cnt,
                       activiteit_key: act_key,
                       with_satisfaction: true,
                       authparams: user.checkAutorisation("WEB_RESUSE", null, null, true), // urole == "fe" en pessimistisch.
                       ruimtecat: []
                     };
    };
};

// Ik wil een reservering maken. Ik zie het volgende voor me:
//
// 1. Vraag een DATUM. Een datum is de minimale vereiste om te weten
// 2. Optioneel kunnen er nog waarden opgegeven worden die van invloed zijn op de mogelijkheden. Deze zijn:
//    - capaciteit (hoeveel mensen moet er passen)
//    - locatie/regio (waar precies/ongeveer)
//    - begintijdstip (omstreeks)
//
// > Met die datum + filters vragen we kandidaatruimtes op aan de database (of via API)
//
// 3. De kandidaatruimtes worden getoond met voldoende info om een keuze te maken. Bijvoorbeeld
//    - gegroepeerd per locaties (indien meer dan 1/niet opgegeven)
//    - dan per ruimte een (1) vermelding rond het genoemde tijdstip
//    - met vermelding Beschikbaar van X to Y
// ** indien Share&Meet: optie om het verzoek aan externe FACILITORs te vragen.
// 4. Met een keuze uit deze opties is veel bepaald:
//    - ruimte
//    - datum (was al)
//    - aantal mensen (was al capaciteit, anders obv de default opstelling)
//      en kan nog aangefpast worden:
//    - tijd (de hele beschikbare periode)
//      en is nog nodig en in te vullen:
//    - een omschrijving en evt opmerking
//    - [later?] flexkenmerken
// 5. Deze gegevens worden gesubmit tot een nieuwe reservering (via service)

%>
<html>
  <head>
<% FCLTMHeader.Generate({title: subject }); %>
    <script type="text/javascript">

        function fn_res_next1()
        {
          if (!validateForm("res_new_1"))
            return false;

          var datum = $("#date_from").val();
          var activiteit = $("#act_key").val();
          var bezoekers = $("#bez_cnt").val();
          var locatie = $("#loc_key").val();
          var loc_plaats = $("#loc_plaats").val();
          var purl = "?rsv_ruimte_key=-1"
                   + "&date_from=" + datum
                   + "&date_to=" + $("#date_to").val()
                   + "&act_key=" + activiteit
                   + (locatie > 0 ? "&loc_key=" + locatie   : "")
                   + (loc_plaats ? "&loc_plaats=" + escape(loc_plaats)   : "")
                   + (bezoekers   ? "&bez_cnt=" + bezoekers : "")
                   + "<%=safe.jsstring(transitParam)%>";

          window.location.href = "reservering_new.asp" + purl;
        }

        function autosetEindtijd()
        {
          var opt = $("#act_key").find("option:selected");
          // De extraParamValue is opgeslagen als text. De res_activiteit_duur is een float met mogelijk een komma i.p.v. een punt als decemaal scheidingsteken.
          var res_duur = parseFloat((String(opt[0].getAttribute("res_activiteit_duur"))).replace(',','.'));

          if (res_duur)
          {
            var startDate = new Date(parseInt($('#date_from').val()));
            var endDate = new Date(parseInt($('#date_to').val()));
            var estEndDate = startDate.addFloatHours(res_duur, <%=safe.jsfloat(S("res_h"))%>);
            if (!isNaN(startDate) && endDate.getTime() != estEndDate.getTime())
            {
              $("#show_date_to").datepicker('setDate',new Date(estEndDate));
              $("#date_to").val(estEndDate.getTime());
              $("#time_from_date_to").val(toTimeString(estEndDate)).css("color", "red");
            }
          }
        }

        function checkVeldenVerplicht()
        {
          // Afhankelijk van de geselecteerde waarde voor activiteit
          // moet het veld aantalbezoekers verplicht worden gemaakt.
          var opt = $("#act_key").find("option:selected");
          var bez_verplicht = opt[0].getAttribute("res_activiteit_aantalverplicht");
          $("#bez_cnt").toggleClass("required", bez_verplicht == 1);
        }

        function OnChangeActivity()
        {
          checkVeldenVerplicht();
          autosetEindtijd();
        }

        function changeLoc(elm)
        {
            var loc_key = $(elm).val();
            if (loc_key > 0)
                $('#loc_plaats').val($(elm).find('option:selected').attr('alg_locatie_plaats')).textinput('disable');
            else
                $('#loc_plaats').textinput('enable');
        }

    </script>
  </head>
  <body>
    <div>
<%
  if (curPage == 0)
  {
    PAGE_START({id: "page-0-"+rsv_ruimte_key});
      HEADER({title: L("lcl_mobile_selectdatum"), back:!qrc, datatheme: (urole=='fe' ? jQFrontEndTheme : null) });
      CONTENT_START();
        ROFIELD("fld", "AjAi", "Verkeerde pagina");
      CONTENT_END();
      FOOTER();
    PAGE_END();
  }

  if (curPage == 1)
  {
    PAGE_START({id: "page-1-"+rsv_ruimte_key});
      HEADER({title: subject, back:!qrc, datatheme: (urole=='fe' ? jQFrontEndTheme : null) });
      CONTENT_START();
%>
      <form name="res_new_1" id="res_new_1">
<%
        FCLTselector( "act_key",
                      sql_a,
                      { label: L("lcl_activity"),
                        emptyOption: L("lcl_res_select_activity"),
                        extraParamValue: "res_activiteit_duur,res_activiteit_aantalverplicht",
                        required: true,
                        mobile: true,
                        onChange: "OnChangeActivity()"
                      }
                    );

        FCLTcalendar("date_from",
                      { label : L("lcl_from"),
                        datum: res_van,
                        maxPast: 0,
                        maxFuture: (S("res_fe_reservering_limiet") > 0? S("res_fe_reservering_limiet") : S("res_reservering_limiet")),
                        timeField: true,
                        timeStep: S("res_h") * 60,
                        startTime: S("res_t1"),
                        endTime: S("res_t2"),
                        res_dur: S("res_dur"),
                        required: true,
                        volgnr: 1,
                        mobile: true,
                        onChange : "autosetEindtijd()"
                      }
                    );
        FCLTcalendar("date_to",
                      { label : L("lcl_to"),
                        datum: res_tot,
                        maxFuture: (S("res_fe_reservering_limiet") > 0? S("res_fe_reservering_limiet") : S("res_reservering_limiet")),
                        timeField: true,
                        timeStep: S("res_h") * 60,
                        startTime: S("res_t1"),
                        endTime: S("res_t2"),
                        hidden: true, // Meerdaags ruimte ondersteunen we nog niet echt
                        required: true,
                        volgnr: 2,
                        mobile: true
                      }
                    );

        if (toonBez)
            RWFIELD("bez_cnt",  L("lcl_visitors") , bez_cnt, {datatype: "number", required: false});

        var loc_key = user.alg_locatie_key( { withcurrent:true });
        var plaats = "";
        if (loc_key > 0)
            plaats = new Locatie(loc_key).alg_locatie_plaats();

        var anyremote = res.anyremotes();
        FCLTselector( "loc_key",
                      sql_l,
                      { initKey: loc_key,
                        emptyOption: anyremote?L("lcl_shared_other"):null,
                        label: L("lcl_location"),
                        initEmpty: true,
                        mobile:true,
                        extraParamValue: "alg_locatie_plaats",
                        onChange: "changeLoc(this)"
                      }
                    );

        if (anyremote)
            RWFIELD("loc_plaats",  "" , plaats, { html: 'disabled=1' });

        CONTROLGROUP_START();
          BUTTON(L("lcl_next"), {click: "fn_res_next1()", dataicon: "arrow-r", dataajax: "false"});
        CONTROLGROUP_END();
%>
    </form>
<%
      CONTENT_END();
      FOOTER();
    PAGE_END();
  }

  if (curPage == 2) // Lijst met geschikte ruimtes
  {
    PAGE_START({id: "page-2-"+rsv_ruimte_key});
      HEADER({title: subject, back:!qrc, datatheme: (urole=='fe' ? jQFrontEndTheme : null) });
      CONTENT_START();

        function fnDataFilter(oRs)
        {
            return oRs.Fields("will_fit").Value;
        }

        function fncolIcon(oRs)
        {
            var icon = "../Pictures/house_p.png";
            if (oRs.Fields("image_url").Value != null)
            {
              icon = oRs.Fields("image_url").Value;
              //if (!icon.match(/^http/))
              //    icon = S("res_image_path") + icon;
            }
            return icon;
        }

        function fncol1Link(oRs, processParams)
        {
            if (processParams && processParams.disc_key)
            {
                var deepurl = oRs.Fields("deepurl").Value;
                deepurl += "&res_ruimte_key=" + oRs.Fields("res_ruimte_key").Value
                        + "&bez_omschr=" + "Vanuit+extern+systeem" // TODO
                        //+ "&flex_defaults=" + escape(extern_flex);
                var orghome = HTTP.urlzelf() + "/appl/pda/facilitor.asp";
                var nurl = "../res/res_goto_extern.asp?res_disc_key=" + processParams.disc_key
                         + "&deepurl=" + escape(deepurl + transitParamExtern + "&orghome=" + orghome); // extern kan niets met onze act_key
            }
            else
            {
                var nurl = "reservering.asp?rsv_ruimte_key=-1"
                         + "&res_ruimte_key=" + oRs.Fields("res_ruimte_key").Value
                         + transitParam;
            }


          return nurl;
        };

        function fnDetail(oRs)
        {
        //    return toTimeString(dataregel.begintijd);
        }

        function fnHeader(oRs)
        {
            var txt = safe.html(oRs.Fields("res_ruimte_nr").Value);
            if (oRs.Fields("satisfaction").Value)
            {
                var likesymbol = rater(oRs.Fields("satisfaction").Value, { readonly: true } );
                txt += "<br>" + likesymbol;
            }
            return txt;
        }

        function fnSubheader(oRs)
        {
            // Toon extra gegevens over deze ruimte.
            var bMin = oRs.Fields("bMin").Value;
            var bMax = oRs.Fields("bMax").Value;
            var capc_txt = String(bMin) + ((bMin!=bMax)?"-"+bMax:"") + " pers.";
            if (oRs.Fields("prijs").Value)
                capc_txt += ", " + S("currency_pref") + safe.curr(oRs.Fields("prijs").Value)
            var txt = "<div class='listbodytext'>" + safe.html(capc_txt) + "</div>";
            txt += "<div class='listbodytext'>" + safe.html(oRs.Fields("omschrijving").Value) + "</div>";

            return txt;

        /*  // Voorlopig nog niet de beschikbare tijden laten zien.
            var vrij = "";
            var res_arr = dataregel.existing_res;
            if (res_arr != null)
            {
                res_arr.sort(dynamicSort({col: "res_van", desc: false}));
                var t1 = new Date(dataregel.begintijd);
                var t2 = t1;
                for (var ci=0; res_arr != null && ci < res_arr.length; ci++)
                {
                    t2 = res_arr[ci].res_van;
                    if (ci==0)
                    {
                        t1 = new Date(t2.getTime());
                        t1.setHours(dataregel.begintijd,0,0,0);
                    }
                    if (t1 < t2)
                    {
                        vrij += toTimeString(t1) + " - " + toTimeString(t2) + "<br>";
                        t1 = res_arr[ci].res_tot;
                    }
                }

                t2 = new Date(t1.getTime());
                t2.setHours(dataregel.eindtijd,0,0,0);
                if (t1 < t2)
                {
                    vrij += toTimeString(t1) + " - " + toTimeString(t2);
                }
            }
            else
            {
                vrij = toTimeString(dataregel.begintijd) + " - " + toTimeString(dataregel.eindtijd);
            }
            return vrij;
        */
        }

        function dynamicSort(params)
        {
            params = params || {};
            var sortOrder = (params.desc ? -1 : 1);
            return function (a,b)
                   {
                       var result = (a[params.col] < b[params.col]) ? -1 : (a[params.col] > b[params.col]) ? 1 : 0;
                       return result * sortOrder;
                   }
        }


        var plan_rooms_info = res.plan_rooms_info(params);
        var plan_bezet_info = res.plan_bezet_info(params);
        set_will_fit(plan_rooms_info, plan_bezet_info, params)

        var rst = new ResultsetTable({ dataset: plan_rooms_info
                                     , fnDataFilter: fnDataFilter
                                     , keyColumn: "res_ruimte_key"
                                     , iconColumn: fncolIcon
                                     , linkColumn: fncol1Link
                                     , headerColumn: fnHeader
                                     //, detailColumn: fnDetail
                                     , subheaderColumn: fnSubheader
                                     , dividerColumn: (loc_key == -1 ? "locatie" : "")
                                     , ID: "restable"
                                     , showAll: true
                                     , noSearch: true
                                     , emptySetString: L("lcl_empty")
                                     });
        var cnt = rst.processResultset();

        // En nu de externen
        var autfunction = "WEB_RESUSE"; // TODO
        // Overzicht externe ruimtes
        var sql = res.getremotes_sql(autfunction);
        var oRs = Oracle.Execute(sql);
        while( !oRs.eof )
        {
            var disc_key = oRs.Fields("ins_discipline_key").Value;
        %>
        <div class="resprodextern">
            <%= L("lcl_res_extern_prefix") + Server.HTMLencode(oRs.Fields("ins_discipline_omschrijving").Value)%>
        </div>
        <%
            var url = oRs.Fields("res_disc_params_remoteurl").Value + "&API=RESINFO";

            var resparams = {
                       res_van: params.res_van,
                       res_tot: params.res_tot,
                       reg: -1,
                       dist: -1,
                       loc: -1,
                       bld: -1,
                       ver: -1,
                       rui: -1,
                       ruimtecat: []
                   };

            resparams.alg_locatie_plaats = params.loc_plaats;// Aan de andere kant kennen we onze key niet, daarom via plaats.

            resparams.request = "plan_rooms_info";
            resparams.mobile = true;
            /*global*/ plan_rooms_info = HTTP.getJSON(url, { data: resparams }).plan_rooms_info;
            if (plan_rooms_info.length)
            {
                resparams.request = "plan_bezet_info";
                /*global*/ plan_bezet_info = HTTP.getJSON(url, { data: resparams }).plan_bezet_info;
            }
            else
                plan_bezet_info = {};
            set_will_fit(plan_rooms_info, plan_bezet_info, resparams)

            __Log("plan_rooms_info:")
            __Log(plan_rooms_info)

            rst.dataset = plan_rooms_info;
            rst.sql = null;
            rst.ID = "prodtable2";

            var histogram = rst.processResultset({ disc_key: disc_key });

            var allEmpty = allEmpty && (histogram == -1);

            oRs.MoveNext();
        }
        oRs.close();

      CONTENT_END();
      FOOTER();
    PAGE_END();
  }

%>
    </div>
  </body>
</html>
