Files
Facilitor/APPL/RES/res_multi_create.asp
Jos Groot Lipman 300d1f9bf9 Merge 2025.2 RC2 patches
svn path=/Website/trunk/; revision=69610
2025-07-01 10:20:25 +00:00

853 lines
36 KiB
Plaintext

<%@ 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(); %>