<%@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_v2.inc" -->
<!-- #include file="./mobile.inc" -->
<!-- #include file="./iface.inc" -->
<!-- #include file="../shared/data_recordset.inc" -->
<!-- #include file="./resultset_table.inc" -->
<!-- #include file="../shared/rater.inc" -->

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

var urole = "fe";
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key", -1);

var restype = getQParamSafe("restype", "R").toUpperCase();
restype = (restype == "CV" ? "CV" : (restype == "C" ? "C" :"R")); // Default gaan we een ruimte reserveren

var date_from      = getQParamDate("date_from", null);
var date_to        = getQParamDate("date_to", null);
var timeFrom       = getQParamFloat("timefrom", S("res_t1")); // Start van werkdag, of meegegeven waarde.
var act_key        = getQParamInt("act_key", -1);
var disc_key       = getQParamInt("disc", -1);
var res_deel_key   = getQParamInt("res_deel", -1);
var res_artikel_key= getQParamInt("res_artikel", -1);
var bez_cnt        = getQParamInt("bez_cnt", null);

var loc_key        = getQParamInt("loc_key", -1);
var bld_key        = getQParamInt("bld_key", -1);
var flr_key        = getQParamInt("flr_key", -1);
var roo_key        = getQParamInt("roo_key", -1);

var res_ruimte_key = getQParamInt("res_ruimte_key", -1);
var qrc            = getQParamInt("qrc", 0) != 0;

var cvab           = S("res_default_cvab_mode");
var ab_mode        = getQParamInt("cvab", -1);

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

var transitParam = buildTransitParam(["restype", "srtact_key", "act_key", "date_from", "date_to", "bez_cnt", "cvab", "timefrom", "bind",
                                      "loc_key", "bld_key", "flr_key", "roo_key", "disc", "res_deel", "res_artikel", "loc_plaats", "res_ruimte_key"]);
var transitParamPlaats = buildTransitParam(["loc_key", "bld_key", "flr_key", "roo_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 (act_key < 0)
    {
        curPage = 1;
        subject = L("lcl_ins_controle_choose_srt");
        var srtact_keys = getQParamIntArray("srtact_key", []);

        if (srtact_keys.length)
        {
          // Bepaal restype uit srtactiviteit.
          var sql = "SELECT MIN(res_srtactiviteit_soort)  res_srtactiviteit_soort"
                  + "  FROM res_srtactiviteit"
                  + " WHERE res_srtactiviteit_key IN (" + srtact_keys.join(",") + ")";
          var oRs = Oracle.Execute(sql);
          if (!oRs.EoF)
            restype = oRs("res_srtactiviteit_soort").value == 0 ? "R" : "CV"; // srtact_key 'sterker' dan restype
          oRs.Close();
        }

        // Omzetten van restypes naar key: 1=Reserveerbaar object (V); 2=Verbruiksartikel (C); 3=Ruimte (R).
        // Default heeft restype_key_arr al [0] zodat bij geen of ongeldige restype niets geselecteerd wordt.
        var restype_key_arr =[0];
        for (var i=0; i<restype.length; i++)
            restype_key_arr.push({ "V": 1, "C": 2, "R": 3 }[restype.charAt(i)]);

        // 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"
                    + (srtact_keys.length
                    ? "   AND sa.res_srtactiviteit_key IN (" + srtact_keys.join(",") + ")"
                    : "   AND sa.res_srtactiviteit_soort = " + (restype == "R" ? "0" : "1"))
                  + "   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 IN (" + restype_key_arr.join(",") + ")"
                  + "              )"
                  + " ORDER BY res_activiteit_volgnr"
                  + "        , sa.res_srtactiviteit_prefix"
                  + "        , UPPER(" + lcl.xsql('a.res_activiteit_omschrijving', 'a.res_activiteit_key') +")";

    }
    else if (!date_from)
    {
        // act_key bekend
        curPage = 2;

        var res_ruimte_limiet = null;
        var sql = "SELECT res_ruimte_limiet"
                + "  FROM res_ruimte"
                + " WHERE res_ruimte_key = " + res_ruimte_key;
        var oRs = Oracle.Execute(sql);
        if (!oRs.eof)
        {
            res_ruimte_limiet = oRs("res_ruimte_limiet").Value;
        }
        oRs.Close();

        var sql_b = "SELECT sa.res_srtactiviteit_metaantal"
                  + "     , ra.res_activiteit_duur"
                  + "     , ra.res_activiteit_aantalverplicht"
                  + "     , ra.res_activiteit_cvab_mode"
                  + "     , ra.res_activiteit_meteindtijd"
                  + "     , COALESCE( LEAST( COALESCE(" + res_ruimte_limiet + ", ra.res_activiteit_limiet)"
                                + "        , COALESCE(ra.res_activiteit_limiet, " + res_ruimte_limiet + ")"
                                + "        )"
                                + " , " + S("res_reservering_limiet") 
                                + " ) act_limiet"
                  + "     , COALESCE( LEAST( COALESCE(" + res_ruimte_limiet + ", ra.res_activiteit_limiet_fe)"
                                + "        , COALESCE(ra.res_activiteit_limiet_fe, " + res_ruimte_limiet + ")"
                                + "        )"
                                + " , " + S("res_fe_reservering_limiet") 
                                + " ) act_limiet_fe"
                  + "  FROM res_activiteit ra"
                  + "     , res_srtactiviteit sa"
                  + " WHERE ra.res_srtactiviteit_key = sa.res_srtactiviteit_key"
                  + "   AND ra.res_activiteit_key = " + act_key;

        var oRs = Oracle.Execute(sql_b);
        var toonBez  = oRs("res_srtactiviteit_metaantal").Value;
        var res_duur = oRs("res_activiteit_duur").Value;
        var res_verp = oRs("res_activiteit_aantalverplicht").Value;
        var res_meteind = oRs("res_activiteit_meteindtijd").Value;
        var eff_act_limiet = oRs("act_limiet").Value;
        var eff_act_limiet_fe = oRs("act_limiet_fe").Value;
        cvab = oRs("res_activiteit_cvab_mode").Value;
        if (cvab == null) // 0 is ook een correcte waarde.
            cvab = S("res_default_cvab_mode");
        oRs.Close();

        // determine minimum expire days
        var sql_exp = "SELECT fac.DatumTijdPlusUitvoerTijd("
                    + "           SYSDATE,"
                    + "           GREATEST(0, MIN(rd.res_disc_params_expire_dagen)),"
                    + "           'DAGEN'"
                        + (S("res_247organisation")==1? " , null, null, 2" : "") + ") res_van"
                    + "  FROM res_activiteitdiscipline ad"
                    + "     , res_disc_params rd"
                    + " WHERE ad.res_discipline_key = rd.res_ins_discipline_key"
                    + "   AND ad.res_activiteit_key = " + act_key;

        var oRs_exp = Oracle.Execute(sql_exp);
        // default begin en eindtijd
        var res_van = new Date(oRs_exp("res_van").Value); // default today + min(expiredays)
        var today = new Date(Math.floor(new Date().getTime() / 1000) * 1000);
        if (  toTimeString(res_van) === toTimeString(today)
           && res_van.getDate() === today.getDate()
           && res_van.getMonth() === today.getMonth()
           && res_van.getFullYear() === today.getFullYear()
           )
        {   // Reservering vandaag: default niet voor huidig tijdstip.
            res_van.setMinutes(res_van.getMinutes() + 5); // beetje marge, anders direct expired
        }
        else
        {   // Reservering in toekomstige dag: default start van werkdag.
            res_van = res_van.setFloatHours(timeFrom, S("res_h"));
        }
        oRs_exp.Close();
        var res_tot = res_van.addFloatHours(S("res_dur"), S("res_h"));

        // Locaties (waar reserveerbare ruimten zijn binnen de scope van de user)
        var params = {};
        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";
    }
    else if (ab_mode < 0) // Ruimte Reservering
    {
        curPage = 3;
        // verplicht: date_from:  begin van reservering
        //            loc_key:    locatie key
        //            act_key:    activiteit
        // optioneel: bez_cnt:    aantal bezoekers
        //            res_tot:    einde van reservering (niet meerdaags)

        var sql = "SELECT res_srtactiviteit_key, "
                + lcl.xsqla('a.res_activiteit_omschrijving', 'a.res_activiteit_key')
                + "     , a.res_activiteit_posttime"
                + "  FROM res_activiteit a"
                + " WHERE res_activiteit_key = " + act_key;
        var oRs = Oracle.Execute(sql);

        var params = { loc_key_arr: loc_key > 0 ? [loc_key] : [],
                       bld_key_arr: bld_key > 0 ? [bld_key] : [],
                       ver_key_arr: flr_key > 0 ? [flr_key] : [],
                       loc_plaats: getQParam("loc_plaats", ""),
                       forSelectRoom: true,
                       res_van: date_from,
                       res_tot: date_to,
                       vis: bez_cnt,
                       activiteit_key: act_key,
                       act_post_time: oRs("res_activiteit_posttime").Value,
                       srtact: oRs("res_srtactiviteit_key").Value,
                       with_satisfaction: true,
                       authparams: user.checkAutorisation("WEB_RESUSE", null, null, true), // urole == "fe" en pessimistisch.
                       ruimtecat: []
                     };
        oRs.Close();
    }
    else if (res_deel_key < 0) // Voorziening Reservering
    {
        if (disc_key < 0)
        { // Kies Discipline
            curPage = 4;
            subject = L("lcl_res_objects");

            var params = {  loc_key        : loc_key,
                            geb_key        : bld_key,
                            ver_key        : flr_key,
                            rui_key        : roo_key,
                            select_fields  : " count(*) cnt, r.res_discipline_key ",
                            sql_group_by   : "GROUP BY r.res_discipline_key",
                            autfunction    : autfunction,
                            res_tot        : date_to
                        };
            var sql_aantal = getScopedResDeelSql(params);

            var sql_d = "SELECT dis.ins_discipline_key, "
                      + "   " + lcl.xsqla('dis.ins_discipline_omschrijving','dis.ins_discipline_key')
                      + "     , (SELECT SUM(cnt)"
                      + "          FROM (" + sql_aantal + ") aant"
                      + "         WHERE res_discipline_key = dis.ins_discipline_key) aantal"
                      + "  FROM res_v_aanwezigdiscipline dis"
                      + "  WHERE ins_discipline_min_level = 1"
                      + "   AND dis.ins_discipline_key IN("
                      + "        SELECT g.ins_discipline_key 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.fac_gebruiker_alg_level_write < 9"
                      + "           AND g.fac_gebruiker_prs_level_write < 9"
                      + "           AND g.prs_perslid_key = " + user_key
                      + "       )"
                      + "          AND dis.ins_discipline_key IN"
                      + "              (SELECT res_discipline_key" /* DISTINCT */
                      + "                 FROM res_deel r, ins_deel d"
                      + "                WHERE r.res_deel_verwijder IS NULL"
                      + "            AND r.res_ins_deel_key = d.ins_deel_key)"
                      + "   AND EXISTS (SELECT res_activiteit_key"
                      + "                 FROM res_activiteitdiscipline rad"
                      + "                WHERE rad.res_discipline_key = dis.ins_discipline_key"
                      + "                  AND rad.res_activiteit_key = " + act_key
                      + "        )";

            if (S("vis_parking_key") != -1) sql_d += " AND dis.ins_discipline_key != " + S("vis_parking_key");

            if (S("res_fe_discs_only_in_res") != -1 && !fronto && !backo && restype == 'CV')
              sql_d += " AND dis.ins_discipline_key NOT IN (" + S("res_fe_discs_only_in_res") + ") ";

            sql_d += " ORDER BY ins_discipline_volgnr";
        }
        else
        { // Kies Object
            curPage = 5;

            var sql_disc = "SELECT ins_discipline_omschrijving "
                         + "  FROM res_v_aanwezigdiscipline "
                         + " WHERE ins_discipline_key = " + disc_key;
            var oRs_disc = Oracle.Execute(sql_disc);
            subject = oRs_disc("ins_discipline_omschrijving").Value;
            oRs_disc.Close();

            // Starting res_deel sql
            var select_fields = "  r.res_deel_key"
                              + ", r.res_opmerking"
                              + ", r.res_omschrijving"
                              + " || CASE"
                                + " WHEN (r.res_vervaldatum IS NULL OR r.res_vervaldatum > SYSDATE)"
                              + "                   THEN ''"
                              + "                   ELSE " + safe.quoted_sql(L("lcl_inactive_data_suffix"))
                                + " END res_deel_omschrijving"
                              + ", r.ins_alg_ruimte_key"
                              + (ab_mode & 1 ?
                                  ""
                                : ", aogg.alg_plaatsaanduiding || ' (' || aogg.alg_onroerendgoed_omschrijving || ')' plaats"
                                )
                              + ", r.res_image"
                              + ", r.res_disc_params_preposttime"
                              + ", r.ins_deel_key";

            var sql_r = getScopedResDeelSql({ select_fields  : select_fields,
                                              extra_from     : (ab_mode & 1 ? "" : "alg_v_allonrgoed_gegevens aogg"),
                                              loc_key        : loc_key,
                                              geb_key        : bld_key,
                                              ver_key        : flr_key,
                                              rui_key        : roo_key,
                                              sdisc          : disc_key,
                                              autfunction    : autfunction,
                                              res_tot        : date_to
                                            });

            if (!(ab_mode & 1)) // Voorziening afhalen
                sql_r += " AND r.ins_alg_locatie_key = " + loc_key
                     + " AND aogg.alg_onroerendgoed_keys = r.ins_alg_ruimte_key";

            sql_r += " GROUP BY"
                   + "  r.res_deel_key"
                   + ", r.res_opmerking"
                   + ", r.res_omschrijving"
                   + ", r.res_vervaldatum"
                   + ", r.ins_alg_ruimte_key"
                   + (ab_mode & 1 ?
                       ""
                     : ", aogg.alg_plaatsaanduiding || ' (' || aogg.alg_onroerendgoed_omschrijving || ')'"
                     )
                   + ", r.res_image"
                   + ", r.res_disc_params_preposttime"
                   + ", r.ins_deel_key"
                   + " ORDER BY 6, 3 ";

            var dparams = { res_van: date_from,
                            res_tot: date_to,
                            disc_key: disc_key };
            var existing_res   = res.plan_deel_bezet_info(dparams);
            var date_time_from = date_from.getTime(); // Eén keer uitrekenen
            var date_time_to   = date_to.getTime();
        }
    }
}

// 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
// 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 });

    if (curPage == 2)
    { %>

        <script type="text/javascript">

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

              // 24/7 organisation
              // 0 = Weekends are holidays (Reservations allowed)
              // 1 = Weekends are working days
              // 2 = Weekends are strict holidays (No reservations allowed)
              var organisation247Type = <%=S("res_247organisation")%>;
              var startDate = new Date(parseInt($("#date_from").val()));
              var isHoliday = cal_isVrijeDag(startDate) || cal_isWeekend(startDate);

              // Display warning: Selected date is not a workday
              if (organisation247Type == 2 && isHoliday) {
                FcltMgr.alert("<%=L("lcl_holiday_strict")%>");
              } else {
                FcltMgr.confirm("<%=L("lcl_holiday")%>", {
                  autoconfirm: !isHoliday || organisation247Type == 1,
                  fncancel: function() { return false; }
                  }, fn_res_next1_confirm);
              }
            }

            function fn_res_next1_confirm()
            {
              var activiteit = <%=act_key%>;

              var datum = $("#date_from").val();
              var bezoekers = $("#bez_cnt").val();

              <% if (!(cvab & 2))
              {
           %>var cvab = $("#cvab_mode").val() || -1; <%
              }
              else if (restype == "CV" || restype == "C")
              {
           %>var cvab = <%= cvab %>; <%
              } %>

              var purl = "?rsv_ruimte_key=-1"
                       + "&date_from=" + datum
                       + "&date_to=" + $("#date_to").val()
                       + (typeof cvab != "undefined" && (cvab % 1) === 0 ? "&cvab=" + cvab : "")
                       + (bezoekers ? "&bez_cnt=" + bezoekers : "")
                       + "<%=safe.jsstring(transitParam)%>";
<%
              var res_eindlevel = 2;
              switch (S("res_show_alg_level"))
              {
                case "L": res_eindlevel = 2; break;
                case "G": res_eindlevel = 3; break;
                case "V": res_eindlevel = 4; break;
                case "R": res_eindlevel = 5; break;
              }
%>
              purl = "plaatsselector.asp"
                   + "?act_key=" + activiteit
                   + "<%=safe.jsstring(transitParamPlaats)%>"
                   + "&filtCode=<%=(restype == "R" ? "RES" : (cvab & 1 ? "RESB" : "RESA"))%>"
                   + "&autlevel=<%=autlevel%>"
                   + "&eindlevel=<%=(restype == "R" ? res_eindlevel : (cvab & 1 ? "5" : res_eindlevel))%>"
                   + "&bind=G"
                   + ( "<%=restype%>" == "C"
                     ? "&return_to=<%=safe.url("reservering.asp")%>" + encodeURIComponent(purl)
                     : "&return_to=<%=safe.url("reservering_new.asp")%>" + encodeURIComponent(purl)
                     )

              window.location.href = 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(<%=res_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 bez_verplicht = "<%=res_verp%>";
              $("#bez_cnt").toggleClass("required", bez_verplicht == 1);
            }

        </script>
<%  } %>

  </head>
  <body>
<%
    PAGE_START({id: "page-"+curPage, pclass: "reservering-new"});
      HEADER({title: subject, back:!qrc, home:!qrc });
      CONTENT_START();

  if (curPage == 0)
  {
        ROFIELD("fld", "AiAi", "Verkeerde pagina");
  }
  if (curPage == 1)
  {

        function fnSubmit(oRs)
        {
          return "?act_key=" + oRs("res_activiteit_key").Value + transitParam;
        }

        var rst = new ResultsetTable({ sql: sql_a
                             ,  keyColumn: "res_activiteit_key"
                             ,  linkColumn: fnSubmit
                             ,  singleLink: true
                             ,  headerColumn: "res_activiteit_omschrijving"
                             ,  ID: "acttable"
                             ,  showAll: true
                             ,  emptySetString: L("lcl_empty")
                             });

        var cnt = rst.processResultset();
  }
  if (curPage == 2)
  {
%>
      <form name="res_new_1" id="res_new_1">
<script>
      var intervals = { begin: [], end: [] };

      function onChangeStartDate()
      {
          <% if (rsv_ruimte_key < 0) { /* alleen bij nieuwe */ %>
              // only change time_from_date_from when there are no intervaltimes
              if (intervals.begin.length == 0)
              {
                var start = new Date(parseInt($('#date_from').val()));
                var today = new Date(Math.floor(new Date().getTime() / 1000) * 1000);
                <% if (urole == "fe") { %>
                today.setMinutes(today.getMinutes() + 5); // beetje marge, anders direct expired
                <% } %>
                if (  $("#time_from_date_from").val() < toTimeString(today)
                   && start.getDate() === today.getDate()
                   && start.getMonth() === today.getMonth()
                   && start.getFullYear() === today.getFullYear()
                   )
                { // entered date is today -> set time to now
                    $("#date_from").val(today.getTime());
                    $("#time_from_date_from").val(toTimeString(today)).change();
                }
                else
                {
                    var thatday = new Date(parseInt($("#date_from").val()));
                    var new_day = thatday.setFloatHours(<%=safe.jsfloat(timeFrom)%>, <%=safe.jsfloat(S("res_h"))%>);
                    $("#date_from").val(new_day.getTime());
                    $("#time_from_date_from").val(toTimeString(new_day)).change();
                }
              }
              if ("<%=restype%>"=="C")
              { // Catering is alleen een tijdstip.
                $("#date_to").val( $("#date_from").val() );
              }
          <% } %>
      }

      $(_ => {
          $("[name='ab_mode']").on("change", function() {
              $("#cvab_mode").val(this.value);
          });
      })
</script>
<%
        FCLTcalendar("date_from",
                      { label : L("lcl_from"),
                        datum: res_van,
                        maxPast: 0,
                        maxFuture: (eff_act_limiet_fe > 0 ? eff_act_limiet_fe : eff_act_limiet),
                        selectableDays: urole == "fe" ? 2 : 0,
                        initEmpty: (rsv_ruimte_key<0 && restype=="C"),
                        timeField: true,
                        timeStep: S("res_h") * 60,
                        startTime: timeFrom,
                        endTime: S("res_t2"),
                        res_dur: S("res_dur"),
                        required: true,
                        volgnr: 1,
                        mobile: true,
                        onChange : "autosetEindtijd()",
                        onChangeDate: "onChangeStartDate()"
                      }
                    );

        FCLTcalendar("date_to",
                      { label : L("lcl_to"),
                        datum: res_tot,
                        maxFuture: (eff_act_limiet_fe > 0 ? eff_act_limiet_fe : eff_act_limiet),
                        timeField: true,
                        timeStep: S("res_h") * 60,
                        startTime: timeFrom,
                        endTime: S("res_t2"),
                        hidden: restype == "R", // Meerdaags ruimte ondersteunen we nog niet echt
                        hidden   : (res_meteind && restype == "R"), // Meerdaags ruimte ondersteunen we nog niet echt
                        trhidden : !res_meteind,
                        required: true,
                        volgnr: 2,
                        mobile: true
                      }
                    );

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

        if (restype == "CV")
        {
            if (!(cvab & 2)) // toggle bezorg/afhaal
            {
              CONTROLGROUP_START();
                var radios = [
                  { id: "cvab-a", value: "0", checked: !(cvab & 1), label: L("lcl_res_afhalen") },
                  { id: "cvab-b", value: "1", checked: (cvab & 1), label: L("lcl_res_bezorgen") }
                ];
                RADIO_GROUP("ab_mode", radios, { big: true });
              CONTROLGROUP_END();
            } %>
            <input type="hidden" id="cvab_mode" name="cvab_mode" value="<%=cvab%>">
<%      }

        CONTROLGROUP_START();
          BUTTON(L("lcl_next"), {click: "fn_res_next1()", icon: "fa-arrow-right" });
        CONTROLGROUP_END();
%>
    </form>
<%}
  if (curPage == 3) // Lijst met geschikte ruimtes
  {

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

        function fncolIcon(oRs)
        {
            var icon = "fa-home";
            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)
        {
            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:"") + " " + L("lcl_prs_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'>"
                 + (S("fac_html_strictness") == 1
                   ? safe.html(oRs.Fields("omschrijving").Value || "")
                   : 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;
                   }
        }

        params.sort_on_count = S("res_lookhistory_days") > 0;
        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();
  }
  if (curPage == 4)
  {

      function fnDiscLink(oRs)
      {
          var disc_key = oRs("ins_discipline_key").Value;
          return "?disc=" + disc_key + transitParam;
      }

      function fnDiscFilter(oRs)
      {
          return oRs("aantal").Value > 0;
      }

      var rst = new ResultsetTable({ sql: sql_d
                                   , keyColumn: "ins_discipline_key"
                                   , fnDataFilter: fnDiscFilter
                                   , linkColumn: fnDiscLink
                                   , singleLink: true
                                   , headerColumn: "ins_discipline_omschrijving"
                                   , ID: "disctable"
                                   , showAll: true
                                   , emptySetString: L("lcl_empty")
                                  });

      var cnt = rst.processResultset();
  }
  if (curPage == 5)
  {

      function fnResCV(oRs)
      {
          res_deel_key = oRs("res_deel_key").Value;
          var alg_ruimte_key = oRs("ins_alg_ruimte_key").Value;
          return "reservering.asp?res_deel=" + res_deel_key
                                    + (ab_mode & 1 ? "" : "&roo_key=" + alg_ruimte_key)
                                    + transitParam;
      }

      function fnObjFilter(oRs)
      {

          var ins_deel_key = oRs("ins_deel_key").Value;
          var prepost_time = oRs("res_disc_params_preposttime").Value||0;
          var ar = existing_res[ins_deel_key]; // Bestaande reserveringen op dit deel

          for (var ci = 0; ar && ci < ar.length; ci++)
          {
              if (date_time_from - prepost_time*60*60*1000 < ar[ci].res_tot.getTime()
                 && date_time_to + prepost_time*60*60*1000 > ar[ci].res_van.getTime())
                  return false; // Overlap!
          }
          return true;
      }

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

      function fncolSubHeader(oRs)
      {
          var txt = "";
          if (!(ab_mode & 1)) // afhalen
          {
              txt = "<div class='listbodytext'>" + L("lcl_res_afhalen_fixed") + ":</div>"
                  + "<div class='listbodytext'>" + safe.html(oRs("plaats").Value) + "</div>";
          }
          return txt;
      }

      var rst = new ResultsetTable({ sql: sql_r
                            , keyColumn: "res_deel_key"
                            , fnDataFilter: fnObjFilter
                            , linkColumn: fnResCV
                            , iconColumn: fnResDeelIcon
                            , headerColumn: "res_deel_omschrijving"
                            , subheaderColumn: fncolSubHeader
                            , ID: "restable"
                            , showAll: true
                            , emptySetString: L("lcl_ins_no_obj_available").format(subject.toLowerCase()) // indien alle objecten al gereserveerd zijn (TODO: eruit filteren)
                           });

      var cnt = rst.processResultset();
  }

      CONTENT_END();
      FOOTER();
    PAGE_END();
PDA_PAGE_END(); %>
	</body>
</html>
<% ASPPAGE_END(); %>
