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

    File:               res_multi.asp
    Description:        Maak een dialoog om gegevens van een deelreservering
                        repeterend te maken
    Parameters:
        rsv_ruimte_key  bron-deelreservering
    Context:
    Note:
*/
%>
<!--#include file="../Shared/common.inc"-->
<!--#include file="../Shared/iface.inc"-->
<!--#include file="../Shared/selector.inc"-->
<!--#include file="../Shared/calendar.inc"-->
<!--#include file="./res.inc"-->
<%
FCLTHeader.Requires({plugins: ["jQuery"],
                          js: ["date.js"]})


var urole = getQParamSafe("urole");
var frontend = urole == "fe";
var rsv_ruimte_key = getQParamInt("rsv_ruimte_key");
res.res_set_dialect(rsv_ruimte_key);

var this_res = res.func_enabled(rsv_ruimte_key); // wat mocht ik zoal op deze reservering
if (urole == "fe")
{
   var rDisc;  // Nodig als parameter, zonder waarde.
    var this_res_optimistic = res.func_enabled(rsv_ruimte_key, rDisc, {checkOptimistic: true});
    // Veelgevraagd: autoswitch naar fo als geen fe-schrijfrechten
    if (!this_res_optimistic.canWrite("WEB_RESUSE") && this_res_optimistic.canWrite("WEB_RESFOF"))
        urole = "fo";
}
user.auth_required_or_abort(this_res.couldCreate);

%>
<html>
  <head>
<%  FCLTHeader.Generate() %>
<%
    // Is dit een reservering met meerder deelreserveringen in een korte periode
    // (opbouw, evenement, opruimen) ?
    var zelfdedag = false;
    if (urole == "fo")
    {
        var sql_ev = "SELECT MAX((res_rsv_ruimte_tot)) - MIN((res_rsv_ruimte_van)) tijdspad"
                   + "  FROM res_rsv_ruimte"
                   + " WHERE res_reservering_key = "
                            + "(SELECT res_reservering_key"
                            + "   FROM res_rsv_ruimte"
                            + "  WHERE res_rsv_ruimte_key = " + rsv_ruimte_key
                            + ")"
                + " HAVING COUNT(res_rsv_ruimte_key) > 1";
        var oRs_ev = Oracle.Execute(sql_ev);
        if (!oRs_ev.eof)
            zelfdedag = (oRs_ev("tijdspad").Value < S("res_copy_all_time_frame"));
        oRs_ev.Close();
    }

    // =========================================
    // Eerst wat info ophalen
    sql = "SELECT rr.res_reservering_key"
        + "     , rr.res_reservering_ispool"
        + "     , rrr.res_rsv_ruimte_van"
        + "     , rrr.res_rsv_ruimte_tot"
        + "     , TRUNC(rrr.res_rsv_ruimte_tot) - TRUNC(rrr.res_rsv_ruimte_van) + 1 res_rsv_ruimte_len"
        + "     , rrr.res_activiteit_key"
        + "     , COALESCE( LEAST( COALESCE(r.res_ruimte_limiet, a.res_activiteit_limiet)"
                      + "        , COALESCE(a.res_activiteit_limiet, r.res_ruimte_limiet)"
                      + "        )"
                      + " , " + S("res_reservering_limiet") 
                      + " ) act_limiet"
        + "     , COALESCE( LEAST( COALESCE(r.res_ruimte_limiet, a.res_activiteit_limiet_fe)"
                      + "        , COALESCE(a.res_activiteit_limiet_fe, r.res_ruimte_limiet)"
                      + "        )"
                      + " , " + S("res_fe_reservering_limiet") 
                      + " ) act_limiet_fe"
        + "     , rrr.res_rsv_ruimte_volgnr"
        + "     , r.res_ruimte_startdatum"
        + "     , r.res_ruimte_vervaldatum"
        + "     , r.res_discipline_key"
        + "     , COALESCE(rrg.alg_gebouw_key, alg.alg_gebouw_key) alg_gebouw_key"
        + "  FROM res_reservering rr"
        + "     , res_rsv_ruimte rrr"
        + "     , res_ruimte_opstelling ro"
        + "     , res_ruimte r"
        + "     , alg_v_allonroerendgoed alg"
        + "     , res_activiteit a"
        + "     , res_v_res_ruimte_gegevens_all rrg"
        + " WHERE rr.res_reservering_key = rrr.res_reservering_key"
        + "   AND rrr.res_activiteit_key = a.res_activiteit_key"
        + "   AND rrr.res_ruimte_opstel_key = ro.res_ruimte_opstel_key(+)"
        + "   AND ro.res_ruimte_key = r.res_ruimte_key(+)"
        + "   AND ro.res_ruimte_key = rrg.res_ruimte_key(+)" // restype = R
        + "   AND rrr.alg_ruimte_key = alg.alg_ruimte_key(+)" // restype = CV
        + "   AND res_rsv_ruimte_key = " + rsv_ruimte_key;
    oRs = Oracle.Execute(sql);
    // Als de ruimte al vervallen is kun je direct wel stoppen.
    var ruimte_startdatum = oRs("res_ruimte_startdatum").Value;
    var ruimte_vervaldatum = oRs("res_ruimte_vervaldatum").Value;

    // Get vrije_dagen for specific building
    var gebouw_key = oRs("alg_gebouw_key").Value;
    var vrije_dagen_alt = [];
    if (gebouw_key !== null) { // restype = [O]pdr geeft nog steeds gebouw_key === null
      var sqlVrijeDagen = "SELECT ag.mld_vrije_dagen_id"
                        + "     , mv.mld_vrije_dagen_datum"
                        + "  FROM alg_gebouw ag"
                        + "     , mld_vrije_dagen mv"
                        + " WHERE ag.mld_vrije_dagen_id = mv.mld_vrije_dagen_id"
                        + "   AND ag.alg_gebouw_key = " + gebouw_key;
      var oRs2 = Oracle.Execute(sqlVrijeDagen);
      while (!oRs2.eof)
      {
        if(oRs2("mld_vrije_dagen_id").Value != "Default") {
          vrije_dagen_alt.push((new Date(oRs2("mld_vrije_dagen_datum").Value)).getTime());
        }
        oRs2.MoveNext();
      }
      oRs2.Close();
    }

    var daysToExpire = null;
    if (ruimte_startdatum != null)
    {
      ruimte_startdatum = new Date(ruimte_startdatum);
    }
    if (ruimte_vervaldatum != null)
    {
      ruimte_vervaldatum = new Date(ruimte_vervaldatum);
      daysToExpire = (ruimte_vervaldatum.midnight().getTime() - new Date().midnight().getTime())/(24*3600*1000);
      if (daysToExpire <= 0)
        abort_with_warning(L("lcl_res_room_expired").format(toDateString(ruimte_vervaldatum)));
    }

    // Maak een lijst met alle dagen van de huidige reservering.
    var gereserveerde_dagen = [];
    var res_dag_van = (new Date(oRs("res_rsv_ruimte_van").Value));
    var res_dag_tot = (new Date(oRs("res_rsv_ruimte_tot").Value));
    res_dag_van.setHours(0, 0, 0, 0);
    res_dag_tot.setHours(0, 0, 0, 0);
    var res_dag = new Date(res_dag_van);
    while (res_dag <= res_dag_tot)
    {
      gereserveerde_dagen.push(res_dag.getTime());
      res_dag.setDate(res_dag.getDate() + 1);
    }

    var rrr = { rsv_ruimte_key    : rsv_ruimte_key,
                reservering_key   : oRs("res_reservering_key").Value,
                reservering_ispool: oRs("res_reservering_ispool").Value == 1,
                rsv_ruimte_van    : new Date(oRs("res_rsv_ruimte_van").Value),
                rsv_ruimte_tot    : new Date(oRs("res_rsv_ruimte_tot").Value),
                rsv_ruimte_len    : oRs("res_rsv_ruimte_len").Value,
                rsv_ruimte_volgnr : oRs("res_rsv_ruimte_volgnr").Value,
                ruimte_startdatum : ruimte_startdatum,
                ruimte_vervaldatum: ruimte_vervaldatum,
                act_key           : oRs("res_activiteit_key").Value,
                act_eff_limiet    : oRs("act_limiet").Value,
                act_eff_limiet_fe : oRs("act_limiet_fe").Value,
                disc_key          : oRs("res_discipline_key").Value
              }
    var disc_expire = (rrr.disc_key
                      ? res.discipline_expire(rrr.disc_key, (S("res_247organisation")==1?2:0))
                      : this_res.earliest_expire_change
                      );
    oRs.Close();
    var res_aantal_dagen = rrr.rsv_ruimte_van - rrr.rsv_ruimte_tot;

    var sql_min = "SELECT TRUNC(SYSDATE) - TRUNC(MIN(res_rsv_ruimte_van)) minDays"
                + "  FROM res_rsv_ruimte"
                + " WHERE res_reservering_key = " + rrr.reservering_key
                + "   AND res_rsv_ruimte_verwijder IS NULL";
    var oRs_min = Oracle.Execute(sql_min);
    var minDays = Math.max(0, oRs_min("minDays").Value);
    oRs_min.Close();
    var maxPast = ((urole=="fe") ? 0 : (S("res_reservering_maxpast") >= 0 ? S("res_reservering_maxpast") : rrr.eff_act_limiet));
    maxPast = ((urole=="fe") ? 0 : (typeof maxPast !== "undefined" ? Math.min(maxPast, minDays) : minDays));
%>
    <script type="text/javascript">
      // 24/7 organisation
      // 0 = Weekends are holidays (Reservations allowed)
      // 1 = Weekends are working days
      // 2 = Weekends are strict holidays (No reservations allowed)
      var res247orgType = (<%=S("res_247organisation")%>);
      var earliest_expire_change = new Date(<%=disc_expire.getTime()%>);
      var frontend = <%=frontend? 1 : 0%> == 1;
      var gereserveerde_dagen = [<%=gereserveerde_dagen%>];
      var mld_vrije_dagen_alt = [<%=vrije_dagen_alt%>];
      if (mld_vrije_dagen_alt.length > 0)
        mld_vrije_dagen = mld_vrije_dagen_alt;

      var res_org_date_tot = new Date(<%=rrr.rsv_ruimte_tot.getTime()%>);
      var new_dates_arr = [];
      var res_aantal_dagen = <%=rrr.rsv_ruimte_len%>; // Reserveringen langer dan een maand kunnen niet herhaald worden.
                                                      // Maximale herhaalperiode is een maand dus als de reservering zelf
                                                      // langer dan een maand is overlapt het zichzelf!

<%
      // ============================================
      // Maak lijst met bestaande reserveringen
      // ============================================
      var sql = "SELECT rm.res_rsv_ruimte_key"
              + "     , rm.res_rsv_ruimte_van"
              + "     , rm.res_rsv_ruimte_tot"
              + "     , rm.res_rsv_ruimte_volgnr"
              + "     , rm.res_rsv_ruimte_dirtlevel"
              + "     , (SELECT COUNT(*)"
                      + "  FROM res_rsv_artikel ra"
                      + " WHERE ra.res_rsv_artikel_verwijder IS NULL"
                      + "   AND ra.res_rsv_ruimte_key = rm.res_rsv_ruimte_key"
              + "       ) aantal_catering"
              + "  FROM res_rsv_ruimte rm"
              + " WHERE rm.res_reservering_key = " + rrr.reservering_key
              + "   AND rm.res_rsv_ruimte_verwijder IS NULL"
              + " ORDER BY rm.res_rsv_ruimte_van"
              + "        , rm.res_rsv_ruimte_key";

%>
      var res_existing_dates = [0
<%
      var oRs = Oracle.Execute(sql);
      var multidate = false;
      var hasCatering = false;
      while (!oRs.Eof)
      {
          var vandate = new Date(oRs("res_rsv_ruimte_van").Value).midnight();
          var totdate = new Date(oRs("res_rsv_ruimte_tot").Value).midnight();
          if (vandate.getTime() != totdate.getTime())
          {
              multidate = true;
          }
          if (oRs("aantal_catering").Value > 0)
          {
              hasCatering = true;
          }
          Response.Write(", " + vandate.getTime());
          oRs.MoveNext;
      }
      oRs.Close();
%>
         ];
<%    if (multidate && hasCatering)
      { %>
        $(function () { FcltMgr.closeDetail(window, { cancel: true, warning: L("lcl_res_no_multi_multi") } ) });
        </script>
<%      Response.End;
        // <script> syntax highlight correction
      } %>

      function withdeelrestoggle()
      {
          let checked = $("#withdeelres").prop("checked");
          $("#show_date_from0").closest("tr").find("td.label").text((checked ? L("lcl_date") : L("lcl_res_repeat2")));

          $("#resmakedates").toggle(!checked);
          $("#isnewres").closest("tr").toggle(!checked);
          $("#sel_cycle").closest("tr").toggle(!checked);
          $("#date_to0").closest("tr").toggle(!checked);
          $("#n_periods").closest("tr").toggle(!checked);
          $("#withWeekends").closest("tr").toggle(!checked);
          $("#show_date_from").closest(".block-wrapper").prev(".simple-block-wrapper").addBack().toggle(!checked); // de kalenders & de buttons "Tonen datums" en "Wissen datums"
          FcltMgr.resized();
      }

      function eraseDates()
      {
        new_dates_arr = [];
        window.dates = [];
        $("#show_date_from").datepicker("refresh"); // undocumented maar werkt bij 1.7.3
        $("#show_date_to0").html("");
        $("#newDates").empty();
      }

      function fillDateArray(chk_lastmin)
      {
        var np = $("#n_periods").val();
        var nextDate = new Date(parseInt($("#date_from0").val()));
        nextDate.setHours(0, 0, 0, 0);
        var interval = parseInt($("#sel_cycle").val());
        var res_new_dates = [];
        var limitDate = null;
<%
        var limit = ((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet);

        // MGE: Als de ruimte vervallen is (daysToExpire <= 0) dan is er hierboven al een abort_with_warning geweest en kom je hier nooit.

        if (daysToExpire != null && daysToExpire >= 0 && daysToExpire < limit)
          limit = daysToExpire - 1; // De vervaldatum niet meerekenen.

        if (limit > 0)
        {
%>
          limitDate = new Date();
          limitDate.setDate(limitDate.getDate() + <%=limit%>);
<%      } %>
        var overflow = false;
        var message = "";
        for (var i = 0; i < np; i++)
        {
          nextDate.setDate(nextDate.getDate() + interval);
          var date2 = new Date(nextDate); // zelfde tijdstip gebruiken als rrr.rsv_ruimte_van
          date2 = date2.setFloatHours(new Date(<%=rrr.rsv_ruimte_van.getTime()%>).getFloatHours(), <%=safe.jsfloat(S("res_h"))%>);

          if (chk_lastmin && frontend && earliest_expire_change && date2 < earliest_expire_change)
          {
            message = L("lcl_res_repeat_lastmin_n");
            continue;
          }
          if (limitDate && nextDate > limitDate)
          {
            overflow = true;
            break;
          }
          if ($("#withWeekends:checked").val() == "on" && isDateWeekendOrHoliday(nextDate, mld_vrije_dagen))
          {
            np++;
            continue;
          }
          res_new_dates.push(nextDate.getTime());
        }

        var result = {res_new_dates: res_new_dates, message: message};
        // Alleen als op de "Tonen datums" button (chk_lastmin is true) is geklikt, de melding geven en niet meer bij invoer.
        // Anders moet je minstens twee keer klikken op de button om de datums te tonen.
        if (chk_lastmin && overflow)
          result.message += (message != ""? "<br>" : "") + L("lcl_res_date_limit_reached") + toDateString(limitDate);
        return result;
      }

      function finishFillDates(json, textStatus)
      {
        if (json.message)
          FcltCallback(json, textStatus); // Geef message weer

        var res_new_dates = json.res_new_dates;
        if (res_new_dates)
        {
          for (var j = 0; j < res_new_dates.length; j++)
          { // Dezelfde datums niet opnieuw toevoegen.
            var exists = false;
            for (var k = 0; k < window.dates.length; k++)
            {
              if (parseInt(window.dates[k], 10) == parseInt(res_new_dates[j], 10))
              {
                exists = true;
                continue;
              }
            }
            if (!exists)
            { // Alleen geldige startdatums
              var v_periode = [];
              for (var z = 0; z < res_aantal_dagen; z++)
              {
                v_periode.push(res_new_dates[j] + (z * 24*60*60*1000)); // Merge de startdatum van herhaling plus alle dagen in meerdaagse reservering.
              }
              new_dates_arr.push({start: res_new_dates[j], periode: v_periode});
            }
          }
          var nextDate = new Date();
          $("#newDates").empty();
          for (var i = 0; i < new_dates_arr.length; i++)
          { // #newDates bevat de (start)datums van de herhaalde reserveringen.
            // Bij meerdaagse reserveringen dus niet alle gereserveerde datums (: de datums die tussen start- en einddatum liggen).
            nextDate.setTime(new_dates_arr[i].start);
            $("#newDates").append("<option value=" + nextDate.getTime() + ">" + toDateString(nextDate) + "</option>");
            // Zet in kalender alle gereserveerde dagen, dus bij meerdaagse reserveringen ook alle dagen tussen start- en einddatum.
            for (var d = 0; d < new_dates_arr[i].periode.length; d++)
            {
              window.dates.push(new_dates_arr[i].periode[d]); // Merge de startdatum van herhaling plus alle dagen in meerdaagse reservering.
            }
          }

          // Toon eerste startdatum herhaalde reservering op eerste kalender.
          var startDate = Math.min.apply(null, window.dates);
          nextDate.setTime(startDate);
          $("#show_date_from").datepicker("setDate", nextDate);
          $("#show_date_from").datepicker("option", "defaultDate", nextDate);
          $("#show_date_from").datepicker("refresh"); // undocumented maar werkt bij 1.7.3
        }
      }

      function fillDates(chk_lastmin, dosubmit)
      {
        var np = $("#n_periods").val();
        if (isNaN(np) || np < 1)
        {
          FcltMgr.alert(L("lcl_res_period_error"))
          return;
        }

        var interval = parseInt($("#sel_cycle").val());
        if (interval == 31) // Maandelijks
        {
          var nextDate = new Date(parseInt($("#date_from0").val()));
          nextDate.setHours(0, 0, 0, 0);
          var bits = parseInt($("#dayofmonth").val(), 10) + parseInt($("#dayofweek").val(), 10);
          var data = { urole: "<%=urole%>",
                       chk_lastmin: chk_lastmin? 1 : 0,
                       np: np,
                       nextDate: nextDate.getTime(),
                       bits: bits,
                       act_effectief_limiet: <%=((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet)%>,
                       rsv_ruimte_van: <%=rrr.rsv_ruimte_van.getTime()%>,
                       ruimte_startdatum: <%=rrr.ruimte_startdatum != null? rrr.ruimte_startdatum.getTime() : -1%>,
                       ruimte_vervaldatum: <%=rrr.ruimte_vervaldatum != null? rrr.ruimte_vervaldatum.getTime() : -1%>,
                       earliest_expire_change: earliest_expire_change.getTime()
                     };
          $.getJSON("get_res_info_ajax.asp?req_info=res_new_dates",
                    data,
                    function(data)
                    {
                      if (chk_lastmin)
                      {
                        finishFillDates(data);
                        if (dosubmit) multi_submit();
                      }
                      else
                        finishCalcEinddatum(data);
                    }
                   );
        }
        else
        {
          var data = fillDateArray(chk_lastmin); // lijst met volgende startdatums herhaalde reservering
          if (chk_lastmin)
          {
            finishFillDates(data);
            if (dosubmit) multi_submit();
          }
          else
            finishCalcEinddatum(data);
        }
      }

      function finishCalcEinddatum(json, textStatus)
      {
        if (json.message)
          FcltCallback(json, textStatus); // Geef message weer

        var res_new_dates = json.res_new_dates;
        if (res_new_dates)
        {
          var nextDate = new Date();
          nextDate.setTime(res_new_dates[res_new_dates.length - 1]);
          $("#show_date_to0").datepicker("setDate", nextDate);
        }
      }

      function calcEinddatum()
      {
        fillDates(false);
      }

      function finishCalcPerioden(json, textStatus)
      {
        var res_steps = json.res_steps;
        if (res_steps >= 0)
          $("#n_periods").val(res_steps);
      }

      function calcPerioden()
      {
        var periodedagen = new Array();
        var interval = parseInt($("#sel_cycle").val());
        var nextDate = new Date(parseInt($("#date_from0").val()));
        var lastDate = new Date(parseInt($("#date_to0").val()));
        nextDate.setHours(0, 0, 0, 0);
        lastDate.setHours(0, 0, 0, 0);

        if (interval == 31) // Maandelijks
        {
          if (nextDate <= lastDate)
          {
            var np = $("#n_periods").val();
            var bits = parseInt($("#dayofmonth").val(), 10) + parseInt($("#dayofweek").val(), 10);
            var data = { urole: "<%=urole%>",
                         np: np != ""? np : 0,
                         nextDate: nextDate.getTime(),
                         lastDate: lastDate.getTime(),
                         bits: bits
                       };
            $.getJSON("get_res_info_ajax.asp?req_info=res_nr_periods",
                      data,
                      finishCalcPerioden
                     );
          }
        }
        else
        {
          if ((res247orgType != 2) && isDateWeekendOrHoliday(nextDate, mld_vrije_dagen)) {
              $("#withWeekends").prop("checked", false); // een vrije/weekend dag geselecteerd, dus niet alleen werkdagen.
          } else if (res247orgType == 2) {
            $("#withWeekends").prop("checked", true); // Alleen werkdagen.
          }

          nextDate.setDate(nextDate.getDate() + interval);

          while (nextDate <= lastDate) {
            // No holidays
            if (!($("#withWeekends:checked").val() == "on" && isDateWeekendOrHoliday(nextDate, mld_vrije_dagen))) {
              periodedagen.push(nextDate);
            }
            nextDate.setDate(nextDate.getDate() + interval);
          }
          var aantaldagen = periodedagen.length;
          $("#n_periods").val(aantaldagen);
        }
      }

      function onChangePeriod(el)
      {
        if (el.value == 0) // niet periodiek
          $("#n_periods").attr("disabled", true).val(1);
        else
          $("#n_periods").attr("disabled", false);

        if (el.value == 31) // Maandelijks
        {
          $(".trweekends").hide();
          $(".trdays").show();
        }
        else
        {
          $(".trweekends").show();
          $(".trdays").hide();
        }
        calcPerioden();
      }

      function multi_submit_callback(json, textStatus)
      {
        iface.button.enable("btn_res_submit");
        if (json.success)
        {
          FcltMgr.closeDetail(window, json); // zelf in ieder geval dicht
          if (json.new_rsv_ruimte_key > 0)
            FcltMgr.openDetail("appl/res/res_reservering.asp?urole=<%=urole%>&rsv_ruimte_key=" + json.new_rsv_ruimte_key);
        }
      }

      function multi_submit()
      {
        if (!dates.length)
        {
          if ($("#withdeelres").prop("checked"))
          {
            $("#n_periods").val(1);               // Zet aantal perioden 1 voor kopieren reservering met alle deelreserveringen
            $("#isnewres").prop("checked", true); // en buiten reeks (dus nieuw reserveringsnummer).
          }

          fillDates(true, true); // Na het vullen van de datums wordt er opnieuw een submit gedaan. Daardoor is een alert melding niet meer nodig.
          return false;
        }

        $("#newDates").empty();
        dates.sort();

        //if chosen dates have weekend or holiday
        var hasHoliday = false;
        for (var i = 0; i < new_dates_arr.length; i++) {
          var nextDate = new_dates_arr[i].start;
          // Alleen startdatum van reservering opslaan.
          $("#newDates").append("<option value=" + nextDate + ">" + toDateString(new Date(nextDate)) + "</option>");
          for (j = 0; j < new_dates_arr[i].periode.length; j++) {
            // Bij een meerdaagse reservering wel alle dagen controleren of het een vrije dag is.
            // Voor een eendaagse reservering geldt dat elke dag een startdatum is.
            nextDate = new_dates_arr[i].periode[j];
            if (!hasHoliday && isDateWeekendOrHoliday(new Date(nextDate), mld_vrije_dagen)) {
                hasHoliday = true;
            }
          }
        }

        if (hasHoliday && (res247orgType == 1 || res247orgType == 2) && frontend) { // Strict: holidays not allowed.
          FcltMgr.alert(L("lcl_holiday_found_strict"));
          return false;
        } else { // Tolerated: Can book holidays, but warning is shown.
            FcltMgr.confirm(L("lcl_holiday_found"), {
                autoconfirm: !hasHoliday || res247orgType == 1,
                fncancel: function() { iface.button.enable("btn_res_submit"); }
            }, postRepeat);
        }
      }

      function postRepeat() {
          $("#newDates > option").prop("selected", "true");
          $.post($("form[name=u2]")[0].action, $("[name=u2]").serialize(), FcltCallbackAndThenAlways(multi_submit_callback), "json");
          return true; // disable submit
      }

      // Maintain array of dates
      // Vrij naar http://stackoverflow.com/questions/1452066
      var dates = new Array();
      function addDate(date)
      {
        var date2 = new Date(date); // zelfde tijdstip gebruiken als rrr.rsv_ruimte_van
        date2 = date2.setFloatHours(new Date(<%=rrr.rsv_ruimte_van.getTime()%>).getFloatHours(), <%=safe.jsfloat(S("res_h"))%>);

        if (frontend && earliest_expire_change && date2 < earliest_expire_change)
        {
          FcltMgr.alert(L("lcl_res_repeat_lastmin"));
          return;
        }
        if ($.inArray(date, dates) < 0) dates.push(date);
      }

      function removeDate(index)
      {
        dates.splice(index, 1);
      }

      // Adds a date if we don't have it yet, else remove it
      function addOrRemoveDate(date)
      {
        var index = $.inArray(date, dates);
        if (index >= 0)
        { // Verwijderen van resevering.
          // Als je bij een meerdaagse reservering op een van de dagen van een deelreservering klikt
          // dan moeten alle dagen van die deelreservering verwijderd worden.
          var res_index = Math.floor(index / res_aantal_dagen); // index voor de startdatum van (meerdaagse) reservering in global new_dates_arr.
          var startindex = res_index * res_aantal_dagen;
          var eindindex = startindex + res_aantal_dagen - 1;
          for (var i=eindindex; i>=startindex; i--)
          {
            removeDate(i);
          }
          new_dates_arr.splice(res_index, 1);
        }
        else
        { // Handmatig toevoegen van reservering.
          // Bij een meerdaagse reservering moet vanaf de geklikte datum het aantal dagen voor de deelreservering worden toegevoegd.
          var v_periode = [];
          for (var i=0; i<res_aantal_dagen; i++)
          {
            var v_date = date + (i * 24*60*60*1000);
            if ($.inArray(v_date, dates) >= 0)
            { // Er is overlap met andere aangegeven herhaling
              // verwijder de zojuist toegevoegde datums weer uit dates.
              for (var i=0; i<v_periode.length; i++)
              {
                var overlap_index = $.inArray(v_periode[i], dates);
                removeDate(overlap_index);
              }
              v_periode = [];
              FcltMgr.alert(L("lcl_res_repeat_overlap"));
              break;
            }
            else
            {
              v_periode.push(v_date);
              addDate(v_date);
            }
          }
          new_dates_arr.push({start: date, periode: v_periode});
          new_dates_arr.sort(function(a,b){return a.start - b.start});
        }
      }

      // Check if date is weekend (sunday or saturday)
      function isDateWeekend(date) {
        if(date.getDay() == 0 || date.getDay() == 6)
          return true;
        return false;
      }

      // Check if date is holiday
      function isHoliday(date, vrijeDagen) {
        if ($.inArray(date.getTime(), vrijeDagen) > -1 )
          return true;
        return false;
      }

      // Check if date is holiday or weekend
      function isDateWeekendOrHoliday(date, vrijeDagen) {
        if (isHoliday(date, vrijeDagen) || (isDateWeekend(date) && (res247orgType == 0 || res247orgType == 2)) )
          return true;
        return false;
      }

      // Check if date is reserved
      function isDateReserved(date, reservedDates) {
        if ($.inArray(date.getTime(), reservedDates) > -1 )
          return true;
        return false;
      }

      $(function()
      { // multi-calendar parameters.
        var params = {altField: "#date_from",
                      minDate: "-<%=maxPast%>d",
                      numberOfMonths: 3,
                      defaultDate: new Date(),
                      onSelect: function(dateText, inst) // noot: het alt-veld is al bijgewerkt
                                {
                                  var dt = parseInt($("#date_from").val());
                                  addOrRemoveDate(dt);
                                },
                      beforeShowDay: function (date)
                                     {
                                      if ($.inArray(date.getTime(), dates) >= 0) {
                                        // Enable date so it can be deselected. Set style to be highlighted
                                        return [true, "calselected"];
                                      }

                                      if (isDateWeekendOrHoliday(date, mld_vrije_dagen) || isDateReserved(date, gereserveerde_dagen))
                                      {
                                        if ((res247orgType == 2 && frontend) || isDateReserved(date, gereserveerde_dagen)) // If date is a holiday or weekend (Reservations not allowed), add disabled class
                                          return [true, "ui-state-disabled"];
                                        else                                // If date is a holiday or weekend (Reservations allowed), add gray-out class
                                          return [true, "ui-datepicker-vrije-dag"];
                                      }
                                      else
                                      {
                                        return [true, (res247orgType == 1 ? "ui-datepicker-org247" : "")];
                                      }

                                     }
                     };
<%      var limit = ((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet);
        if (daysToExpire != null && daysToExpire >= 0 && daysToExpire < limit)
          var limit = daysToExpire - 1; // De vervaldatum niet meerekenen.
        if (limit > 0)
        { %>
          params.maxDate = "+<%=limit%>";
<%      } %>
        $("#show_date_from").datepicker(params);
        onChangePeriod($("#sel_cycle"));
        FcltMgr.resized();
      });

    </script>
  </head>
  <body class="fclt-modal" id="mod_resmulti">
  <% MODAL_START(); %>
  <form name="u2"
        action="res_multi_create_save.asp?urole=<%=urole%>&rsv_ruimte_key=<%=rsv_ruimte_key%>"
        method="post">
<%
    if (rrr.reservering_ispool)
        MODAL_BLOCK_START("", L("lcl_res_repeat_pool").format(rrr.reservering_key), { icon: "fa-clone" });
    else
        MODAL_BLOCK_START("", L("lcl_res_repeat1") + rrr.reservering_key + "/" + rrr.rsv_ruimte_volgnr + L("lcl_res_repeat3"), { icon: "fa-clone" });
%>
    <tr><td colspan="2"><div id="resmakedates"><%=L("lcl_res_makedates")%></div></td></tr>

<%
    if (zelfdedag)
        RWCHECKBOXTR("withdeelres", "fldcheck", L("lcl_res_repeat4"), false, { html: "onClick='withdeelrestoggle()'" });

    if (!rrr.reservering_ispool)
        RWCHECKBOXTR("isnewres", "fldcheck", L("lcl_res_copy_deelres"), false, {});

    // ======= FIELD "Periode" =======
    sql = "SELECT c.res_cyclus_periode"
        + "     , " + lcl.xsqla('c.res_cyclus_naam', 'res_cyclus_key')
        + "  FROM res_cyclus c"
        + " WHERE res_cyclus_periode > 0"
        + " ORDER BY res_cyclus_periode";
    FCLTselector("sel_cycle",
                 sql,
                 { label: L("lcl_period"),
                   onChange: "onChangePeriod(this)"
                 }
                );
    var today = new Date();
    var maxFuture = ((urole == "fe" && rrr.act_eff_limiet_fe > 0) ? rrr.act_eff_limiet_fe : rrr.act_eff_limiet);
    FCLTcalendar("date_from0",
                 { label : L("lcl_res_repeat2"),
                   datum: rrr.rsv_ruimte_van.getTime() > today.getTime()? rrr.rsv_ruimte_van : today, // of today als de ruimte ouder is
                   maxPast : maxPast,
                   maxFuture: maxFuture,
                   timeField: false,
                   volgnr: 1,
                   onChange: "calcPerioden()"
                 });

    FCLTcalendar("date_to0",
                 { label: L("lcl_end_date"),
                   datum: today,
                   initEmpty: true,
                   maxPast : maxPast,
                   maxFuture: maxFuture,
                   timeField: false,
                   volgnr: 2,
                   onChange: "calcPerioden()"
                 });

    RWFIELDTR("n_periods", "fld", L("lcl_n_of_periods"), "", { html: "onChange='calcEinddatum();'" });
    RWCHECKBOXTR("withWeekends", "", L("lcl_res_skipnonworkdays"), 1, { trclass: "trweekends", html: "onClick='calcPerioden();'", hidden: (S("res_247organisation")==1) });
%>
    <tr class="trdays">
      <td class="label"><label for="dayofmonth"><%=L("lcl_res_day")%></label></td>
      <td>
<%
      sql = "       SELECT 256, " + safe.qL("lcl_res_eerste") + ", 1 FROM DUAL"
          + " UNION SELECT 512, " + safe.qL("lcl_res_tweede") + ", 2 FROM DUAL"
          + " UNION SELECT 768, " + safe.qL("lcl_res_derde") + ", 3 FROM DUAL"
          + " UNION SELECT 1024, " + safe.qL("lcl_res_vierde") + ", 4 FROM DUAL"
          + " UNION SELECT 1280, " + safe.qL("lcl_res_vijfde") + ", 5 FROM DUAL"
          + " UNION SELECT 1536, " + safe.qL("lcl_res_eennalaatste") + ", 6 FROM DUAL"
          + " UNION SELECT 1792, " + safe.qL("lcl_res_laatste") + ", 7 FROM DUAL"
          + " ORDER BY 1";
      FCLTselector("dayofmonth",
                   sql,
                   { initKey: 1,
                     required: false,
                     html: " width='100px'",
                     onChange: "calcPerioden()"
                   });
      sql = "";
      for (var i = 0; i <= 6; i++)
      {
        sql += (i > 0? " UNION " : "") + "SELECT " + Math.pow(2, (i )) + ", " + safe.quoted_sql(calendar_names.days[i]) + " FROM DUAL"
      }
      sql += " ORDER BY 1";
      FCLTselector("dayofweek",
                   sql,
                   { initKey: 1,
                     required: false,
                     onChange: "calcPerioden()"
                   });
%>
      <%=L("lcl_res_period_ofthemonth")%></td>
    </tr>
    <%MODAL_BLOCK_END();
      SIMPLE_BLOCK_START();
      var buttons =  [{ title: L("lcl_res_showdates"), action: "fillDates(true)", icon: "fa-calendar-day" },
                      { title: L("lcl_res_erasedates"), action: "eraseDates()", icon: "fa-calendar-times" }];
        CreateButtons(buttons);
      SIMPLE_BLOCK_END();
      MODAL_BLOCK_START("multi_res_dates", "", { nopadding: true });
%>
        <input type="hidden" id="date_from"/>
        <% /* #show_date_from heeft harde hoogte in de css voor als je naar een maand bladert met een week meer dan de meeste maanden */ %>
        <div id="show_date_from"></div>
        <select style="display:none" id="newDates" name="newDates" multiple size="10"></select>
<%    MODAL_BLOCK_END();
      SIMPLE_BLOCK_START();
        CreateButtons([ { title: L("lcl_res_duplicate"), action: "multi_submit()", icon: "fa-fclt-save", singlepress: true, id:"btn_res_submit", importance: 1 },
                        { title: L("lcl_cancel"), action: "FcltMgr.closeDetail(window, { cancel: true } )", icon: "fa-fclt-cancel", importance: 3} ]);
      SIMPLE_BLOCK_END();
  IFACE.FORM_END(); %>
  </form>
  <% MODAL_END(); %>
</body>
<% ASPPAGE_END(); %>
