@recras/online-booking-js 1.10.3 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -2
- package/changelog.md +4 -0
- package/dist/onlinebooking.js +185 -91
- package/dist/onlinebooking.min.js +1 -0
- package/docs/onlinebooking.html +1 -1
- package/package.json +20 -18
- package/src/booking.js +49 -3
- package/src/eventHelper.js +32 -5
- package/src/vouchers.js +21 -2
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[](https://travis-ci.org/Recras/online-booking-js)
|
|
2
2
|
|
|
3
3
|
# Recras JS Integration Library
|
|
4
|
-
Version: 1.
|
|
4
|
+
Version: 1.11.0
|
|
5
5
|
|
|
6
6
|
JS library for easy online booking, contact form, and voucher integration
|
|
7
7
|
|
|
@@ -128,7 +128,7 @@ The library sends out a few custom events when certain things change:
|
|
|
128
128
|
You can use these events for custom actions, such as analytics. For use in code, please refer to
|
|
129
129
|
the constants in [src/eventHelper.js](src/eventHelper.js).
|
|
130
130
|
|
|
131
|
-
When Google Analytics integration is enabled, certain events sent to GA include a label and/or value:
|
|
131
|
+
When Google Analytics integration is enabled, certain events are sent to GA. Which events are sent depends on the version of GA you are using. For Universal Analytics (v3) and older, these custom events are sent and they include a label and/or value:
|
|
132
132
|
|
|
133
133
|
| Event | Label | Value |
|
|
134
134
|
| ---------------------------------- | --------------------------------- |-------------------------------------|
|
|
@@ -140,3 +140,8 @@ When Google Analytics integration is enabled, certain events sent to GA include
|
|
|
140
140
|
| `Recras:Voucher:TemplateChanged` | N/A | Template ID |
|
|
141
141
|
| `Recras:Voucher:BuyInProgress` | Template name | Rounded total amount of the order |
|
|
142
142
|
| `Recras:Voucher:RedirectToPayment` | N/A | Rounded total amount of the order |
|
|
143
|
+
|
|
144
|
+
For GA4, these events are sent:
|
|
145
|
+
* when a package is selected: `select_content`. The ID of the package is included.
|
|
146
|
+
* when a voucher is selected: `select_content`. The ID of the template is included.
|
|
147
|
+
* when the user is redirected to the payment provider: `begin_checkout`. The total amount as well as all selected items (name, price, quantity) are included.
|
package/changelog.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.11.0 (2022-04-04)
|
|
4
|
+
* Add support for Google Analytics v4 (GA4)
|
|
5
|
+
* Minified version of the script is now included
|
|
6
|
+
|
|
3
7
|
## 1.10.3 (2021-12-16)
|
|
4
8
|
* Change value of "BuyInProgress" events from package/template ID (bookings/vouchers, respectively) to total price
|
|
5
9
|
|
package/dist/onlinebooking.js
CHANGED
|
@@ -46,11 +46,11 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
|
|
|
46
46
|
|
|
47
47
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
48
48
|
|
|
49
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
49
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
50
50
|
|
|
51
51
|
/*******************************
|
|
52
52
|
* Recras integration library *
|
|
53
|
-
* v 1.
|
|
53
|
+
* v 1.11.0 *
|
|
54
54
|
*******************************/
|
|
55
55
|
var RecrasBooking = /*#__PURE__*/function () {
|
|
56
56
|
function RecrasBooking() {
|
|
@@ -438,7 +438,10 @@ var RecrasBooking = /*#__PURE__*/function () {
|
|
|
438
438
|
return Promise.resolve(false);
|
|
439
439
|
} else {
|
|
440
440
|
this.clearAllExceptPackageSelection();
|
|
441
|
-
this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING, RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED, selectedPackage[0].arrangement, selectedPackage[0].id
|
|
441
|
+
this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING, RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED, selectedPackage[0].arrangement, selectedPackage[0].id, {
|
|
442
|
+
content_type: 'package',
|
|
443
|
+
item_id: selectedPackage[0].id
|
|
444
|
+
});
|
|
442
445
|
}
|
|
443
446
|
|
|
444
447
|
this.selectedPackage = selectedPackage[0];
|
|
@@ -1666,10 +1669,52 @@ var RecrasBooking = /*#__PURE__*/function () {
|
|
|
1666
1669
|
});
|
|
1667
1670
|
return attachments;
|
|
1668
1671
|
}
|
|
1672
|
+
}, {
|
|
1673
|
+
key: "formatGA4Items",
|
|
1674
|
+
value: function formatGA4Items() {
|
|
1675
|
+
var _this28 = this;
|
|
1676
|
+
|
|
1677
|
+
var items = [];
|
|
1678
|
+
|
|
1679
|
+
if (this.bookingSize() > 0) {
|
|
1680
|
+
var pck = this.selectedPackage;
|
|
1681
|
+
items.push({
|
|
1682
|
+
item_name: pck.weergavenaam || pck.arrangement,
|
|
1683
|
+
price: this.bookingSizePrice(pck),
|
|
1684
|
+
quantity: this.bookingSize()
|
|
1685
|
+
});
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1688
|
+
var linesNoBookingSize = this.getLinesNoBookingSize(this.selectedPackage);
|
|
1689
|
+
linesNoBookingSize = linesNoBookingSize.filter(function (line) {
|
|
1690
|
+
var lineEl = _this28.findElement("[data-package-id=\"".concat(line.id, "\"]"));
|
|
1691
|
+
|
|
1692
|
+
if (!lineEl) {
|
|
1693
|
+
return false;
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
if (isNaN(parseInt(lineEl.value))) {
|
|
1697
|
+
return false;
|
|
1698
|
+
}
|
|
1699
|
+
|
|
1700
|
+
return parseInt(lineEl.value) > 0;
|
|
1701
|
+
});
|
|
1702
|
+
linesNoBookingSize = linesNoBookingSize.map(function (line) {
|
|
1703
|
+
var lineEl = _this28.findElement("[data-package-id=\"".concat(line.id, "\"]"));
|
|
1704
|
+
|
|
1705
|
+
return {
|
|
1706
|
+
item_name: line.beschrijving_templated,
|
|
1707
|
+
price: line.product.verkoop,
|
|
1708
|
+
quantity: parseInt(lineEl.value)
|
|
1709
|
+
};
|
|
1710
|
+
});
|
|
1711
|
+
items.push.apply(items, _toConsumableArray(linesNoBookingSize));
|
|
1712
|
+
return items;
|
|
1713
|
+
}
|
|
1669
1714
|
}, {
|
|
1670
1715
|
key: "submitBooking",
|
|
1671
1716
|
value: function submitBooking() {
|
|
1672
|
-
var
|
|
1717
|
+
var _this29 = this;
|
|
1673
1718
|
|
|
1674
1719
|
var productCounts = this.productCounts().map(function (line) {
|
|
1675
1720
|
return line.aantal;
|
|
@@ -1728,30 +1773,34 @@ var RecrasBooking = /*#__PURE__*/function () {
|
|
|
1728
1773
|
|
|
1729
1774
|
return this.postJson('onlineboeking/reserveer', bookingParams).then(function (json) {
|
|
1730
1775
|
if (json.payment_url) {
|
|
1731
|
-
|
|
1776
|
+
_this29.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING, RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT, null, Math.round(_this29.getTotalPrice()), {
|
|
1777
|
+
currency: _this29.languageHelper.currency,
|
|
1778
|
+
value: _this29.getTotalPrice(),
|
|
1779
|
+
items: _this29.formatGA4Items()
|
|
1780
|
+
});
|
|
1732
1781
|
|
|
1733
1782
|
window.top.location.href = json.payment_url;
|
|
1734
1783
|
} else if (json.redirect) {
|
|
1735
1784
|
window.top.location.href = json.redirect;
|
|
1736
1785
|
} else if (json.message && json.status) {
|
|
1737
|
-
|
|
1786
|
+
_this29.findElement('.recras-amountsform').reset();
|
|
1738
1787
|
|
|
1739
|
-
|
|
1788
|
+
_this29.findElement('.recras-datetime').reset();
|
|
1740
1789
|
|
|
1741
|
-
|
|
1790
|
+
_this29.findElement('.recras-contactform').reset();
|
|
1742
1791
|
|
|
1743
|
-
|
|
1792
|
+
_this29.element.scrollIntoView({
|
|
1744
1793
|
behavior: 'smooth'
|
|
1745
1794
|
});
|
|
1746
1795
|
|
|
1747
|
-
|
|
1796
|
+
_this29.element.insertAdjacentHTML('afterbegin', "<p class=\"recras-success\">".concat(json.message, "</p>"));
|
|
1748
1797
|
} else {
|
|
1749
1798
|
console.log(json);
|
|
1750
1799
|
}
|
|
1751
1800
|
|
|
1752
|
-
|
|
1801
|
+
_this29.loadingIndicatorHide();
|
|
1753
1802
|
|
|
1754
|
-
|
|
1803
|
+
_this29.findElement('.bookPackage').removeAttribute('disabled');
|
|
1755
1804
|
});
|
|
1756
1805
|
}
|
|
1757
1806
|
}, {
|
|
@@ -1787,7 +1836,7 @@ var RecrasBooking = /*#__PURE__*/function () {
|
|
|
1787
1836
|
}, {
|
|
1788
1837
|
key: "updateProductAmounts",
|
|
1789
1838
|
value: function updateProductAmounts() {
|
|
1790
|
-
var
|
|
1839
|
+
var _this30 = this;
|
|
1791
1840
|
|
|
1792
1841
|
this.loadingIndicatorHide();
|
|
1793
1842
|
this.availableDays = [];
|
|
@@ -1797,7 +1846,7 @@ var RecrasBooking = /*#__PURE__*/function () {
|
|
|
1797
1846
|
var maxPromise = this.checkMaximumForPackage();
|
|
1798
1847
|
this.checkBookingSize(this.selectedPackage);
|
|
1799
1848
|
this.recheckVouchers().then(function () {
|
|
1800
|
-
|
|
1849
|
+
_this30.showTotalPrice();
|
|
1801
1850
|
});
|
|
1802
1851
|
this.showStandardAttachments();
|
|
1803
1852
|
var datePickerEl = this.findElement('.recras-onlinebooking-date');
|
|
@@ -1845,16 +1894,16 @@ var RecrasBooking = /*#__PURE__*/function () {
|
|
|
1845
1894
|
}, {
|
|
1846
1895
|
key: "getAvailableDaysInPeriod",
|
|
1847
1896
|
value: function getAvailableDaysInPeriod(packageId, startDate, endDate) {
|
|
1848
|
-
var
|
|
1897
|
+
var _this31 = this;
|
|
1849
1898
|
|
|
1850
1899
|
var datePickerEl = this.findElement('.recras-onlinebooking-date');
|
|
1851
1900
|
this.getAvailableDays(packageId, startDate, endDate).then(function (availableDays) {
|
|
1852
|
-
|
|
1901
|
+
_this31.loadingIndicatorHide();
|
|
1853
1902
|
|
|
1854
1903
|
if (datePickerEl.value && availableDays.indexOf(datePickerEl.value) === -1) {
|
|
1855
1904
|
datePickerEl.value = '';
|
|
1856
1905
|
|
|
1857
|
-
|
|
1906
|
+
_this31.clearTimes();
|
|
1858
1907
|
} else {
|
|
1859
1908
|
datePickerEl.removeAttribute('disabled');
|
|
1860
1909
|
}
|
|
@@ -1949,7 +1998,7 @@ var RecrasCalendarHelper = /*#__PURE__*/function () {
|
|
|
1949
1998
|
|
|
1950
1999
|
var RecrasContactForm = /*#__PURE__*/function () {
|
|
1951
2000
|
function RecrasContactForm() {
|
|
1952
|
-
var
|
|
2001
|
+
var _this32 = this;
|
|
1953
2002
|
|
|
1954
2003
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1955
2004
|
|
|
@@ -1979,11 +2028,11 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
1979
2028
|
}
|
|
1980
2029
|
|
|
1981
2030
|
this.fetchJson = function (url) {
|
|
1982
|
-
return RecrasHttpHelper.fetchJson(url,
|
|
2031
|
+
return RecrasHttpHelper.fetchJson(url, _this32.error.bind(_this32));
|
|
1983
2032
|
};
|
|
1984
2033
|
|
|
1985
2034
|
this.postJson = function (url, data) {
|
|
1986
|
-
return RecrasHttpHelper.postJson(
|
|
2035
|
+
return RecrasHttpHelper.postJson(_this32.options.getApiBase() + url, data, _this32.error.bind(_this32));
|
|
1987
2036
|
};
|
|
1988
2037
|
|
|
1989
2038
|
RecrasCSSHelper.loadCSS('global');
|
|
@@ -2007,7 +2056,7 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2007
2056
|
_createClass(RecrasContactForm, [{
|
|
2008
2057
|
key: "checkRequiredCheckboxes",
|
|
2009
2058
|
value: function checkRequiredCheckboxes() {
|
|
2010
|
-
var
|
|
2059
|
+
var _this33 = this;
|
|
2011
2060
|
|
|
2012
2061
|
this.removeWarnings();
|
|
2013
2062
|
var isOkay = true;
|
|
@@ -2016,7 +2065,7 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2016
2065
|
var checked = group.querySelectorAll('input:checked');
|
|
2017
2066
|
|
|
2018
2067
|
if (checked.length === 0) {
|
|
2019
|
-
group.parentNode.querySelector('label').insertAdjacentHTML('beforeend', "<div class=\"recrasError\">".concat(
|
|
2068
|
+
group.parentNode.querySelector('label').insertAdjacentHTML('beforeend', "<div class=\"recrasError\">".concat(_this33.languageHelper.translate('CONTACT_FORM_CHECKBOX_REQUIRED'), "</div>"));
|
|
2020
2069
|
isOkay = false;
|
|
2021
2070
|
}
|
|
2022
2071
|
});
|
|
@@ -2057,7 +2106,7 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2057
2106
|
}, {
|
|
2058
2107
|
key: "generateForm",
|
|
2059
2108
|
value: function generateForm() {
|
|
2060
|
-
var
|
|
2109
|
+
var _this34 = this;
|
|
2061
2110
|
|
|
2062
2111
|
var extraOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
2063
2112
|
var waitFor = [];
|
|
@@ -2072,21 +2121,21 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2072
2121
|
}
|
|
2073
2122
|
|
|
2074
2123
|
return Promise.all(waitFor).then(function () {
|
|
2075
|
-
var standalone =
|
|
2124
|
+
var standalone = _this34.isStandalone(extraOptions);
|
|
2076
2125
|
|
|
2077
2126
|
var validateText = standalone ? 'novalidate' : '';
|
|
2078
2127
|
var html = "<form class=\"recras-contactform\" ".concat(validateText, ">");
|
|
2079
2128
|
|
|
2080
2129
|
if (extraOptions.voucherQuantitySelector) {
|
|
2081
|
-
html +=
|
|
2130
|
+
html += _this34.quantitySelector(extraOptions.quantityTerm);
|
|
2082
2131
|
}
|
|
2083
2132
|
|
|
2084
|
-
|
|
2085
|
-
html += '<div>' +
|
|
2133
|
+
_this34.contactFormFields.forEach(function (field, idx) {
|
|
2134
|
+
html += '<div>' + _this34.showField(field, idx) + '</div>';
|
|
2086
2135
|
});
|
|
2087
2136
|
|
|
2088
2137
|
if (standalone) {
|
|
2089
|
-
html +=
|
|
2138
|
+
html += _this34.submitButtonHtml();
|
|
2090
2139
|
}
|
|
2091
2140
|
|
|
2092
2141
|
html += '</form>';
|
|
@@ -2121,22 +2170,22 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2121
2170
|
}, {
|
|
2122
2171
|
key: "getContactFormFields",
|
|
2123
2172
|
value: function getContactFormFields() {
|
|
2124
|
-
var
|
|
2173
|
+
var _this35 = this;
|
|
2125
2174
|
|
|
2126
2175
|
return this.fetchJson(this.options.getApiBase() + 'contactformulieren/' + this.options.getFormId() + '?embed=Velden').then(function (form) {
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
return
|
|
2176
|
+
_this35.contactFormFields = form.Velden;
|
|
2177
|
+
_this35.packages = _this35.sortPackages(form.Arrangementen);
|
|
2178
|
+
return _this35.contactFormFields;
|
|
2130
2179
|
});
|
|
2131
2180
|
}
|
|
2132
2181
|
}, {
|
|
2133
2182
|
key: "getCountryList",
|
|
2134
2183
|
value: function getCountryList() {
|
|
2135
|
-
var
|
|
2184
|
+
var _this36 = this;
|
|
2136
2185
|
|
|
2137
2186
|
return this.fetchJson('https://cdn.rawgit.com/umpirsky/country-list/ddabf3a8/data/' + this.languageHelper.locale + '/country.json').then(function (json) {
|
|
2138
|
-
|
|
2139
|
-
return
|
|
2187
|
+
_this36.countries = json;
|
|
2188
|
+
return _this36.countries;
|
|
2140
2189
|
});
|
|
2141
2190
|
}
|
|
2142
2191
|
}, {
|
|
@@ -2303,7 +2352,7 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2303
2352
|
}, {
|
|
2304
2353
|
key: "showField",
|
|
2305
2354
|
value: function showField(field, idx) {
|
|
2306
|
-
var
|
|
2355
|
+
var _this37 = this;
|
|
2307
2356
|
|
|
2308
2357
|
if (field.soort_invoer === 'header') {
|
|
2309
2358
|
return "<h3>".concat(field.naam, "</h3>");
|
|
@@ -2322,7 +2371,7 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2322
2371
|
case 'contactpersoon.geslacht':
|
|
2323
2372
|
html = "<select ".concat(fixedAttributes, " autocomplete=\"sex\">");
|
|
2324
2373
|
Object.keys(this.GENDERS).forEach(function (key) {
|
|
2325
|
-
html += "<option value=\"".concat(key, "\">").concat(
|
|
2374
|
+
html += "<option value=\"".concat(key, "\">").concat(_this37.languageHelper.translate(_this37.GENDERS[key]));
|
|
2326
2375
|
});
|
|
2327
2376
|
html += '</select>';
|
|
2328
2377
|
return label + html;
|
|
@@ -2378,8 +2427,8 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2378
2427
|
case 'contact.landcode':
|
|
2379
2428
|
html = "<select ".concat(fixedAttributes, " autocomplete=\"country\">");
|
|
2380
2429
|
Object.keys(this.countries).forEach(function (code) {
|
|
2381
|
-
var selectedText = code.toUpperCase() ===
|
|
2382
|
-
html += "<option value=\"".concat(code, "\" ").concat(selectedText, ">").concat(
|
|
2430
|
+
var selectedText = code.toUpperCase() === _this37.options.getDefaultCountry() ? 'selected' : '';
|
|
2431
|
+
html += "<option value=\"".concat(code, "\" ").concat(selectedText, ">").concat(_this37.countries[code]);
|
|
2383
2432
|
});
|
|
2384
2433
|
html += '</select>';
|
|
2385
2434
|
return label + html;
|
|
@@ -2459,41 +2508,41 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2459
2508
|
}, {
|
|
2460
2509
|
key: "showForm",
|
|
2461
2510
|
value: function showForm() {
|
|
2462
|
-
var
|
|
2511
|
+
var _this38 = this;
|
|
2463
2512
|
|
|
2464
2513
|
this.loadingIndicatorShow(this.element);
|
|
2465
2514
|
return this.getContactFormFields().then(function () {
|
|
2466
|
-
return
|
|
2515
|
+
return _this38.generateForm({
|
|
2467
2516
|
standalone: true
|
|
2468
2517
|
});
|
|
2469
2518
|
}).then(function (html) {
|
|
2470
|
-
|
|
2519
|
+
_this38.appendHtml(html);
|
|
2471
2520
|
|
|
2472
|
-
_toConsumableArray(
|
|
2521
|
+
_toConsumableArray(_this38.findElements('.checkboxGroupRequired')).forEach(function (group) {
|
|
2473
2522
|
_toConsumableArray(group.querySelectorAll('input')).forEach(function (el) {
|
|
2474
|
-
el.addEventListener('change',
|
|
2523
|
+
el.addEventListener('change', _this38.checkRequiredCheckboxes.bind(_this38));
|
|
2475
2524
|
});
|
|
2476
2525
|
});
|
|
2477
2526
|
|
|
2478
|
-
|
|
2527
|
+
_this38.findElement('.recras-contactform').addEventListener('submit', _this38.submitForm.bind(_this38));
|
|
2479
2528
|
|
|
2480
|
-
if (
|
|
2529
|
+
if (_this38.hasBookingDateField()) {
|
|
2481
2530
|
var pikadayOptions = _extends(RecrasCalendarHelper.defaultOptions(), {
|
|
2482
|
-
field:
|
|
2483
|
-
i18n: RecrasCalendarHelper.i18n(
|
|
2531
|
+
field: _this38.findElement('[data-identifier="boeking.datum"]'),
|
|
2532
|
+
i18n: RecrasCalendarHelper.i18n(_this38.languageHelper),
|
|
2484
2533
|
numberOfMonths: 1
|
|
2485
2534
|
});
|
|
2486
2535
|
|
|
2487
2536
|
new Pikaday(pikadayOptions);
|
|
2488
2537
|
}
|
|
2489
2538
|
|
|
2490
|
-
if (
|
|
2491
|
-
var fields =
|
|
2539
|
+
if (_this38.hasRelationDateField()) {
|
|
2540
|
+
var fields = _this38.getRelationExtraDateFields();
|
|
2492
2541
|
|
|
2493
2542
|
var thisYear = new Date().getFullYear();
|
|
2494
2543
|
|
|
2495
2544
|
var _pikadayOptions = _extends(RecrasCalendarHelper.defaultOptions(), {
|
|
2496
|
-
i18n: RecrasCalendarHelper.i18n(
|
|
2545
|
+
i18n: RecrasCalendarHelper.i18n(_this38.languageHelper),
|
|
2497
2546
|
numberOfMonths: 1,
|
|
2498
2547
|
yearRange: [thisYear - 90, thisYear + 10]
|
|
2499
2548
|
});
|
|
@@ -2502,12 +2551,12 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2502
2551
|
|
|
2503
2552
|
for (var _i18 = 0; _i18 < fields.length; _i18++) {
|
|
2504
2553
|
var field = fields[_i18];
|
|
2505
|
-
_pikadayOptions.field =
|
|
2554
|
+
_pikadayOptions.field = _this38.findElement("[data-identifier=\"".concat(field.field_identifier, "\"]"));
|
|
2506
2555
|
new Pikaday(_pikadayOptions);
|
|
2507
2556
|
}
|
|
2508
2557
|
}
|
|
2509
2558
|
|
|
2510
|
-
|
|
2559
|
+
_this38.loadingIndicatorHide();
|
|
2511
2560
|
});
|
|
2512
2561
|
}
|
|
2513
2562
|
}, {
|
|
@@ -2557,7 +2606,7 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2557
2606
|
}, {
|
|
2558
2607
|
key: "submitForm",
|
|
2559
2608
|
value: function submitForm(e) {
|
|
2560
|
-
var
|
|
2609
|
+
var _this39 = this;
|
|
2561
2610
|
|
|
2562
2611
|
e.preventDefault();
|
|
2563
2612
|
var submitButton = this.findElement('.submitForm');
|
|
@@ -2581,24 +2630,24 @@ var RecrasContactForm = /*#__PURE__*/function () {
|
|
|
2581
2630
|
submitButton.setAttribute('disabled', 'disabled');
|
|
2582
2631
|
this.postJson('contactformulieren/' + this.options.getFormId() + '/opslaan', this.generateJson()).then(function (json) {
|
|
2583
2632
|
if (json.success) {
|
|
2584
|
-
if (
|
|
2585
|
-
window.top.location.href =
|
|
2633
|
+
if (_this39.options.getRedirectUrl()) {
|
|
2634
|
+
window.top.location.href = _this39.options.getRedirectUrl();
|
|
2586
2635
|
} else {
|
|
2587
|
-
|
|
2636
|
+
_this39.element.scrollIntoView({
|
|
2588
2637
|
behavior: 'smooth'
|
|
2589
2638
|
});
|
|
2590
2639
|
|
|
2591
|
-
|
|
2640
|
+
_this39.element.insertAdjacentHTML('afterbegin', "<p class=\"recras-success\">".concat(_this39.languageHelper.translate('CONTACT_FORM_SUBMIT_SUCCESS'), "</p>"));
|
|
2592
2641
|
|
|
2593
2642
|
submitButton.parentNode.reset();
|
|
2594
2643
|
}
|
|
2595
2644
|
} else {
|
|
2596
|
-
|
|
2645
|
+
_this39.error(_this39.languageHelper.translate('CONTACT_FORM_SUBMIT_FAILED'));
|
|
2597
2646
|
}
|
|
2598
2647
|
|
|
2599
2648
|
submitButton.removeAttribute('disabled');
|
|
2600
2649
|
|
|
2601
|
-
|
|
2650
|
+
_this39.loadingIndicatorHide();
|
|
2602
2651
|
});
|
|
2603
2652
|
return false;
|
|
2604
2653
|
}
|
|
@@ -2754,11 +2803,31 @@ var RecrasEventHelper = /*#__PURE__*/function () {
|
|
|
2754
2803
|
value: function eventEnabled(name) {
|
|
2755
2804
|
return this.eventsEnabled.includes(name);
|
|
2756
2805
|
}
|
|
2806
|
+
}, {
|
|
2807
|
+
key: "ga4EventMap",
|
|
2808
|
+
value: function ga4EventMap(action) {
|
|
2809
|
+
var _map;
|
|
2810
|
+
|
|
2811
|
+
var map = (_map = {}, _defineProperty(_map, RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED, 'select_content'), _defineProperty(_map, RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT, 'begin_checkout'), _defineProperty(_map, RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED, 'select_content'), _defineProperty(_map, RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT, 'begin_checkout'), _map);
|
|
2812
|
+
|
|
2813
|
+
if (map[action] === undefined) {
|
|
2814
|
+
return false;
|
|
2815
|
+
}
|
|
2816
|
+
|
|
2817
|
+
return map[action];
|
|
2818
|
+
}
|
|
2819
|
+
}, {
|
|
2820
|
+
key: "isGA4",
|
|
2821
|
+
value: function isGA4() {
|
|
2822
|
+
var fn = window[window.GoogleAnalyticsObject || 'ga'];
|
|
2823
|
+
return fn && fn.h && fn.h.gtm4;
|
|
2824
|
+
}
|
|
2757
2825
|
}, {
|
|
2758
2826
|
key: "sendEvent",
|
|
2759
2827
|
value: function sendEvent(cat, action) {
|
|
2760
2828
|
var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
2761
2829
|
var value = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined;
|
|
2830
|
+
var ga4Value = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;
|
|
2762
2831
|
var event;
|
|
2763
2832
|
|
|
2764
2833
|
try {
|
|
@@ -2770,8 +2839,11 @@ var RecrasEventHelper = /*#__PURE__*/function () {
|
|
|
2770
2839
|
}
|
|
2771
2840
|
|
|
2772
2841
|
if (this.analyticsEnabled && this.eventEnabled(action)) {
|
|
2773
|
-
if (
|
|
2774
|
-
//
|
|
2842
|
+
if (this.isGA4() && this.ga4EventMap(action) && ga4Value) {
|
|
2843
|
+
// v4
|
|
2844
|
+
this.sendGA4Event(this.ga4EventMap(action), ga4Value);
|
|
2845
|
+
} else if (typeof window.gtag === 'function') {
|
|
2846
|
+
// Global Site Tag (v3)
|
|
2775
2847
|
var eventData = {
|
|
2776
2848
|
event_category: RecrasEventHelper.PREFIX_GLOBAL + ':' + cat
|
|
2777
2849
|
};
|
|
@@ -2786,7 +2858,7 @@ var RecrasEventHelper = /*#__PURE__*/function () {
|
|
|
2786
2858
|
|
|
2787
2859
|
window.gtag('event', action, eventData);
|
|
2788
2860
|
} else if (typeof window.ga === 'function') {
|
|
2789
|
-
// "Old" Google Analytics
|
|
2861
|
+
// "Old" Google Analytics (v2) and Tag Manager
|
|
2790
2862
|
var _eventData = {
|
|
2791
2863
|
hitType: 'event',
|
|
2792
2864
|
eventCategory: RecrasEventHelper.PREFIX_GLOBAL + ':' + cat,
|
|
@@ -2816,6 +2888,12 @@ var RecrasEventHelper = /*#__PURE__*/function () {
|
|
|
2816
2888
|
|
|
2817
2889
|
return document.dispatchEvent(event);
|
|
2818
2890
|
}
|
|
2891
|
+
}, {
|
|
2892
|
+
key: "sendGA4Event",
|
|
2893
|
+
value: function sendGA4Event(action, data) {
|
|
2894
|
+
var fn = window[window.GoogleAnalyticsObject || 'ga'];
|
|
2895
|
+
fn('event', action, data);
|
|
2896
|
+
}
|
|
2819
2897
|
}, {
|
|
2820
2898
|
key: "setAnalytics",
|
|
2821
2899
|
value: function setAnalytics(bool) {
|
|
@@ -3348,16 +3426,16 @@ var RecrasLanguageHelper = /*#__PURE__*/function () {
|
|
|
3348
3426
|
}, {
|
|
3349
3427
|
key: "setCurrency",
|
|
3350
3428
|
value: function setCurrency() {
|
|
3351
|
-
var
|
|
3429
|
+
var _this40 = this;
|
|
3352
3430
|
|
|
3353
3431
|
var errorHandler = function errorHandler(err) {
|
|
3354
|
-
|
|
3432
|
+
_this40.currency = 'eur';
|
|
3355
3433
|
|
|
3356
|
-
|
|
3434
|
+
_this40.error(err);
|
|
3357
3435
|
};
|
|
3358
3436
|
|
|
3359
3437
|
return RecrasHttpHelper.fetchJson(this.options.getApiBase() + 'instellingen/currency', errorHandler).then(function (setting) {
|
|
3360
|
-
|
|
3438
|
+
_this40.currency = setting.waarde;
|
|
3361
3439
|
});
|
|
3362
3440
|
}
|
|
3363
3441
|
}, {
|
|
@@ -3581,7 +3659,7 @@ _defineProperty(RecrasOptions, "hostnamesDebug", ['nginx:8886', // Local develop
|
|
|
3581
3659
|
|
|
3582
3660
|
var RecrasVoucher = /*#__PURE__*/function () {
|
|
3583
3661
|
function RecrasVoucher() {
|
|
3584
|
-
var
|
|
3662
|
+
var _this41 = this;
|
|
3585
3663
|
|
|
3586
3664
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
3587
3665
|
|
|
@@ -3600,11 +3678,11 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3600
3678
|
this.element.classList.add('recras-buy-voucher');
|
|
3601
3679
|
|
|
3602
3680
|
this.fetchJson = function (url) {
|
|
3603
|
-
return RecrasHttpHelper.fetchJson(url,
|
|
3681
|
+
return RecrasHttpHelper.fetchJson(url, _this41.error);
|
|
3604
3682
|
};
|
|
3605
3683
|
|
|
3606
3684
|
this.postJson = function (url, data) {
|
|
3607
|
-
return RecrasHttpHelper.postJson(
|
|
3685
|
+
return RecrasHttpHelper.postJson(_this41.options.getApiBase() + url, data, _this41.error);
|
|
3608
3686
|
};
|
|
3609
3687
|
|
|
3610
3688
|
RecrasCSSHelper.loadCSS('global');
|
|
@@ -3620,12 +3698,12 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3620
3698
|
}
|
|
3621
3699
|
|
|
3622
3700
|
this.languageHelper.setOptions(options).then(function () {
|
|
3623
|
-
return
|
|
3701
|
+
return _this41.getVoucherTemplates();
|
|
3624
3702
|
}).then(function (templates) {
|
|
3625
|
-
if (
|
|
3626
|
-
|
|
3703
|
+
if (_this41.options.getVoucherTemplateId()) {
|
|
3704
|
+
_this41.changeTemplate(_this41.options.getVoucherTemplateId());
|
|
3627
3705
|
} else {
|
|
3628
|
-
|
|
3706
|
+
_this41.showTemplates(templates);
|
|
3629
3707
|
}
|
|
3630
3708
|
});
|
|
3631
3709
|
}
|
|
@@ -3635,10 +3713,19 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3635
3713
|
value: function appendHtml(msg) {
|
|
3636
3714
|
this.element.insertAdjacentHTML('beforeend', msg);
|
|
3637
3715
|
}
|
|
3716
|
+
}, {
|
|
3717
|
+
key: "formatGA4Item",
|
|
3718
|
+
value: function formatGA4Item() {
|
|
3719
|
+
return [{
|
|
3720
|
+
item_name: this.selectedTemplate.name,
|
|
3721
|
+
price: this.selectedTemplate.price,
|
|
3722
|
+
quantity: parseInt(this.findElement('#number-of-vouchers').value)
|
|
3723
|
+
}];
|
|
3724
|
+
}
|
|
3638
3725
|
}, {
|
|
3639
3726
|
key: "buyTemplate",
|
|
3640
3727
|
value: function buyTemplate() {
|
|
3641
|
-
var
|
|
3728
|
+
var _this42 = this;
|
|
3642
3729
|
|
|
3643
3730
|
var status = this.contactForm.checkRequiredCheckboxes();
|
|
3644
3731
|
|
|
@@ -3660,14 +3747,18 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3660
3747
|
|
|
3661
3748
|
this.postJson('vouchers/buy', payload).then(function (json) {
|
|
3662
3749
|
if (json.payment_url) {
|
|
3663
|
-
|
|
3750
|
+
_this42.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER, RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT, null, Math.round(_this42.totalPrice()), {
|
|
3751
|
+
currency: _this42.languageHelper.currency,
|
|
3752
|
+
value: _this42.totalPrice(),
|
|
3753
|
+
items: _this42.formatGA4Item()
|
|
3754
|
+
});
|
|
3664
3755
|
|
|
3665
3756
|
window.top.location.href = json.payment_url;
|
|
3666
3757
|
} else {
|
|
3667
3758
|
console.log(json);
|
|
3668
3759
|
}
|
|
3669
3760
|
|
|
3670
|
-
|
|
3761
|
+
_this42.findElement('.buyTemplate').removeAttribute('disabled');
|
|
3671
3762
|
});
|
|
3672
3763
|
}
|
|
3673
3764
|
}, {
|
|
@@ -3678,7 +3769,10 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3678
3769
|
})[0];
|
|
3679
3770
|
this.clearAllExceptTemplateSelection();
|
|
3680
3771
|
this.showContactForm(this.selectedTemplate);
|
|
3681
|
-
this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER, RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED, null, templateID
|
|
3772
|
+
this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER, RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED, null, templateID, {
|
|
3773
|
+
content_type: 'voucher',
|
|
3774
|
+
item_id: templateID
|
|
3775
|
+
});
|
|
3682
3776
|
}
|
|
3683
3777
|
}, {
|
|
3684
3778
|
key: "clearAll",
|
|
@@ -3724,25 +3818,25 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3724
3818
|
}, {
|
|
3725
3819
|
key: "getContactForm",
|
|
3726
3820
|
value: function getContactForm(template) {
|
|
3727
|
-
var
|
|
3821
|
+
var _this43 = this;
|
|
3728
3822
|
|
|
3729
3823
|
this.options.setOption('form_id', template.contactform_id);
|
|
3730
3824
|
var contactForm = new RecrasContactForm(this.options);
|
|
3731
3825
|
return contactForm.getContactFormFields().then(function () {
|
|
3732
|
-
|
|
3826
|
+
_this43.contactForm = contactForm;
|
|
3733
3827
|
return contactForm;
|
|
3734
3828
|
});
|
|
3735
3829
|
}
|
|
3736
3830
|
}, {
|
|
3737
3831
|
key: "getVoucherTemplates",
|
|
3738
3832
|
value: function getVoucherTemplates() {
|
|
3739
|
-
var
|
|
3833
|
+
var _this44 = this;
|
|
3740
3834
|
|
|
3741
3835
|
return this.fetchJson(this.options.getApiBase() + 'voucher_templates').then(function (templates) {
|
|
3742
3836
|
templates = templates.filter(function (template) {
|
|
3743
3837
|
return !!template.contactform_id;
|
|
3744
3838
|
});
|
|
3745
|
-
|
|
3839
|
+
_this44.templates = templates;
|
|
3746
3840
|
return templates;
|
|
3747
3841
|
});
|
|
3748
3842
|
}
|
|
@@ -3788,30 +3882,30 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3788
3882
|
}, {
|
|
3789
3883
|
key: "showContactForm",
|
|
3790
3884
|
value: function showContactForm(template) {
|
|
3791
|
-
var
|
|
3885
|
+
var _this45 = this;
|
|
3792
3886
|
|
|
3793
3887
|
return this.getContactForm(template).then(function (form) {
|
|
3794
3888
|
return form.generateForm({
|
|
3795
3889
|
voucherQuantitySelector: true,
|
|
3796
|
-
quantityTerm:
|
|
3890
|
+
quantityTerm: _this45.selectedTemplate.quantity_term
|
|
3797
3891
|
});
|
|
3798
3892
|
}).then(function (html) {
|
|
3799
|
-
|
|
3893
|
+
_this45.appendHtml(html);
|
|
3800
3894
|
|
|
3801
|
-
|
|
3895
|
+
_this45.showBuyButton();
|
|
3802
3896
|
|
|
3803
|
-
_toConsumableArray(
|
|
3804
|
-
el.addEventListener('change',
|
|
3897
|
+
_toConsumableArray(_this45.findElements('#number-of-vouchers, [name^="contactformulier"]')).forEach(function (el) {
|
|
3898
|
+
el.addEventListener('change', _this45.maybeDisableBuyButton.bind(_this45));
|
|
3805
3899
|
});
|
|
3806
3900
|
});
|
|
3807
3901
|
}
|
|
3808
3902
|
}, {
|
|
3809
3903
|
key: "showTemplates",
|
|
3810
3904
|
value: function showTemplates(templates) {
|
|
3811
|
-
var
|
|
3905
|
+
var _this46 = this;
|
|
3812
3906
|
|
|
3813
3907
|
var templateOptions = templates.map(function (template) {
|
|
3814
|
-
return "<option value=\"".concat(template.id, "\">").concat(template.name, " (").concat(
|
|
3908
|
+
return "<option value=\"".concat(template.id, "\">").concat(template.name, " (").concat(_this46.formatPrice(template.price), ")");
|
|
3815
3909
|
});
|
|
3816
3910
|
var html = "<select class=\"recrasVoucherTemplates\"><option>".concat(templateOptions.join(''), "</select>");
|
|
3817
3911
|
this.appendHtml("<div class=\"recras-voucher-templates\">".concat(html, "</div>"));
|
|
@@ -3819,7 +3913,7 @@ var RecrasVoucher = /*#__PURE__*/function () {
|
|
|
3819
3913
|
voucherSelectEl.addEventListener('change', function () {
|
|
3820
3914
|
var selectedTemplateId = parseInt(voucherSelectEl.value, 10);
|
|
3821
3915
|
|
|
3822
|
-
|
|
3916
|
+
_this46.changeTemplate(selectedTemplateId);
|
|
3823
3917
|
});
|
|
3824
3918
|
}
|
|
3825
3919
|
}, {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function _objectValues(obj){var values=[];var keys=Object.keys(obj);for(var k=0;k<keys.length;k++)values.push(obj[keys[k]]);return values}function _objectEntries(obj){var entries=[];var keys=Object.keys(obj);for(var k=0;k<keys.length;k++)entries.push([keys[k],obj[keys[k]]]);return entries}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key]}}}return target};return _extends.apply(this,arguments)}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}function _iterableToArray(iter){if(typeof Symbol!=="undefined"&&iter[Symbol.iterator]!=null||iter["@@iterator"]!=null)return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++){arr2[i]=arr[i]}return arr2}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _createClass(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);Object.defineProperty(Constructor,"prototype",{writable:false});return Constructor}var RecrasBooking=function(){function RecrasBooking(){var _this=this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,RecrasBooking);this.datePicker=null;this.PAYMENT_DIRECT="mollie";this.PAYMENT_AFTERWARDS="factuur";this.RECRAS_INFINITY=99999;this.languageHelper=new RecrasLanguageHelper;if(!(options instanceof RecrasOptions)){throw new Error(this.languageHelper.translate("ERR_OPTIONS_INVALID"))}this.options=options;this.eventHelper=new RecrasEventHelper;this.eventHelper.setAnalytics(this.options.getAnalytics());this.eventHelper.setEvents(this.options.getAnalyticsEvents());var optionsPromise=this.languageHelper.setOptions(options);this.element=this.options.getElement();this.element.classList.add("recras-onlinebooking");this.fetchJson=function(url){return RecrasHttpHelper.fetchJson(url,_this.error)};this.postJson=function(url,data){return RecrasHttpHelper.postJson(_this.options.getApiBase()+url,data,_this.error.bind(_this))};if(this.options.getLocale()){if(!RecrasLanguageHelper.isValid(this.options.getLocale())){console.warn(this.languageHelper.translate("ERR_INVALID_LOCALE",{LOCALES:RecrasLanguageHelper.validLocales.join(", ")}))}else{this.languageHelper.setLocale(this.options.getLocale())}}if(this.options.getPreFilledAmounts()){if(!this.options.isSinglePackage()){console.warn(this.languageHelper.translate("ERR_AMOUNTS_NO_PACKAGE"))}}if(this.options.getPreFilledDate()){this.prefillDateIfPossible()}if(this.options.getPreFilledTime()){this.prefillTimeIfPossible()}RecrasCSSHelper.loadCSS("global");RecrasCSSHelper.loadCSS("booking");RecrasCSSHelper.loadCSS("pikaday");this.clearAll();this.loadingIndicatorShow(this.element);this.promise=optionsPromise.then(function(){return RecrasCalendarHelper.loadScript()}).then(function(){return _this.getTexts()}).then(function(texts){_this.texts=texts;return _this.getPackages()}).then(function(packages){_this.loadingIndicatorHide();var pck=_this.options.getPackageId();if(_this.options.isSinglePackage()){if(Array.isArray(pck)){pck=pck[0]}return _this.changePackage(pck)}else if(Array.isArray(pck)&&pck.length>1){packages=packages.filter(function(p){return pck.includes(p.id)})}return _this.showPackages(packages)})}_createClass(RecrasBooking,[{key:"prefillDateIfPossible",value:function prefillDateIfPossible(){var date=new Date(this.options.getPreFilledDate());if(isNaN(date.getTime())){console.warn(this.languageHelper.translate("ERR_INVALID_DATE"));return false}if(date<new Date){console.warn(this.languageHelper.translate("ERR_DATE_PAST"));return false}if(!this.options.isSinglePackage()){console.warn(this.languageHelper.translate("ERR_DATE_NO_SINGLE_PACKAGE"));return false}this.prefilledDate=date;return true}},{key:"prefillTimeIfPossible",value:function prefillTimeIfPossible(){var time=this.options.getPreFilledTime();if(!time.match(/^(2[0-3]|[01]?[0-9]):([0-5]?[0-9])$/)){console.warn(this.languageHelper.translate("ERR_INVALID_TIME"));return false}this.prefilledTime=time;return true}},{key:"hasAtLeastOneProduct",value:function hasAtLeastOneProduct(pack){if(this.shouldShowBookingSize(pack)&&this.bookingSize()>0){return true}var hasAtLeastOneProduct=false;for(var _i2=0,_this$getLinesNoBooki2=this.getLinesNoBookingSize(pack);_i2<_this$getLinesNoBooki2.length;_i2++){var line=_this$getLinesNoBooki2[_i2];var lineEl=this.findElement('[data-package-id="'.concat(line.id,'"]'));if(lineEl&&lineEl.value>0){hasAtLeastOneProduct=true}}return hasAtLeastOneProduct}},{key:"amountsValid",value:function amountsValid(pack){for(var _i4=0,_this$getLinesNoBooki4=this.getLinesNoBookingSize(pack);_i4<_this$getLinesNoBooki4.length;_i4++){var line=_this$getLinesNoBooki4[_i4];var lineEl=this.findElement('[data-package-id="'.concat(line.id,'"]'));if(!lineEl){console.warn("Element for line ".concat(line.id," not found"));return false}var aantal=lineEl.value;if(aantal>0&&aantal<line.aantal_personen){return false}if(aantal>0&&line.min&&aantal<line.min){return false}if(line.max&&aantal>line.max){return false}}if(this.shouldShowBookingSize(pack)&&this.bookingSize()>0){if(this.bookingSize()<this.bookingSizeMinimum(pack)||this.bookingSize()>this.bookingSizeMaximum(pack)){return false}}return this.hasAtLeastOneProduct(pack)}},{key:"appendHtml",value:function appendHtml(msg){this.element.insertAdjacentHTML("beforeend",msg)}},{key:"applyVoucher",value:function applyVoucher(packageID,voucherCode){var _this2=this;if(!voucherCode){this.setDiscountStatus(this.languageHelper.translate("VOUCHER_EMPTY"));return Promise.resolve(false)}if(this.appliedVouchers[voucherCode]){this.setDiscountStatus(this.languageHelper.translate("VOUCHER_ALREADY_APPLIED"));return Promise.resolve(false)}if(!this.selectedDate){this.setDiscountStatus(this.languageHelper.translate("DATE_INVALID"));return Promise.resolve(false)}return this.postJson("onlineboeking/controleervoucher",{arrangement_id:packageID,datum:RecrasDateHelper.datePartOnly(this.selectedDate),producten:this.productCounts(),vouchers:[voucherCode]}).then(function(json){var result=json[voucherCode];if(!result.valid){return Promise.resolve(false)}_this2.appliedVouchers[voucherCode]=result.processed;_this2.showTotalPrice();return true})}},{key:"recheckDiscountCode",value:function recheckDiscountCode(){var _this3=this;this.checkDiscountcode(this.selectedPackage.id,RecrasDateHelper.datePartOnly(this.selectedDate),this.discount.code).then(function(status){if(status){_this3.setDiscountStatus(_this3.languageHelper.translate("DISCOUNT_APPLIED"),false)}else{_this3.discount=null;_this3.showTotalPrice();var statusEl=_this3.findElement(".discount-status");if(statusEl){statusEl.parentNode.removeChild(statusEl)}}})}},{key:"recheckVouchers",value:function recheckVouchers(){var voucherCodes=Object.keys(this.appliedVouchers);this.appliedVouchers=[];var promises=[];for(var _i6=0;_i6<voucherCodes.length;_i6++){var voucherCode=voucherCodes[_i6];promises.push(this.applyVoucher(this.selectedPackage.id,voucherCode))}return Promise.all(promises)}},{key:"bookingSize",value:function bookingSize(){var bookingSizeEl=this.findElement(".bookingsize");if(!bookingSizeEl){return 0}var bookingSizeValue=parseInt(bookingSizeEl.value,10);if(isNaN(bookingSizeValue)){return 0}return bookingSizeValue}},{key:"bookingSizeLines",value:function bookingSizeLines(pack){return pack.regels.filter(function(line){return line.onlineboeking_aantalbepalingsmethode==="boekingsgrootte"})}},{key:"bookingSizeMaximum",value:function bookingSizeMaximum(pack){var lines=this.bookingSizeLines(pack).filter(function(line){return line.max});if(lines.length===0){return this.RECRAS_INFINITY}var maxes=lines.map(function(line){return line.max});return Math.min.apply(Math,_toConsumableArray(maxes))}},{key:"bookingSizeLineMinimum",value:function bookingSizeLineMinimum(line){if(line.min){return line.min}if(line.onlineboeking_aantalbepalingsmethode==="vast"){return 0}return line.product.minimum_aantal}},{key:"bookingSizeMinimum",value:function bookingSizeMinimum(pack){var _this4=this;var minSize=0;this.bookingSizeLines(pack).forEach(function(line){minSize=Math.max(minSize,_this4.bookingSizeLineMinimum(line))});return minSize}},{key:"amountFromPersons",value:function amountFromPersons(product,persons){return persons;if(product.aantalbepaling==="vast"){return product.aantal}var fn=product.per_x_personen_afronding==="beneden"?Math.floor:Math.ceil;return product.aantal*fn(persons/product.per_x_personen)}},{key:"bookingSizePrice",value:function bookingSizePrice(pack){var _this5=this;var nrOfPersons=Math.max(pack.aantal_personen,1);var price=0;var lines=this.bookingSizeLines(pack);lines.forEach(function(line){price+=Math.max(_this5.amountFromPersons(line.product,nrOfPersons),line.product.minimum_aantal)*parseFloat(line.product.verkoop)});return price/nrOfPersons}},{key:"filterPackagesFromoptions",value:function filterPackagesFromoptions(packages){var pck=this.options.getPackageId();if(!Array.isArray(pck)){return packages}return packages.filter(function(p){return pck.includes(p.id)})}},{key:"changePackage",value:function changePackage(packageID){var _this6=this;var selectedPackage=this.packages.filter(function(p){return p.id===packageID});this.appliedVouchers={};this.discount=null;if(selectedPackage.length===0){this.selectedPackage=null;this.clearAll();var packages=this.filterPackagesFromoptions(this.packages);this.showPackages(packages);this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_RESET);return Promise.resolve(false)}else{this.clearAllExceptPackageSelection();this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED,selectedPackage[0].arrangement,selectedPackage[0].id,{content_type:"package",item_id:selectedPackage[0].id})}this.selectedPackage=selectedPackage[0];return this.showProducts(this.selectedPackage).then(function(){_this6.nextSectionActive(".recras-package-select",".recras-amountsform");_this6.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_PRODUCTS_SHOWN);if(_this6.options.getAutoScroll()===true){var scrollOptions={behavior:"smooth"};if(!("scrollBehavior"in document.documentElement.style)){scrollOptions=true}_this6.findElement(".recras-amountsform").scrollIntoView(scrollOptions)}_this6.checkDependencies();_this6.loadingIndicatorShow(_this6.findElement(".recras-amountsform"));return _this6.showDateTimeSelection(_this6.selectedPackage)}).then(function(){_this6.loadingIndicatorHide();_this6.showContactForm(_this6.selectedPackage)})}},{key:"checkBookingSize",value:function checkBookingSize(pack){if(!this.shouldShowBookingSize(pack)){return}var bookingSize=this.bookingSize();var bsMaximum=this.bookingSizeMaximum(pack);var bsMinimum=this.bookingSizeMinimum(pack);if(bookingSize<bsMinimum){this.setMinMaxAmountWarning("bookingsize",bsMinimum,"minimum")}else if(bookingSize>bsMaximum){this.setMinMaxAmountWarning("bookingsize",bsMaximum,"maximum")}this.maybeDisableBookButton()}},{key:"checkDependencies",value:function checkDependencies(){var _this7=this;_toConsumableArray(this.findElements(".recras-product-dependency")).forEach(function(el){el.parentNode.removeChild(el)});_toConsumableArray(this.findElements("[data-package-id]")).forEach(function(el){el.classList.remove("recras-input-invalid")});this.requiresProduct=false;this.productCounts().forEach(function(line){if(line.aantal>0){var packageLineID=line.arrangementsregel_id;var product=_this7.findProduct(packageLineID).product;var thisProductRequiresProduct=false;if(!product.vereist_product){console.warn("You are logged in to this particular Recras. Because of API differences between logged-in and logged-out state, required products do not work as expected.")}else{product.vereist_product.forEach(function(vp){if(!_this7.dependencySatisfied(line.aantal,vp)){thisProductRequiresProduct=true;_this7.requiresProduct=true;var requiredAmount=_this7.requiredAmount(line.aantal,vp);var requiredProductName=_this7.getProductByID(vp.vereist_product_id).weergavenaam;var message=_this7.languageHelper.translate("PRODUCT_REQUIRED",{NUM:line.aantal,PRODUCT:product.weergavenaam,REQUIRED_AMOUNT:requiredAmount,REQUIRED_PRODUCT:requiredProductName});_this7.findElement(".recras-amountsform").insertAdjacentHTML("beforeend",'<span class="recras-product-dependency">'.concat(message,"</span>"))}})}if(thisProductRequiresProduct){var productInput=_this7.findElement('[data-package-id="'.concat(packageLineID,'"]'));productInput.classList.add("recras-input-invalid")}}});this.maybeDisableBookButton()}},{key:"checkDiscountAndVoucher",value:function checkDiscountAndVoucher(){var _this8=this;var discountPromise=this.checkDiscountcode(this.selectedPackage.id,RecrasDateHelper.datePartOnly(this.selectedDate),this.findElement("#discountcode").value.trim());var voucherPromise=this.applyVoucher(this.selectedPackage.id,this.findElement("#discountcode").value.trim());Promise.all([discountPromise,voucherPromise]).then(function(_ref){var _ref2=_slicedToArray(_ref,2),discountStatus=_ref2[0],voucherStatus=_ref2[1];if(discountStatus||voucherStatus){var status;if(discountStatus){status="DISCOUNT_APPLIED"}else{status="VOUCHER_APPLIED"}_this8.setDiscountStatus(_this8.languageHelper.translate(status),false);_this8.findElement("#discountcode").value="";_this8.nextSectionActive(".recras-discounts",".recras-contactform")}else{_this8.setDiscountStatus(_this8.languageHelper.translate("DISCOUNT_INVALID"))}})}},{key:"checkDiscountcode",value:function checkDiscountcode(packageID,date,code){var _this9=this;return this.fetchJson(this.options.getApiBase()+"onlineboeking/controleerkortingscode"+"?datum="+date+"&arrangement="+packageID+"&kortingscode="+encodeURIComponent(code)).then(function(discount){if(discount===false){return false}discount.code=code;_this9.discount=discount;_this9.showTotalPrice();return true})}},{key:"checkMaximumForPackage",value:function checkMaximumForPackage(){var _this10=this;var maxPerLine=this.selectedPackage.maximum_aantal_personen_online;if(maxPerLine===null){return Promise.resolve(null)}var showWarning=false;var selectedProducts=this.productCounts();return this.languageHelper.filterTags(this.texts.maximum_aantal_online_boeking_overschreden,this.selectedPackage?this.selectedPackage.id:null).then(function(msg){selectedProducts.forEach(function(p){if(p.aantal>maxPerLine&&!showWarning){var input=_this10.findElement('[data-package-id="'.concat(p.arrangementsregel_id,'"]'));if(!input){input=_this10.findElement("#bookingsize")}if(input){var warningEl=document.createElement("div");warningEl.classList.add("maximum-amount");warningEl.classList.add("recras-full-width");warningEl.innerHTML=msg;input.parentNode.parentNode.insertBefore(warningEl,input.parentNode.nextSibling);input.classList.add("recras-input-invalid")}else{_this10.findElement(".recras-amountsform").insertAdjacentHTML("beforeend",'<span class="maximum-amount">'.concat(msg,"</span>"))}showWarning=true}})})}},{key:"contactFormValid",value:function contactFormValid(){var contactFormIsValid=this.findElement(".recras-contactform").checkValidity();var contactFormRequiredCheckboxes=this.contactForm.checkRequiredCheckboxes();return contactFormIsValid&&contactFormRequiredCheckboxes}},{key:"setMinMaxAmountWarning",value:function setMinMaxAmountWarning(lineID,minAmount){var type=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"minimum";var warnEl=document.createElement("span");warnEl.classList.add(type+"-amount");var lineEl=this.findElement("#".concat(lineID));if(!lineEl){console.warn("Element for line ".concat(lineID," not found"));return false}lineEl.classList.add("recras-input-invalid");var text;if(type==="minimum"){text=this.languageHelper.translate("PRODUCT_MINIMUM",{MINIMUM:minAmount})}else{text=this.languageHelper.translate("PRODUCT_MAXIMUM",{MAXIMUM:minAmount})}warnEl.innerHTML=text;var label=this.findElement('label[for="'.concat(lineID,'"]'));label.parentNode.appendChild(warnEl)}},{key:"checkMinMaxAmounts",value:function checkMinMaxAmounts(){for(var _i8=0,_this$productCounts2=this.productCounts();_i8<_this$productCounts2.length;_i8++){var product=_this$productCounts2[_i8];if(product.aantal<1){continue}var packageLineID=product.arrangementsregel_id;var packageLine=this.findProduct(packageLineID);var input=this.findElement('[data-package-id="'.concat(packageLineID,'"]'));if(!input){continue}if(product.aantal<packageLine.product.minimum_aantal){this.setMinMaxAmountWarning(input.id,packageLine.product.minimum_aantal,"minimum")}else if(product.aantal<packageLine.aantal_personen){this.setMinMaxAmountWarning(input.id,packageLine.aantal_personen,"minimum")}else if(packageLine.min!==undefined&&product.aantal<packageLine.min){this.setMinMaxAmountWarning(input.id,packageLine.min,"minimum")}else if(packageLine.max!==null&&product.aantal>packageLine.max){this.setMinMaxAmountWarning(input.id,packageLine.max,"maximum")}}}},{key:"clearAll",value:function clearAll(){this.clearElements(this.element.children)}},{key:"clearAllExceptPackageSelection",value:function clearAllExceptPackageSelection(){var packageSelect=this.findElement(".recras-package-select");if(packageSelect){packageSelect.classList.remove("recras-completed");packageSelect.classList.add("recras-active")}var elements=document.querySelectorAll("#"+this.element.id+" > *:not(.recras-package-select)");this.clearElements(elements)}},{key:"clearElements",value:function clearElements(elements){if(this.datePicker){this.datePicker.destroy()}this.availableDays=[];_toConsumableArray(elements).forEach(function(el){el.parentNode.removeChild(el)});this.maybeAddLatestErrorElement()}},{key:"dependencySatisfied",value:function dependencySatisfied(hasNow,requiredProduct){for(var _i10=0,_this$productCounts4=this.productCounts();_i10<_this$productCounts4.length;_i10++){var line=_this$productCounts4[_i10];if(line.aantal===0){continue}var product=this.findProduct(line.arrangementsregel_id).product;if(product.id!==parseInt(requiredProduct.vereist_product_id,10)){continue}var requiredAmount=this.requiredAmount(hasNow,requiredProduct);return line.aantal>=requiredAmount}return false}},{key:"error",value:function error(msg){this.loadingIndicatorHide();var bookingErrorsEl=this.findElement("#bookingErrors");if(bookingErrorsEl){bookingErrorsEl.parentNode.appendChild(this.findElement(".latestError"))}this.maybeAddLatestErrorElement();this.findElement(".latestError").innerHTML="<strong>".concat(this.languageHelper.translate("ERR_GENERAL"),"</strong><p>").concat(msg,"</p>")}},{key:"findElement",value:function findElement(querystring){return this.element.querySelector(querystring)}},{key:"findElements",value:function findElements(querystring){return this.element.querySelectorAll(querystring)}},{key:"findProduct",value:function findProduct(packageLineID){return this.selectedPackage.regels.filter(function(line){return line.id===packageLineID})[0]}},{key:"formatPrice",value:function formatPrice(price){return this.languageHelper.formatPrice(price)}},{key:"getAvailableDays",value:function getAvailableDays(packageID,begin,end){var _this11=this;var postData={arrangement_id:packageID,begin:RecrasDateHelper.datePartOnly(begin),eind:RecrasDateHelper.datePartOnly(end),producten:this.productCountsNoBookingSize()};if(this.shouldShowBookingSize(this.selectedPackage)){postData.boekingsgrootte=this.bookingSize()}return this.postJson("onlineboeking/beschikbaredagen",postData).then(function(json){_this11.availableDays=_this11.availableDays.concat(json);return _this11.availableDays})}},{key:"getAvailableTimes",value:function getAvailableTimes(packageID,date){var _this12=this;return this.postJson("onlineboeking/beschikbaretijden",{arrangement_id:packageID,datum:RecrasDateHelper.datePartOnly(date),producten:this.productCounts()}).then(function(json){_this12.availableTimes=json;return _this12.availableTimes})}},{key:"getContactForm",value:function getContactForm(pack){var _this13=this;this.options.setOption("form_id",pack.onlineboeking_contactformulier_id);var contactForm=new RecrasContactForm(this.options);return contactForm.getContactFormFields().then(function(){_this13.contactForm=contactForm;return contactForm})}},{key:"getDiscountPrice",value:function getDiscountPrice(discount){if(!discount){return 0}return discount.percentage/100*this.getSubTotal()*-1}},{key:"getLinesBookingSize",value:function getLinesBookingSize(pack){return pack.regels.filter(function(line){return line.onlineboeking_aantalbepalingsmethode==="boekingsgrootte"})}},{key:"getLinesNoBookingSize",value:function getLinesNoBookingSize(pack){return pack.regels.filter(function(line){return line.onlineboeking_aantalbepalingsmethode!=="boekingsgrootte"})}},{key:"getPackages",value:function getPackages(){var _this14=this;return this.fetchJson(this.options.getApiBase()+"arrangementen").then(function(json){_this14.packages=json;return _this14.packages})}},{key:"getProductByID",value:function getProductByID(id){var products=this.selectedPackage.regels.map(function(r){return r.product});return products.filter(function(p){return p.id===id})[0]}},{key:"getSubTotal",value:function getSubTotal(){var _this15=this;var total=0;this.productCounts().forEach(function(line){var product=_this15.findProduct(line.arrangementsregel_id).product;var aantal=line.aantal;if(isNaN(aantal)){aantal=0}total+=aantal*parseFloat(product.verkoop)});return total}},{key:"getSetting",value:function getSetting(settingName){return this.fetchJson(this.options.getApiBase()+"instellingen/"+settingName)}},{key:"getTexts",value:function getTexts(){var settings=["maximum_aantal_online_boeking_overschreden","online_boeking_betaalkeuze","online_boeking_betaalkeuze_achteraf_titel","online_boeking_betaalkeuze_ideal_titel","online_boeking_step0_text_pre","online_boeking_step0_text_post","online_boeking_step1_text_pre","online_boeking_step1_text_post","online_boeking_step3_text_post"];var promises=[];for(var _i12=0;_i12<settings.length;_i12++){var setting=settings[_i12];promises.push(this.getSetting(setting))}return Promise.all(promises).then(function(settings){var texts={};settings.forEach(function(setting){texts[setting.slug]=setting.waarde});return texts})}},{key:"getTotalPrice",value:function getTotalPrice(){var total=this.getSubTotal();total+=this.getDiscountPrice(this.discount);total+=this.getVouchersPrice();return total}},{key:"getVouchersPrice",value:function getVouchersPrice(){var voucherPrice=0;_objectValues(this.appliedVouchers).forEach(function(voucher){_objectValues(voucher).forEach(function(line){voucherPrice-=line.aantal*line.prijs_per_stuk})});return voucherPrice}},{key:"loadingIndicatorHide",value:function loadingIndicatorHide(){_toConsumableArray(document.querySelectorAll(".recrasLoadingIndicator")).forEach(function(el){el.parentNode.removeChild(el)})}},{key:"loadingIndicatorShow",value:function loadingIndicatorShow(afterEl){if(!afterEl){return}afterEl.insertAdjacentHTML("beforeend",'<span class="recrasLoadingIndicator">'.concat(this.languageHelper.translate("LOADING"),"</span>"))}},{key:"maybeAddLatestErrorElement",value:function maybeAddLatestErrorElement(){var errorEl=this.findElement(".latestError");if(!errorEl){this.appendHtml('<div class="latestError"></div>')}}},{key:"maybeDisableBookButton",value:function maybeDisableBookButton(){var _this16=this;var button=this.findElement(".bookPackage");if(!button){return false}var bookingDisabledReasons=[];if(this.requiresProduct){bookingDisabledReasons.push("BOOKING_DISABLED_REQUIRED_PRODUCT")}if(!this.amountsValid(this.selectedPackage)){bookingDisabledReasons.push("BOOKING_DISABLED_AMOUNTS_INVALID")}if(!this.selectedDate){bookingDisabledReasons.push("BOOKING_DISABLED_INVALID_DATE")}if(!this.selectedTime){bookingDisabledReasons.push("BOOKING_DISABLED_INVALID_TIME")}if(!this.contactFormValid()){bookingDisabledReasons.push("BOOKING_DISABLED_CONTACT_FORM_INVALID")}var agreeEl=this.findElement("#recrasAgreeToAttachments");if(agreeEl&&!agreeEl.checked){bookingDisabledReasons.push("BOOKING_DISABLED_AGREEMENT")}if(bookingDisabledReasons.length>0){var reasonsList=bookingDisabledReasons.map(function(reason){return _this16.languageHelper.translate(reason)}).join("<li>");this.findElement("#bookingErrors").innerHTML="<ul><li>".concat(reasonsList,"</ul>");button.setAttribute("disabled","disabled")}else{this.findElement("#bookingErrors").innerHTML="";button.removeAttribute("disabled")}}},{key:"nextSectionActive",value:function nextSectionActive(completedQuery,activeQuery){if(completedQuery&&this.findElement(completedQuery)){this.findElement(completedQuery).classList.add("recras-completed");this.findElement(completedQuery).classList.remove("recras-active")}if(activeQuery&&this.findElement(activeQuery)){this.findElement(activeQuery).classList.add("recras-active")}}},{key:"normaliseDate",value:function normaliseDate(date,packageStart,bookingStart){var diffSeconds=(date-packageStart)/1e3;var tempDate=new Date(bookingStart.getTime());return new Date(tempDate.setSeconds(tempDate.getSeconds()+diffSeconds))}},{key:"paymentMethods",value:function paymentMethods(pack){var methods=[];if(pack.mag_online_geboekt_worden_direct_betalen){methods.push(this.PAYMENT_DIRECT)}if(pack.mag_online_geboekt_worden_achteraf_betalen){methods.push(this.PAYMENT_AFTERWARDS)}return methods}},{key:"preFillAmounts",value:function preFillAmounts(amounts){var _this17=this;_objectEntries(amounts).forEach(function(idAmount){var el;if(idAmount[0]==="bookingsize"){el=_this17.findElement("#bookingsize")}else{el=_this17.findElement('[data-package-id="'.concat(idAmount[0],'"]'))}if(el){el.value=idAmount[1];_this17.updateProductPrice(el)}});this.updateProductAmounts()}},{key:"previewTimes",value:function previewTimes(){var _this18=this;_toConsumableArray(this.findElements(".time-preview")).forEach(function(el){el.parentNode.removeChild(el)});if(this.selectedTime){var linesWithTime=this.selectedPackage.regels.filter(function(line){return!!line.begin});var linesBegin=linesWithTime.map(function(line){return new Date(line.begin)});var packageStart=new Date(Math.min.apply(Math,_toConsumableArray(linesBegin)));var linesNoBookingSize=this.getLinesNoBookingSize(this.selectedPackage);linesNoBookingSize.forEach(function(line,idx){if(line.begin!==null||line.eind!==null){var normalisedStart=_this18.normaliseDate(new Date(line.begin),packageStart,_this18.selectedDate);var normalisedEnd=_this18.normaliseDate(new Date(line.eind),packageStart,_this18.selectedDate);_this18.findElement('label[for="packageline'.concat(idx,'"]')).insertAdjacentHTML("afterbegin",'<span class="time-preview">'.concat(RecrasDateHelper.timePartOnly(normalisedStart)," – ").concat(RecrasDateHelper.timePartOnly(normalisedEnd),"</span>"))}})}}},{key:"productCountsBookingSize",value:function productCountsBookingSize(){var _this19=this;return this.getLinesBookingSize(this.selectedPackage).map(function(line){return{aantal:_this19.bookingSize(),arrangementsregel_id:line.id}})}},{key:"productCountsNoBookingSize",value:function productCountsNoBookingSize(){return _toConsumableArray(this.findElements('[id^="packageline"]')).map(function(line){return{aantal:isNaN(parseInt(line.value))?0:parseInt(line.value),arrangementsregel_id:parseInt(line.dataset.packageId,10)}})}},{key:"productCounts",value:function productCounts(){var counts=[];counts=counts.concat(this.productCountsNoBookingSize());counts=counts.concat(this.productCountsBookingSize());return counts}},{key:"removeWarnings",value:function removeWarnings(){_toConsumableArray(this.findElements(".booking-error:not(#bookingErrors)")).forEach(function(el){el.parentNode.removeChild(el)});_toConsumableArray(this.findElements(".minimum-amount")).forEach(function(el){el.parentNode.removeChild(el)});_toConsumableArray(this.findElements(".maximum-amount")).forEach(function(el){el.parentNode.removeChild(el)});_toConsumableArray(this.findElements(".recras-input-invalid")).forEach(function(el){el.classList.remove("recras-input-invalid")});_toConsumableArray(this.findElements(".recras-success")).forEach(function(el){el.parentNode.removeChild(el)})}},{key:"requiredAmount",value:function requiredAmount(hasNow,requiredProduct){var requiredFraction=hasNow/requiredProduct.per_x_aantal;if(requiredProduct.afronding==="boven"){requiredFraction=Math.ceil(requiredFraction)}else{requiredFraction=Math.floor(requiredFraction)}return requiredProduct.aantal*requiredFraction}},{key:"resetForm",value:function resetForm(){this.changePackage(null)}},{key:"selectSingleTime",value:function selectSingleTime(){if(this.findElements("#recras-onlinebooking-time option[value]").length!==1){return}this.findElement("#recras-onlinebooking-time option[value]").selected=true;var event;try{event=new Event("change")}catch(e){event=document.createEvent("Event");event.initEvent("change",true,true)}this.findElement("#recras-onlinebooking-time").dispatchEvent(event)}},{key:"setDiscountStatus",value:function setDiscountStatus(statusText){var isError=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var statusEl=this.findElement(".discount-status");if(!statusEl){this.element.querySelector(".recras-discounts").insertAdjacentHTML("beforeend",'<span class="discount-status"></span>');statusEl=this.findElement(".discount-status")}if(isError){statusEl.classList.add("booking-error")}else{statusEl.classList.remove("booking-error")}statusEl.innerHTML=statusText}},{key:"setHtml",value:function setHtml(msg){this.element.innerHTML=msg}},{key:"showStandardAttachments",value:function showStandardAttachments(){if(!this.selectedPackage||!this.findElement(".standard-attachments")){return true}var attachments=this.standardAttachments(this.selectedPackage);var attachmentHtml="";if(Object.keys(attachments).length){attachmentHtml+='<p><label><input type="checkbox" id="recrasAgreeToAttachments" required>'.concat(this.languageHelper.translate("AGREE_ATTACHMENTS"),"</label></p>");attachmentHtml+="<ul>";_objectValues(attachments).forEach(function(attachment){attachmentHtml+='<li><a href="'.concat(attachment.filename,'" download target="_blank">').concat(attachment.naam,"</a></li>")});attachmentHtml+="</ul>"}this.findElement(".standard-attachments").innerHTML=attachmentHtml;var agreeEl=this.findElement("#recrasAgreeToAttachments");if(agreeEl){agreeEl.addEventListener("change",this.maybeDisableBookButton.bind(this))}}},{key:"showTotalPrice",value:function showTotalPrice(){_toConsumableArray(this.findElements(".discountLine, .voucherLine, .priceWithDiscount")).forEach(function(el){el.parentNode.removeChild(el)});var html="";if(this.discount){html+='<div class="discountLine"><div>'.concat(this.discount.naam,"</div><div>").concat(this.formatPrice(this.getDiscountPrice(this.discount)),"</div></div>")}if(Object.keys(this.appliedVouchers).length){html+='<div class="voucherLine"><div>'.concat(this.languageHelper.translate("VOUCHERS_DISCOUNT"),"</div><div>").concat(this.formatPrice(this.getVouchersPrice()),"</div></div>")}if(this.discount||Object.keys(this.appliedVouchers).length){html+='<div class="priceWithDiscount"><div>'.concat(this.languageHelper.translate("PRICE_TOTAL_WITH_DISCOUNT"),"</div><div>").concat(this.formatPrice(this.getTotalPrice()),"</div></div>")}var elementToInsertBefore=this.findElement(".recras-amountsform p:last-of-type");if(elementToInsertBefore){elementToInsertBefore.insertAdjacentHTML("beforebegin",html)}var subtotalEl=this.findElement(".priceSubtotal");if(subtotalEl){subtotalEl.innerHTML=this.formatPrice(this.getSubTotal())}}},{key:"sortPackages",value:function sortPackages(packages){return packages.sort(function(a,b){var aName=a.weergavenaam||a.arrangement;var bName=b.weergavenaam||b.arrangement;if(aName<bName){return-1}if(aName>bName){return 1}return 0})}},{key:"shouldShowBookingSize",value:function shouldShowBookingSize(pack){return this.bookingSizeLines(pack).length>0}},{key:"showBookButton",value:function showBookButton(){var _this20=this;var promises=[];var paymentMethods=this.paymentMethods(this.selectedPackage);var paymentText="";var textPostBooking="";if(paymentMethods.indexOf(this.PAYMENT_DIRECT)>-1&&paymentMethods.indexOf(this.PAYMENT_AFTERWARDS)>-1){promises.push(this.languageHelper.filterTags(this.texts.online_boeking_betaalkeuze,this.selectedPackage?this.selectedPackage.id:null));promises.push(this.languageHelper.filterTags(this.texts.online_boeking_betaalkeuze_ideal_titel,this.selectedPackage?this.selectedPackage.id:null));promises.push(this.languageHelper.filterTags(this.texts.online_boeking_betaalkeuze_achteraf_titel,this.selectedPackage?this.selectedPackage.id:null));Promise.all(promises).then(function(msgs){paymentText="<p>".concat(msgs[0],"</p>");paymentText+='<ul>\n <li><label><input type="radio" name="paymentMethod" checked value="'.concat(_this20.PAYMENT_DIRECT,'"> ').concat(msgs[1],'</label>\n <li><label><input type="radio" name="paymentMethod" value="').concat(_this20.PAYMENT_AFTERWARDS,'"> ').concat(msgs[2],"</label>\n </ul>")})}else{promises.push(Promise.resolve(""))}promises.push(this.languageHelper.filterTags(this.texts.online_boeking_step3_text_post,this.selectedPackage?this.selectedPackage.id:null).then(function(msg){textPostBooking=msg}));Promise.all(promises).then(function(){var html='<div class="recras-finalise">\n <p>'.concat(textPostBooking,'</p>\n <div class="standard-attachments"></div>\n ').concat(paymentText,'\n <button type="submit" class="bookPackage" disabled>').concat(_this20.languageHelper.translate("BUTTON_BOOK_NOW"),'</button>\n <div class="booking-error" id="bookingErrors"></div>\n </div>');_this20.appendHtml(html);_this20.findElement(".bookPackage").addEventListener("click",_this20.submitBooking.bind(_this20));_this20.maybeDisableBookButton();_this20.updateProductAmounts()})}},{key:"showDiscountFields",value:function showDiscountFields(){var _this21=this;var existingEl=this.findElement(".recras-discounts");if(existingEl){existingEl.parentNode.removeChild(existingEl)}var html='\n <form class="recras-discounts">\n <div>\n <label for="discountcode">'.concat(this.languageHelper.translate("DISCOUNT_TITLE"),'</label>\n <input type="text" id="discountcode" class="discountcode" maxlength="50" disabled>\n </div>\n <button type="submit" class="button-secondary">').concat(this.languageHelper.translate("DISCOUNT_CHECK"),"</button>\n </form>\n ");this.findElement(".recras-datetime").insertAdjacentHTML("afterend",html);this.findElement(".recras-discounts").addEventListener("submit",function(e){e.preventDefault();_this21.checkDiscountAndVoucher();return false})}},{key:"showContactForm",value:function showContactForm(pack){var _this22=this;this.loadingIndicatorShow(this.findElement(".recras-datetime"));this.getContactForm(pack).then(function(form){return form.generateForm()}).then(function(html){_this22.appendHtml(html);_this22.loadingIndicatorHide();_this22.showBookButton();_this22.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_CONTACT_FORM_SHOWN);_toConsumableArray(_this22.findElements('[name^="contactformulier"]')).forEach(function(el){el.addEventListener("input",_this22.maybeDisableBookButton.bind(_this22));el.addEventListener("input",function(){if(_this22.contactFormValid()){_this22.nextSectionActive(".recras-contactform",".recras-finalise")}})})})}},{key:"maybeFillTime",value:function maybeFillTime(times){times=times.map(function(time){return RecrasDateHelper.timePartOnly(new Date(time))});this.showTimes(times);this.loadingIndicatorHide();if(!this.prefilledTime){this.selectSingleTime();return}if(times.includes(this.prefilledTime)){this.selectTime(this.prefilledTime);this.selectedDate=RecrasDateHelper.setTimeForDate(this.selectedDate,this.selectedTime);if(this.options.getPreviewTimes()===true){this.previewTimes()}return}this.toggleTimeField("show")}},{key:"calendarOnDateSelect",value:function calendarOnDateSelect(date,packageId){var _this23=this;this.removeWarnings();this.loadingIndicatorShow(this.findElement('label[for="recras-onlinebooking-time"]'));this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_DATE_SELECTED,RecrasDateHelper.datePartOnly(date));this.selectedDate=date;if(this.hasAtLeastOneProduct(this.selectedPackage)){this.getAvailableTimes(packageId,date).then(function(times){return _this23.maybeFillTime(times)})}if(this.discount&&this.discount.code){this.recheckDiscountCode()}this.findElement("#discountcode").removeAttribute("disabled");this.maybeDisableBookButton()}},{key:"calendarOnDraw",value:function calendarOnDraw(pika,packageId){var lastMonthYear=pika.calendars[pika.calendars.length-1];var lastDay=new Date(lastMonthYear.year,lastMonthYear.month,31);var lastAvailableDay=this.availableDays.reduce(function(acc,curVal){return curVal>acc?curVal:acc},"");if(!lastAvailableDay){lastAvailableDay=new Date}else{lastAvailableDay=new Date(lastAvailableDay)}if(lastAvailableDay>lastDay){return}var newEndDate=RecrasDateHelper.clone(lastAvailableDay);newEndDate.setFullYear(lastMonthYear.year);newEndDate.setMonth(lastMonthYear.month+2);this.getAvailableDays(packageId,lastAvailableDay,newEndDate)}},{key:"addDateTimeSelectionHtml",value:function addDateTimeSelectionHtml(){var today=RecrasDateHelper.datePartOnly(new Date);var html='<form class="recras-datetime">\n <label for="recras-onlinebooking-date">\n '.concat(this.languageHelper.translate("DATE"),'\n </label>\n <input type="text" id="recras-onlinebooking-date" class="recras-onlinebooking-date" min="').concat(today,'" disabled readonly autocomplete="off">\n <label for="recras-onlinebooking-time">\n ').concat(this.languageHelper.translate("TIME"),'\n </label>\n <select id="recras-onlinebooking-time" class="recras-onlinebooking-time" disabled autocomplete="off"></select>\n </form>');this.appendHtml(html)}},{key:"selectTime",value:function selectTime(time){this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_TIME_SELECTED);this.selectedTime=time;this.maybeDisableBookButton()}},{key:"showDateTimeSelection",value:function showDateTimeSelection(pack){var _this24=this;this.addDateTimeSelectionHtml();this.showDiscountFields();if(this.prefilledDate){this.toggleDateField("hide");this.calendarOnDateSelect(this.prefilledDate,pack.id)}if(this.prefilledTime){this.toggleTimeField("hide")}if(this.prefilledDate&&this.prefilledTime){this.findElement(".recras-datetime").classList.add("recrasHidden")}if(this.options.getPreFilledAmounts()){this.preFillAmounts(this.options.getPreFilledAmounts())}var pikadayOptions=_extends(RecrasCalendarHelper.defaultOptions(),{disableDayFn:function disableDayFn(day){var dateFmt=RecrasDateHelper.datePartOnly(day);return _this24.availableDays.indexOf(dateFmt)===-1},field:this.findElement(".recras-onlinebooking-date"),i18n:RecrasCalendarHelper.i18n(this.languageHelper),onDraw:function onDraw(pika){return _this24.calendarOnDraw(pika,pack.id)},onSelect:function onSelect(date){return _this24.calendarOnDateSelect(date,pack.id)}});this.datePicker=new Pikaday(pikadayOptions);this.findElement(".recras-onlinebooking-time").addEventListener("change",function(){_this24.selectTime(_this24.findElement(".recras-onlinebooking-time").value);_this24.nextSectionActive(".recras-datetime",".recras-discounts");_this24.nextSectionActive(null,".recras-contactform");_this24.selectedDate=RecrasDateHelper.setTimeForDate(_this24.selectedDate,_this24.selectedTime);if(_this24.options.getPreviewTimes()===true){_this24.previewTimes()}_this24.maybeDisableBookButton()})}},{key:"showPackages",value:function showPackages(packages){var _this25=this;packages=packages.filter(function(p){return p.mag_online});var packagesSorted=this.sortPackages(packages);var packageOptions=packagesSorted.map(function(pack){return'<option value="'.concat(pack.id,'">').concat(pack.weergavenaam||pack.arrangement)});var html='<select class="recras-package-selection"><option>'+packageOptions.join("")+"</select>";var promises=[];promises.push(this.languageHelper.filterTags(this.texts.online_boeking_step0_text_pre,this.selectedPackage?this.selectedPackage.id:null));promises.push(this.languageHelper.filterTags(this.texts.online_boeking_step0_text_post,this.selectedPackage?this.selectedPackage.id:null));return Promise.all(promises).then(function(msgs){_this25.appendHtml('<div class="recras-package-select recras-active"><p>'.concat(msgs[0],"</p>").concat(html,"<p>\n").concat(msgs[1],"</p></div>"));_this25.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_PACKAGES_SHOWN);var packageSelectEl=_this25.findElement(".recras-package-selection");packageSelectEl.addEventListener("change",function(){var selectedPackageId=parseInt(packageSelectEl.value,10);_this25.changePackage(selectedPackageId)})})}},{key:"showProducts",value:function showProducts(pack){var _this26=this;var promises=[];promises.push(this.languageHelper.filterTags(this.texts.online_boeking_step1_text_pre,this.selectedPackage?this.selectedPackage.id:null));promises.push(this.languageHelper.filterTags(this.texts.online_boeking_step1_text_post,this.selectedPackage?this.selectedPackage.id:null));return Promise.all(promises).then(function(msgs){var html='<form class="recras-amountsform" onsubmit="return false">';html+="<p>".concat(msgs[0],"</p>");html+='<div class="recras-heading">\n <div> </div>\n <div>'.concat(_this26.languageHelper.translate("HEADING_QUANTITY"),'</div>\n <div class="recras-price">').concat(_this26.languageHelper.translate("HEADING_PRICE"),"</div>\n </div>");if(_this26.shouldShowBookingSize(pack)){html+="<div>";html+='<div><label for="bookingsize">'.concat(pack.weergavenaam||pack.arrangement,"</label></div>");html+='<input type="number" id="bookingsize" class="bookingsize" min="'.concat(_this26.bookingSizeMinimum(pack),'" max="').concat(_this26.bookingSizeMaximum(pack),'" placeholder="0" data-price="').concat(_this26.bookingSizePrice(pack),'">');html+='<div class="recras-price recrasUnitPrice">'.concat(_this26.formatPrice(_this26.bookingSizePrice(pack)),"</div>");html+="</div>"}var linesNoBookingSize=_this26.getLinesNoBookingSize(pack);linesNoBookingSize.forEach(function(line,idx){html+="<div><div>";html+='<label for="packageline'.concat(idx,'">').concat(line.beschrijving_templated,"</label>");var maxAttr=line.max?'max="'.concat(line.max,'"'):"";html+='</div><input id="packageline'.concat(idx,'" type="number" min="0" ').concat(maxAttr,' placeholder="0" data-package-id="').concat(line.id,'" data-price="').concat(line.product.verkoop,'">');html+='<div class="recras-price recrasUnitPrice">'.concat(_this26.formatPrice(line.product.verkoop),"</div>");html+="</div>"});html+='<div class="priceWithoutDiscount">\n <div>'.concat(_this26.languageHelper.translate("PRICE_TOTAL"),'</div>\n <div></div>\n <div class="priceSubtotal"></div>\n </div>');html+="<p>".concat(msgs[1],"</p>");html+="</form>";_this26.appendHtml(html);_toConsumableArray(_this26.findElements('[id^="packageline"], .bookingsize')).forEach(function(el){el.addEventListener("input",_this26.updateProductAmounts.bind(_this26));el.addEventListener("input",_this26.updateProductPrice.bind(_this26,el))})})}},{key:"showTimes",value:function showTimes(times){var html="<option>";times.forEach(function(time){html+='<option value="'.concat(time,'">').concat(time)});this.findElement(".recras-onlinebooking-time").innerHTML=html;this.findElement(".recras-onlinebooking-time").removeAttribute("disabled");if(times.length===0){this.findElement(".recras-datetime").insertAdjacentHTML("afterend",'<div class="booking-error">'.concat(this.languageHelper.translate("ERR_NO_TIMES_FOR_DATE"),"</div>"))}}},{key:"clearTimes",value:function clearTimes(){this.findElement(".recras-onlinebooking-time").innerHTML="";this.findElement(".recras-onlinebooking-time").setAttribute("disabled","disabled")}},{key:"standardAttachments",value:function standardAttachments(){var _this27=this;var attachments={};if(!this.selectedPackage.onlineboeking_standaardbijlagen_meesturen){return attachments}this.productCounts().forEach(function(line){if(line.aantal>0){var product=_this27.findProduct(line.arrangementsregel_id).product;if(product.standaardbijlagen){product.standaardbijlagen.forEach(function(attachment){attachments[attachment.id]=attachment})}}});return attachments}},{key:"formatGA4Items",value:function formatGA4Items(){var _this28=this;var items=[];if(this.bookingSize()>0){var pck=this.selectedPackage;items.push({item_name:pck.weergavenaam||pck.arrangement,price:this.bookingSizePrice(pck),quantity:this.bookingSize()})}var linesNoBookingSize=this.getLinesNoBookingSize(this.selectedPackage);linesNoBookingSize=linesNoBookingSize.filter(function(line){var lineEl=_this28.findElement('[data-package-id="'.concat(line.id,'"]'));if(!lineEl){return false}if(isNaN(parseInt(lineEl.value))){return false}return parseInt(lineEl.value)>0});linesNoBookingSize=linesNoBookingSize.map(function(line){var lineEl=_this28.findElement('[data-package-id="'.concat(line.id,'"]'));return{item_name:line.beschrijving_templated,price:line.product.verkoop,quantity:parseInt(lineEl.value)}});items.push.apply(items,_toConsumableArray(linesNoBookingSize));return items}},{key:"submitBooking",value:function submitBooking(){var _this29=this;var productCounts=this.productCounts().map(function(line){return line.aantal});var productSum=productCounts.reduce(function(a,b){return a+b},0);if(this.bookingSize()===0&&productSum===0){this.error(this.languageHelper.translate("NO_PRODUCTS"));return false}var status=this.contactForm.checkRequiredCheckboxes();if(!status){return false}this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_BOOKING_SUBMITTED,this.selectedPackage.arrangement,Math.round(this.getTotalPrice()));var paymentMethod=this.paymentMethods(this.selectedPackage)[0];var paymentMethodEl=this.findElement('[name="paymentMethod"]:checked');if(paymentMethodEl&&this.validPaymentMethod(this.selectedPackage,paymentMethodEl.value)){paymentMethod=paymentMethodEl.value}this.loadingIndicatorHide();this.loadingIndicatorShow(this.findElement(".bookPackage"));var elem;if(null!==(elem=this.findElement(".bookPackage"))){elem.setAttribute("disabled","disabled")}var vouchers=Object.keys(this.appliedVouchers).length>0?Object.keys(this.appliedVouchers):null;var bookingParams={arrangement_id:this.selectedPackage.id,begin:this.selectedDate,betaalmethode:paymentMethod,contactformulier:this.contactForm.generateJson(),kortingscode:this.discount&&this.discount.code||null,producten:this.productCounts(),status:null,stuur_bevestiging_email:true,vouchers:vouchers};if(this.shouldShowBookingSize(this.selectedPackage)){bookingParams.boekingsgrootte=this.bookingSize()}if(this.options.getRedirectUrl()){bookingParams.redirect_url=this.options.getRedirectUrl()}return this.postJson("onlineboeking/reserveer",bookingParams).then(function(json){if(json.payment_url){_this29.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING,RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT,null,Math.round(_this29.getTotalPrice()),{currency:_this29.languageHelper.currency,value:_this29.getTotalPrice(),items:_this29.formatGA4Items()});window.top.location.href=json.payment_url}else if(json.redirect){window.top.location.href=json.redirect}else if(json.message&&json.status){_this29.findElement(".recras-amountsform").reset();_this29.findElement(".recras-datetime").reset();_this29.findElement(".recras-contactform").reset();_this29.element.scrollIntoView({behavior:"smooth"});_this29.element.insertAdjacentHTML("afterbegin",'<p class="recras-success">'.concat(json.message,"</p>"))}else{console.log(json)}_this29.loadingIndicatorHide();_this29.findElement(".bookPackage").removeAttribute("disabled")})}},{key:"toggleDateField",value:function toggleDateField(showHide){var dateEl=this.findElement("#recras-onlinebooking-date");var labelEl=this.findElement('[for="recras-onlinebooking-date"]');if(showHide==="hide"){dateEl.classList.add("recrasHidden");labelEl.classList.add("recrasHidden")}else{dateEl.classList.remove("recrasHidden");labelEl.classList.remove("recrasHidden");this.findElement(".recras-datetime").classList.remove("recrasHidden")}}},{key:"toggleTimeField",value:function toggleTimeField(showHide){var timeEl=this.findElement("#recras-onlinebooking-time");var labelEl=this.findElement('[for="recras-onlinebooking-time"]');if(showHide==="hide"){timeEl.classList.add("recrasHidden");labelEl.classList.add("recrasHidden")}else{timeEl.classList.remove("recrasHidden");labelEl.classList.remove("recrasHidden");this.findElement(".recras-datetime").classList.remove("recrasHidden")}}},{key:"updateProductAmounts",value:function updateProductAmounts(){var _this30=this;this.loadingIndicatorHide();this.availableDays=[];this.removeWarnings();this.checkDependencies();this.checkMinMaxAmounts();var maxPromise=this.checkMaximumForPackage();this.checkBookingSize(this.selectedPackage);this.recheckVouchers().then(function(){_this30.showTotalPrice()});this.showStandardAttachments();var datePickerEl=this.findElement(".recras-onlinebooking-date");var thisClass=this;maxPromise.then(function(){var amountErrors=thisClass.findElements(".minimum-amount, .maximum-amount, .recras-product-dependency");if(amountErrors.length>0){thisClass.nextSectionActive(null,".recras-amountsform");datePickerEl.setAttribute("disabled","disabled");return}thisClass.nextSectionActive(".recras-amountsform",".recras-datetime");if(!thisClass.hasAtLeastOneProduct(thisClass.selectedPackage)){return}thisClass.loadingIndicatorShow(thisClass.findElement('label[for="recras-onlinebooking-date"]'));var startDate=new Date;var endDate=new Date;endDate.setMonth(endDate.getMonth()+3);if(!thisClass.prefilledDate){thisClass.getAvailableDaysInPeriod(thisClass.selectedPackage.id,startDate,endDate);return}var date=thisClass.prefilledDate;startDate=new Date(date);endDate=new Date(date);endDate.setDate(endDate.getDate()+1);thisClass.getAvailableDays(thisClass.selectedPackage.id,startDate,endDate).then(function(availableDays){if(availableDays.includes(RecrasDateHelper.datePartOnly(date))){thisClass.toggleDateField("hide");thisClass.calendarOnDateSelect(date,thisClass.selectedPackage.id)}else{thisClass.toggleDateField("show");thisClass.getAvailableDaysInPeriod(thisClass.selectedPackage.id,startDate,endDate)}})})}},{key:"getAvailableDaysInPeriod",value:function getAvailableDaysInPeriod(packageId,startDate,endDate){var _this31=this;var datePickerEl=this.findElement(".recras-onlinebooking-date");this.getAvailableDays(packageId,startDate,endDate).then(function(availableDays){_this31.loadingIndicatorHide();if(datePickerEl.value&&availableDays.indexOf(datePickerEl.value)===-1){datePickerEl.value="";_this31.clearTimes()}else{datePickerEl.removeAttribute("disabled")}})}},{key:"updateProductPrice",value:function updateProductPrice(el){var priceEl=el.parentNode.querySelector(".recras-price");var amount=parseInt(el.value,10);if(isNaN(amount)){amount=0}if(amount>0){priceEl.classList.remove("recrasUnitPrice")}else{priceEl.classList.add("recrasUnitPrice")}amount=Math.max(amount,1);priceEl.innerHTML=this.formatPrice(amount*el.dataset.price)}},{key:"validPaymentMethod",value:function validPaymentMethod(pack,method){return this.paymentMethods(pack).indexOf(method)>-1}}]);return RecrasBooking}();var RecrasCalendarHelper=function(){function RecrasCalendarHelper(){_classCallCheck(this,RecrasCalendarHelper)}_createClass(RecrasCalendarHelper,null,[{key:"defaultOptions",value:function defaultOptions(){return{firstDay:1,minDate:new Date,numberOfMonths:2,reposition:false,position:"bottom right",toString:function toString(date){return RecrasDateHelper.toString(date)}}}},{key:"i18n",value:function i18n(languageHelper){return{previousMonth:languageHelper.translate("DATE_PICKER_PREVIOUS_MONTH"),nextMonth:languageHelper.translate("DATE_PICKER_NEXT_MONTH"),months:[languageHelper.translate("DATE_PICKER_MONTH_JANUARY"),languageHelper.translate("DATE_PICKER_MONTH_FEBRUARY"),languageHelper.translate("DATE_PICKER_MONTH_MARCH"),languageHelper.translate("DATE_PICKER_MONTH_APRIL"),languageHelper.translate("DATE_PICKER_MONTH_MAY"),languageHelper.translate("DATE_PICKER_MONTH_JUNE"),languageHelper.translate("DATE_PICKER_MONTH_JULY"),languageHelper.translate("DATE_PICKER_MONTH_AUGUST"),languageHelper.translate("DATE_PICKER_MONTH_SEPTEMBER"),languageHelper.translate("DATE_PICKER_MONTH_OCTOBER"),languageHelper.translate("DATE_PICKER_MONTH_NOVEMBER"),languageHelper.translate("DATE_PICKER_MONTH_DECEMBER")],weekdays:[languageHelper.translate("DATE_PICKER_DAY_SUNDAY_LONG"),languageHelper.translate("DATE_PICKER_DAY_MONDAY_LONG"),languageHelper.translate("DATE_PICKER_DAY_TUESDAY_LONG"),languageHelper.translate("DATE_PICKER_DAY_WEDNESDAY_LONG"),languageHelper.translate("DATE_PICKER_DAY_THURSDAY_LONG"),languageHelper.translate("DATE_PICKER_DAY_FRIDAY_LONG"),languageHelper.translate("DATE_PICKER_DAY_SATURDAY_LONG")],weekdaysShort:[languageHelper.translate("DATE_PICKER_DAY_SUNDAY_SHORT"),languageHelper.translate("DATE_PICKER_DAY_MONDAY_SHORT"),languageHelper.translate("DATE_PICKER_DAY_TUESDAY_SHORT"),languageHelper.translate("DATE_PICKER_DAY_WEDNESDAY_SHORT"),languageHelper.translate("DATE_PICKER_DAY_THURSDAY_SHORT"),languageHelper.translate("DATE_PICKER_DAY_FRIDAY_SHORT"),languageHelper.translate("DATE_PICKER_DAY_SATURDAY_SHORT")]}}},{key:"loadScript",value:function loadScript(){return new Promise(function(resolve,reject){var scriptID="recrasPikaday";if(document.getElementById(scriptID)){resolve(true)}var script=document.createElement("script");script.id=scriptID;script.src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.8.2/pikaday.min.js";script.addEventListener("load",function(){return resolve(script)},false);script.addEventListener("error",function(){return reject(script)},false);document.head.appendChild(script)})}}]);return RecrasCalendarHelper}();var RecrasContactForm=function(){function RecrasContactForm(){var _this32=this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,RecrasContactForm);this.languageHelper=new RecrasLanguageHelper;if(!(options instanceof RecrasOptions)){throw new Error(this.languageHelper.translate("ERR_OPTIONS_INVALID"))}this.options=options;if(!this.options.getFormId()){throw new Error(this.languageHelper.translate("ERR_NO_FORM"))}this.checkboxEventListeners=[];this.eventHelper=new RecrasEventHelper;this.eventHelper.setEvents(this.options.getAnalyticsEvents());this.element=this.options.getElement();this.element.classList.add("recras-contactform-wrapper");this.languageHelper.setOptions(options);if(RecrasLanguageHelper.isValid(this.options.getLocale())){this.languageHelper.setLocale(this.options.getLocale())}this.fetchJson=function(url){return RecrasHttpHelper.fetchJson(url,_this32.error.bind(_this32))};this.postJson=function(url,data){return RecrasHttpHelper.postJson(_this32.options.getApiBase()+url,data,_this32.error.bind(_this32))};RecrasCSSHelper.loadCSS("global");this.GENDERS={onbekend:"GENDER_UNKNOWN",man:"GENDER_MALE",vrouw:"GENDER_FEMALE"};this.AUTOCOMPLETE_OPTIONS={"contact.naam":"organization","contact.website":"url","contactpersoon.achternaam":"family-name","contactpersoon.adres":"address-line1","contactpersoon.plaats":"address-level2","contactpersoon.postcode":"postal-code","contactpersoon.voornaam":"given-name"}}_createClass(RecrasContactForm,[{key:"checkRequiredCheckboxes",value:function checkRequiredCheckboxes(){var _this33=this;this.removeWarnings();var isOkay=true;_toConsumableArray(this.findElements(".checkboxGroupRequired")).forEach(function(group){var checked=group.querySelectorAll("input:checked");if(checked.length===0){group.parentNode.querySelector("label").insertAdjacentHTML("beforeend",'<div class="recrasError">'.concat(_this33.languageHelper.translate("CONTACT_FORM_CHECKBOX_REQUIRED"),"</div>"));isOkay=false}});return isOkay}},{key:"appendHtml",value:function appendHtml(msg){this.element.insertAdjacentHTML("beforeend",msg)}},{key:"error",value:function error(msg){this.removeErrors(".recras-contactform");this.showInlineError(this.findElement(".submitForm"),msg)}},{key:"findElement",value:function findElement(querystring){return this.element.querySelector(querystring)}},{key:"findElements",value:function findElements(querystring){return this.element.querySelectorAll(querystring)}},{key:"isStandalone",value:function isStandalone(options){if(options.showSubmit){console.warn('Option "showSubmit" was renamed to "standalone". Please update your code.');options.standalone=true}return!!options.standalone}},{key:"generateForm",value:function generateForm(){var _this34=this;var extraOptions=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var waitFor=[];if(this.hasCountryField()){waitFor.push(this.getCountryList())}if(this.hasBookingDateField()||this.hasRelationDateField()){waitFor.push(RecrasCalendarHelper.loadScript());RecrasCSSHelper.loadCSS("pikaday")}return Promise.all(waitFor).then(function(){var standalone=_this34.isStandalone(extraOptions);var validateText=standalone?"novalidate":"";var html='<form class="recras-contactform" '.concat(validateText,">");if(extraOptions.voucherQuantitySelector){html+=_this34.quantitySelector(extraOptions.quantityTerm)}_this34.contactFormFields.forEach(function(field,idx){html+="<div>"+_this34.showField(field,idx)+"</div>"});if(standalone){html+=_this34.submitButtonHtml()}html+="</form>";return html})}},{key:"generateJson",value:function generateJson(){var formEl=this.options.getElement().querySelector(".recras-contactform");var elements=formEl.querySelectorAll('[id^="contactformulier-"], input[type="radio"]:checked');var contactForm={};_toConsumableArray(elements).forEach(function(field){contactForm[field.dataset.identifier]=field.value});_toConsumableArray(formEl.querySelectorAll('input[type="checkbox"]:checked')).forEach(function(field){if(contactForm[field.dataset.identifier]===undefined){contactForm[field.dataset.identifier]=[]}contactForm[field.dataset.identifier].push(field.value)});if(contactForm["boeking.datum"]){contactForm["boeking.datum"]=RecrasDateHelper.formatStringForAPI(contactForm["boeking.datum"])}return contactForm}},{key:"getContactFormFields",value:function getContactFormFields(){var _this35=this;return this.fetchJson(this.options.getApiBase()+"contactformulieren/"+this.options.getFormId()+"?embed=Velden").then(function(form){_this35.contactFormFields=form.Velden;_this35.packages=_this35.sortPackages(form.Arrangementen);return _this35.contactFormFields})}},{key:"getCountryList",value:function getCountryList(){var _this36=this;return this.fetchJson("https://cdn.rawgit.com/umpirsky/country-list/ddabf3a8/data/"+this.languageHelper.locale+"/country.json").then(function(json){_this36.countries=json;return _this36.countries})}},{key:"sortPackages",value:function sortPackages(packs){return packs.sort(function(a,b){if(a.arrangement<b.arrangement){return-1}if(a.arrangement>b.arrangement){return 1}if(a.id<b.id){return-1}if(a.id>b.id){return 1}return 0})}},{key:"getInvalidFields",value:function getInvalidFields(){var invalid=[];var required=this.getEmptyRequiredFields();var els=this.findElements(".recras-contactform :invalid");for(var _i14=0;_i14<els.length;_i14++){var el=els[_i14];if(!required.includes(el)){invalid.push(el)}}return invalid}},{key:"getEmptyRequiredFields",value:function getEmptyRequiredFields(){var isEmpty=[];var els=this.findElements(".recras-contactform :required");for(var _i16=0;_i16<els.length;_i16++){var el=els[_i16];if(el.value===undefined||el.value===""){isEmpty.push(el)}}return isEmpty}},{key:"getRelationExtraDateFields",value:function getRelationExtraDateFields(){return this.contactFormFields.filter(function(field){return field.soort_invoer==="contact.extra"&&field.input_type==="date"})}},{key:"hasFieldOfType",value:function hasFieldOfType(identifier){return this.contactFormFields.filter(function(field){return field.field_identifier===identifier}).length>0}},{key:"hasBookingDateField",value:function hasBookingDateField(){return this.hasFieldOfType("boeking.datum")}},{key:"hasCountryField",value:function hasCountryField(){return this.hasFieldOfType("contact.landcode")}},{key:"hasPackageField",value:function hasPackageField(){return this.hasFieldOfType("boeking.arrangement")}},{key:"hasRelationDateField",value:function hasRelationDateField(){return this.getRelationExtraDateFields().length>0}},{key:"isEmpty",value:function isEmpty(){var els=this.findElements(".recras-contactform input, .recras-contactform select, .recras-contactform textarea");var formValues=_toConsumableArray(els).map(function(el){return el.value});return!formValues.some(function(v){return v!==""})}},{key:"isValid",value:function isValid(){return this.findElement(".recras-contactform").checkValidity()}},{key:"loadingIndicatorHide",value:function loadingIndicatorHide(){_toConsumableArray(document.querySelectorAll(".recrasLoadingIndicator")).forEach(function(el){el.parentNode.removeChild(el)})}},{key:"loadingIndicatorShow",value:function loadingIndicatorShow(afterEl){if(!afterEl){return}afterEl.insertAdjacentHTML("beforeend",'<span class="recrasLoadingIndicator">'.concat(this.languageHelper.translate("LOADING"),"</span>"))}},{key:"quantitySelector",value:function quantitySelector(quantityTerm){if(!quantityTerm){quantityTerm=this.languageHelper.translate("VOUCHER_QUANTITY")}return'<div>\n <label for="number-of-vouchers">'.concat(quantityTerm,'</label>\n <input type="number" id="number-of-vouchers" class="number-of-vouchers" min="1" max="100" value="1" required>\n </div>')}},{key:"removeErrors",value:function removeErrors(){var parentQuery=arguments.length>0&&arguments[0]!==undefined?arguments[0]:"";_toConsumableArray(this.findElements(parentQuery+" .booking-error")).forEach(function(el){el.parentNode.removeChild(el)})}},{key:"removeWarnings",value:function removeWarnings(){_toConsumableArray(this.findElements(".recrasError")).forEach(function(el){el.parentNode.removeChild(el)});_toConsumableArray(this.findElements(".recras-success")).forEach(function(el){el.parentNode.removeChild(el)})}},{key:"hasEmptyRequiredFields",value:function hasEmptyRequiredFields(){return this.getEmptyRequiredFields().length>0}},{key:"showField",value:function showField(field,idx){var _this37=this;if(field.soort_invoer==="header"){return"<h3>".concat(field.naam,"</h3>")}var today=RecrasDateHelper.toString(new Date);var timePattern="(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])";var label=this.showLabel(field,idx);var attrRequired=field.verplicht?"required":"";var classes;var html;var placeholder;var fixedAttributes='id="contactformulier-'.concat(idx,'" name="contactformulier').concat(idx,'" ').concat(attrRequired,' data-identifier="').concat(field.field_identifier,'"');switch(field.soort_invoer){case"contactpersoon.geslacht":html="<select ".concat(fixedAttributes,' autocomplete="sex">');Object.keys(this.GENDERS).forEach(function(key){html+='<option value="'.concat(key,'">').concat(_this37.languageHelper.translate(_this37.GENDERS[key]))});html+="</select>";return label+html;case"keuze":classes=["checkboxGroup"];if(field.verplicht){classes.push("checkboxGroupRequired")}html='<div class="'.concat(classes.join(" "),'">');field.mogelijke_keuzes.forEach(function(choice){html+='<label><input type="checkbox" name="contactformulier'.concat(idx,'" value="').concat(choice,'" data-identifier="').concat(field.field_identifier,'">').concat(choice,"</label>")});html+="</div>";return label+html;case"keuze_enkel":case"contact.soort_klant":html='<div class="radioGroup">';field.mogelijke_keuzes.forEach(function(choice){html+='<label><input type="radio" name="contactformulier'.concat(idx,'" value="').concat(choice,'" ').concat(attrRequired,' data-identifier="').concat(field.field_identifier,'">').concat(choice,"</label>")});html+="</div>";return label+html;case"veel_tekst":return label+"<textarea ".concat(fixedAttributes,"></textarea>");case"contactpersoon.telefoon1":case"contactpersoon.telefoon2":return label+'<input type="tel" '.concat(fixedAttributes,' autocomplete="tel">');case"contactpersoon.email1":case"contactpersoon.email2":return label+'<input type="email" '.concat(fixedAttributes,' autocomplete="email">');case"contactpersoon.nieuwsbrieven":classes=["checkboxGroup"];if(field.verplicht){classes.push("checkboxGroupRequired")}html='<div class="'.concat(classes.join(" "),'">');Object.keys(field.newsletter_options).forEach(function(key){html+='<label><input type="checkbox" name="contactformulier'.concat(idx,'" value="').concat(key,'" data-identifier="').concat(field.field_identifier,'">').concat(field.newsletter_options[key],"</label>")});html+="</div>";return label+html;case"contact.landcode":html="<select ".concat(fixedAttributes,' autocomplete="country">');Object.keys(this.countries).forEach(function(code){var selectedText=code.toUpperCase()===_this37.options.getDefaultCountry()?"selected":"";html+='<option value="'.concat(code,'" ').concat(selectedText,">").concat(_this37.countries[code])});html+="</select>";return label+html;case"boeking.datum":placeholder=this.languageHelper.translate("DATE_FORMAT");return label+'<input type="text" '.concat(fixedAttributes,' min="').concat(today,'" placeholder="').concat(placeholder,'" autocomplete="off">');case"boeking.groepsgrootte":return label+'<input type="number" '.concat(fixedAttributes,' min="1">');case"boeking.starttijd":placeholder=this.languageHelper.translate("TIME_FORMAT");return label+'<input type="time" '.concat(fixedAttributes,' placeholder="').concat(placeholder,'" pattern="').concat(timePattern,'" step="300">');case"boeking.arrangement":var preFilledPackage=this.options.getPackageId();if(field.verplicht&&this.packages.length===1){var pack=this.packages[0];html="<select ".concat(fixedAttributes,'>\n <option value="').concat(pack.id,'" selected>').concat(pack.arrangement,"\n </select>");return label+html}html="<select ".concat(fixedAttributes,">");html+='<option value="">';this.packages.forEach(function(pack){var selText=preFilledPackage&&preFilledPackage===pack.id?"selected":"";html+='<option value="'.concat(pack.id,'" ').concat(selText,">").concat(pack.arrangement)});html+="</select>";return label+html;case"contact.extra":switch(field.input_type){case"number":return label+'<input type="number" '.concat(fixedAttributes,' autocomplete="off">');case"date":case"text":return label+'<input type="text" '.concat(fixedAttributes,' maxlength="200">');case"multiplechoice":classes=["checkboxGroup"];if(field.verplicht){classes.push("checkboxGroupRequired")}html='<div class="'.concat(classes.join(" "),'">');field.mogelijke_keuzes.forEach(function(choice){html+='<label><input type="checkbox" name="contactformulier'.concat(idx,'" value="').concat(choice,'" data-identifier="').concat(field.field_identifier,'">').concat(choice,"</label>")});html+="</div>";return label+html;case"singlechoice":html='<div class="radioGroup">';field.mogelijke_keuzes.forEach(function(choice){html+='<label><input type="radio" name="contactformulier'.concat(idx,'" value="').concat(choice,'" ').concat(attrRequired,' data-identifier="').concat(field.field_identifier,'">').concat(choice,"</label>")});html+="</div>";return label+html;default:console.debug("Unknown type",field.input_type,field);return label+'<input type="text" '.concat(fixedAttributes,">")}case"contact.website":default:var autocomplete=this.AUTOCOMPLETE_OPTIONS[field.soort_invoer]?this.AUTOCOMPLETE_OPTIONS[field.soort_invoer]:"";return label+'<input type="text" '.concat(fixedAttributes,' autocomplete="').concat(autocomplete,'">')}}},{key:"showForm",value:function showForm(){var _this38=this;this.loadingIndicatorShow(this.element);return this.getContactFormFields().then(function(){return _this38.generateForm({standalone:true})}).then(function(html){_this38.appendHtml(html);_toConsumableArray(_this38.findElements(".checkboxGroupRequired")).forEach(function(group){_toConsumableArray(group.querySelectorAll("input")).forEach(function(el){el.addEventListener("change",_this38.checkRequiredCheckboxes.bind(_this38))})});_this38.findElement(".recras-contactform").addEventListener("submit",_this38.submitForm.bind(_this38));if(_this38.hasBookingDateField()){var pikadayOptions=_extends(RecrasCalendarHelper.defaultOptions(),{field:_this38.findElement('[data-identifier="boeking.datum"]'),i18n:RecrasCalendarHelper.i18n(_this38.languageHelper),numberOfMonths:1});new Pikaday(pikadayOptions)}if(_this38.hasRelationDateField()){var fields=_this38.getRelationExtraDateFields();var thisYear=(new Date).getFullYear();var _pikadayOptions=_extends(RecrasCalendarHelper.defaultOptions(),{i18n:RecrasCalendarHelper.i18n(_this38.languageHelper),numberOfMonths:1,yearRange:[thisYear-90,thisYear+10]});delete _pikadayOptions.minDate;for(var _i18=0;_i18<fields.length;_i18++){var field=fields[_i18];_pikadayOptions.field=_this38.findElement('[data-identifier="'.concat(field.field_identifier,'"]'));new Pikaday(_pikadayOptions)}}_this38.loadingIndicatorHide()})}},{key:"showInlineError",value:function showInlineError(element,errorMsg){element.parentNode.insertAdjacentHTML("afterend",'<div class="booking-error">'.concat(errorMsg,"</div>"))}},{key:"showInlineErrors",value:function showInlineErrors(){for(var _i20=0,_this$getEmptyRequire2=this.getEmptyRequiredFields();_i20<_this$getEmptyRequire2.length;_i20++){var el=_this$getEmptyRequire2[_i20];var labelEl=el.parentNode.querySelector("label");var requiredText=this.languageHelper.translate("CONTACT_FORM_FIELD_REQUIRED",{FIELD_NAME:labelEl.innerText});el.parentNode.insertAdjacentHTML("afterend",'<div class="booking-error">'.concat(requiredText,"</div>"))}for(var _i22=0,_this$getInvalidField2=this.getInvalidFields();_i22<_this$getInvalidField2.length;_i22++){var _el=_this$getInvalidField2[_i22];var _labelEl=_el.parentNode.querySelector("label");var invalidText=this.languageHelper.translate("CONTACT_FORM_FIELD_INVALID",{FIELD_NAME:_labelEl.innerText});this.showInlineError(_el,invalidText)}}},{key:"showLabel",value:function showLabel(field,idx){var labelText=field.naam;if(field.verplicht){labelText+='<span class="recras-contactform-required" title="'.concat(this.languageHelper.translate("ATTR_REQUIRED"),'"></span>')}return'<label for="contactformulier-'.concat(idx,'">').concat(labelText,"</label>")}},{key:"submitButtonHtml",value:function submitButtonHtml(){return'<button type="submit" class="submitForm">'.concat(this.languageHelper.translate("BUTTON_SUBMIT_CONTACT_FORM"),"</button>")}},{key:"submitForm",value:function submitForm(e){var _this39=this;e.preventDefault();var submitButton=this.findElement(".submitForm");this.removeErrors(".recras-contactform");if(this.isEmpty()){submitButton.parentNode.insertAdjacentHTML("beforeend",'<div class="booking-error">'.concat(this.languageHelper.translate("ERR_CONTACT_FORM_EMPTY"),"</div>"));return false}else if(this.hasEmptyRequiredFields()||!this.isValid()){this.showInlineErrors();return false}if(!this.checkRequiredCheckboxes()){return false}this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_CONTACT_FORM,RecrasEventHelper.EVENT_CONTACT_FORM_SUBMIT,null,this.options.getFormId());this.loadingIndicatorHide();this.loadingIndicatorShow(submitButton);submitButton.setAttribute("disabled","disabled");this.postJson("contactformulieren/"+this.options.getFormId()+"/opslaan",this.generateJson()).then(function(json){if(json.success){if(_this39.options.getRedirectUrl()){window.top.location.href=_this39.options.getRedirectUrl()}else{_this39.element.scrollIntoView({behavior:"smooth"});_this39.element.insertAdjacentHTML("afterbegin",'<p class="recras-success">'.concat(_this39.languageHelper.translate("CONTACT_FORM_SUBMIT_SUCCESS"),"</p>"));submitButton.parentNode.reset()}}else{_this39.error(_this39.languageHelper.translate("CONTACT_FORM_SUBMIT_FAILED"))}submitButton.removeAttribute("disabled");_this39.loadingIndicatorHide()});return false}}]);return RecrasContactForm}();var RecrasCSSHelper=function(){function RecrasCSSHelper(){_classCallCheck(this,RecrasCSSHelper)}_createClass(RecrasCSSHelper,null,[{key:"cssBooking",value:function cssBooking(){return"\n.recras-onlinebooking {\n max-width: 800px;\n}\n.recras-onlinebooking > form + form, .recras-finalise {\n border-top: 2px solid #dedede; /* Any love for Kirby out there? */\n}\n.recras-amountsform > div {\n display: -ms-grid;\n display: grid;\n -ms-grid-columns: 1fr 5em 7em;\n grid-template-columns: 1fr 5em 7em;\n}\n.recras-amountsform > div > div:first-child {\n -ms-grid-column: 1;\n}\n.recras-amountsform > div > input {\n -ms-grid-column: 2;\n}\n.recras-amountsform input {\n width: auto; /* Firefox fix */\n}\n.recras-amountsform > div > div:last-child {\n -ms-grid-column: 3;\n}\n.recras-input-invalid {\n border: 1px solid hsl(0, 50%, 50%);\n}\n.booking-error, .minimum-amount {\n color: hsl(0, 50%, 50%);\n}\n.recras-success {\n color: hsl(120, 40%, 40%);\n}\n.minimum-amount {\n padding-left: 0.5em;\n}\n.recras-datetime {\n display: -ms-grid;\n display: grid;\n -ms-grid-columns: 30% 70%;\n grid-template-columns: 30% 70%;\n}\n.recras-datetime > * {\n margin: 0.25em 0;\n}\n.recras-datetime label {\n display: block;\n -ms-grid-column: 1;\n}\n.recras-datetime input, .recras-datetime select {\n max-width: 12em;\n -ms-grid-column: 2;\n}\n.recras-datetime > :nth-child(-n + 2) {\n -ms-grid-row: 1;\n}\n.recras-datetime > :nth-last-child(-n + 2) {\n -ms-grid-row: 2;\n}\n.time-preview {\n padding-right: 0.5em;\n}\n.recrasUnitPrice {\n opacity: 0.5;\n}\n.recras-onlinebooking .recrasHidden {\n display: none;\n}\n"}},{key:"cssGlobal",value:function cssGlobal(){return"\n.latestError, .recrasError {\n color: hsl(0, 50%, 50%);\n}\n.recras-onlinebooking > *:not(.latestError):not(.recrasLoadingIndicator) {\n padding: 1em 0;\n}\n.recras-datetime, .recras-discounts > div, .recras-contactform > div {\n display: -ms-grid;\n display: grid;\n -ms-grid-columns: 1fr 12em;\n grid-template-columns: 1fr 12em;\n}\n.recras-contactform > div {\n padding-bottom: 0.25em;\n padding-top: 0.25em;\n}\n.recras-contactform label {\n display: block;\n}\n.recras-contactform > div > :last-child {\n -ms-grid-column: 2;\n}\n.recras-amountsform .recras-full-width {\n display: block;\n}\n.recras-discounts > div > input {\n -ms-grid-column: 2;\n}\n\n.recrasLoadingIndicator {\n animation: recrasSpinner 1.1s infinite linear;\n border: 0.2em solid rgba(0, 0, 0, 0.2);\n border-left-color: rgba(0, 0, 0, 0.5);\n border-radius: 50%;\n display: inline-block;\n height: 2em;\n overflow: hidden;\n text-indent: -100vw;\n width: 2em;\n}\n@keyframes recrasSpinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\nbutton .recrasLoadingIndicator, label .recrasLoadingIndicator {\n height: 1em;\n vertical-align: middle;\n width: 1em;\n}\nbutton .recrasLoadingIndicator {\n margin-left: 0.5em;\n}\n.bookPackage, .submitForm, .buyTemplate {\n font: inherit;\n font-weight: bold;\n padding: 0.5em 2em;\n}\n@media (max-width: 520px) {\n .pika-single {\n max-width: 256px; /* Single month is 240px + 2x8px margin */\n }\n}\n"}},{key:"insertIntoHead",value:function insertIntoHead(el){document.head.insertAdjacentElement("afterbegin",el)}},{key:"loadInlineCss",value:function loadInlineCss(cssName,inlineCss){var styleEl=document.createElement("style");styleEl.id="recras-css-"+cssName;styleEl.innerHTML=inlineCss;RecrasCSSHelper.insertIntoHead(styleEl)}},{key:"loadExternalCss",value:function loadExternalCss(cssName,url){var linkEl=document.createElement("link");linkEl.id="recras-css-"+cssName;linkEl.setAttribute("rel","stylesheet");linkEl.setAttribute("type","text/css");linkEl.setAttribute("href",url);RecrasCSSHelper.insertIntoHead(linkEl)}},{key:"loadCSS",value:function loadCSS(cssName){var inlineCss;var url;switch(cssName){case"booking":inlineCss=this.cssBooking();break;case"global":inlineCss=this.cssGlobal();break;case"pikaday":url="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.8.2/css/pikaday.min.css";break;default:console.warn("Unknown CSS");break}if(document.getElementById("recras-css-"+cssName)){return}if(inlineCss){RecrasCSSHelper.loadInlineCss(cssName,inlineCss)}if(url){RecrasCSSHelper.loadExternalCss(cssName,url)}}}]);return RecrasCSSHelper}();var RecrasDateHelper=function(){function RecrasDateHelper(){_classCallCheck(this,RecrasDateHelper)}_createClass(RecrasDateHelper,null,[{key:"clone",value:function clone(date){return new Date(date.getTime())}},{key:"datePartOnly",value:function datePartOnly(date){var x=new Date(date.getTime()-date.getTimezoneOffset()*60*1e3);return x.toISOString().substr(0,10)}},{key:"formatStringForAPI",value:function formatStringForAPI(date){var datePatternDMY="(0[1-9]|1[0-9]|2[0-9]|3[01])-(0[1-9]|1[012])-([0-9]{4})";var dmyMatches=date.match(datePatternDMY);if(dmyMatches){return dmyMatches[3]+"-"+dmyMatches[2]+"-"+dmyMatches[1]}return date}},{key:"setTimeForDate",value:function setTimeForDate(date,timeStr){date.setHours(timeStr.substr(0,2),timeStr.substr(3,2));return date}},{key:"timePartOnly",value:function timePartOnly(date){return date.toTimeString().substr(0,5)}},{key:"toString",value:function toString(date){var x=new Date(date.getTime()-date.getTimezoneOffset()*60*1e3);x=x.toISOString();return x.substr(8,2)+"-"+x.substr(5,2)+"-"+x.substr(0,4)}}]);return RecrasDateHelper}();var RecrasEventHelper=function(){function RecrasEventHelper(){_classCallCheck(this,RecrasEventHelper);this.analyticsEnabled=false;this.eventsEnabled=RecrasEventHelper.allEvents()}_createClass(RecrasEventHelper,[{key:"eventEnabled",value:function eventEnabled(name){return this.eventsEnabled.includes(name)}},{key:"ga4EventMap",value:function ga4EventMap(action){var _map;var map=(_map={},_defineProperty(_map,RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED,"select_content"),_defineProperty(_map,RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT,"begin_checkout"),_defineProperty(_map,RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED,"select_content"),_defineProperty(_map,RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT,"begin_checkout"),_map);if(map[action]===undefined){return false}return map[action]}},{key:"isGA4",value:function isGA4(){var fn=window[window.GoogleAnalyticsObject||"ga"];return fn&&fn.h&&fn.h.gtm4}},{key:"sendEvent",value:function sendEvent(cat,action){var label=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;var value=arguments.length>3&&arguments[3]!==undefined?arguments[3]:undefined;var ga4Value=arguments.length>4&&arguments[4]!==undefined?arguments[4]:undefined;var event;try{event=new Event(RecrasEventHelper.PREFIX_GLOBAL+":"+cat+":"+action)}catch(e){event=document.createEvent("Event");event.initEvent(action,true,true)}if(this.analyticsEnabled&&this.eventEnabled(action)){if(this.isGA4()&&this.ga4EventMap(action)&&ga4Value){this.sendGA4Event(this.ga4EventMap(action),ga4Value)}else if(typeof window.gtag==="function"){var eventData={event_category:RecrasEventHelper.PREFIX_GLOBAL+":"+cat};if(label){eventData.event_label=label}if(value){eventData.value=value}window.gtag("event",action,eventData)}else if(typeof window.ga==="function"){var _eventData={hitType:"event",eventCategory:RecrasEventHelper.PREFIX_GLOBAL+":"+cat,eventAction:action};if(label){_eventData.eventLabel=label}if(value){_eventData.eventValue=value}window.ga(function(){var prefix=window.ga.getAll()[0].get("name");if(prefix){prefix+="."}window.ga(prefix+"send",_eventData)})}}return document.dispatchEvent(event)}},{key:"sendGA4Event",value:function sendGA4Event(action,data){var fn=window[window.GoogleAnalyticsObject||"ga"];fn("event",action,data)}},{key:"setAnalytics",value:function setAnalytics(bool){this.analyticsEnabled=bool}},{key:"setEvents",value:function setEvents(events){this.eventsEnabled=events}}],[{key:"allEvents",value:function allEvents(){return[RecrasEventHelper.EVENT_BOOKING_BOOKING_SUBMITTED,RecrasEventHelper.EVENT_BOOKING_CONTACT_FORM_SHOWN,RecrasEventHelper.EVENT_BOOKING_DATE_SELECTED,RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED,RecrasEventHelper.EVENT_BOOKING_PACKAGES_SHOWN,RecrasEventHelper.EVENT_BOOKING_PRODUCTS_SHOWN,RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT,RecrasEventHelper.EVENT_BOOKING_RESET,RecrasEventHelper.EVENT_BOOKING_TIME_SELECTED,RecrasEventHelper.EVENT_CONTACT_FORM_SUBMIT,RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT,RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED,RecrasEventHelper.EVENT_VOUCHER_VOUCHER_SUBMITTED]}}]);return RecrasEventHelper}();_defineProperty(RecrasEventHelper,"PREFIX_GLOBAL","Recras");_defineProperty(RecrasEventHelper,"PREFIX_BOOKING","Booking");_defineProperty(RecrasEventHelper,"PREFIX_CONTACT_FORM","ContactForm");_defineProperty(RecrasEventHelper,"PREFIX_VOUCHER","Voucher");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_BOOKING_SUBMITTED","BuyInProgress");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_CONTACT_FORM_SHOWN","ContactFormShown");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_DATE_SELECTED","DateSelected");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_PACKAGE_CHANGED","PackageChanged");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_PACKAGES_SHOWN","PackagesShown");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_PRODUCTS_SHOWN","ProductsShown");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_REDIRECT_PAYMENT","RedirectToPayment");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_RESET","Reset");_defineProperty(RecrasEventHelper,"EVENT_BOOKING_TIME_SELECTED","TimeSelected");_defineProperty(RecrasEventHelper,"EVENT_CONTACT_FORM_SUBMIT","Submit");_defineProperty(RecrasEventHelper,"EVENT_VOUCHER_REDIRECT_PAYMENT","RedirectToPayment");_defineProperty(RecrasEventHelper,"EVENT_VOUCHER_TEMPLATE_CHANGED","TemplateChanged");_defineProperty(RecrasEventHelper,"EVENT_VOUCHER_VOUCHER_SUBMITTED","BuyInProgress");var RecrasHttpHelper=function(){function RecrasHttpHelper(){_classCallCheck(this,RecrasHttpHelper)}_createClass(RecrasHttpHelper,null,[{key:"call",value:function call(url,data,errorHandler){if(!url){throw new Error("ERR_FETCH_WITHOUT_URL")}var lastResponse;return fetch(url,data).then(function(response){lastResponse=response;return response.json()}).then(function(json){if(!lastResponse.ok){var errorMsg=json.error&&json.error.message?json.error.message:lastResponse.status+" "+lastResponse.statusText;errorHandler(errorMsg);return false}return json})["catch"](function(err){errorHandler(err)})}},{key:"fetchJson",value:function fetchJson(url,errorHandler){return this.call(url,{credentials:"omit",method:"get"},errorHandler)}},{key:"postJson",value:function postJson(url,data,errorHandler){return this.call(url,{body:JSON.stringify(data),credentials:"omit",method:"post"},errorHandler)}}]);return RecrasHttpHelper}();var RecrasLanguageHelper=function(){function RecrasLanguageHelper(){_classCallCheck(this,RecrasLanguageHelper);this.defaultLocale="nl_NL";this.locale=this.defaultLocale;this.options=null;this.i18n={de_DE:{AGREE_ATTACHMENTS:"Ich stimme den folgenden Unterlagen zu:",ATTR_REQUIRED:"Erforderlich",BOOKING_DISABLED_AGREEMENT:"Sie haben den Bedingungen noch nicht zugestimmt",BOOKING_DISABLED_AMOUNTS_INVALID:"Programmbeträge sind ungültig",BOOKING_DISABLED_CONTACT_FORM_INVALID:"Das Kontaktformular ist nicht korrekt ausgefüllt",BOOKING_DISABLED_INVALID_DATE:"Kein Datum ausgewählt",BOOKING_DISABLED_INVALID_TIME:"Keine Zeit ausgewählt",BOOKING_DISABLED_REQUIRED_PRODUCT:"Erforderliches Produkt noch nicht ausgewählt",BUTTON_BOOK_NOW:"Jetzt buchen",BUTTON_BUY_NOW:"Jetzt kaufen",BUTTON_SUBMIT_CONTACT_FORM:"Senden",CONTACT_FORM_CHECKBOX_REQUIRED:"Es muss mindestens eine Option aktiviert sein",CONTACT_FORM_FIELD_INVALID:'"{FIELD_NAME}" ist ungültig',CONTACT_FORM_FIELD_REQUIRED:'"{FIELD_NAME}" ist ein erforderliches Feld',CONTACT_FORM_SUBMIT_FAILED:"Das Kontaktformular konnte nicht gesendet werden. Bitte versuchen Sie es später noch einmal.",CONTACT_FORM_SUBMIT_SUCCESS:"Das Kontaktformular wurde erfolgreich gesendet.",DATE:"Datum",DATE_FORMAT:"TT-MM-JJJJ",DATE_INVALID:"Ungültiges datum",DATE_PICKER_NEXT_MONTH:"Nächsten Monat",DATE_PICKER_PREVIOUS_MONTH:"Vorheriger Monat",DATE_PICKER_MONTH_JANUARY:"Januar",DATE_PICKER_MONTH_FEBRUARY:"Februar",DATE_PICKER_MONTH_MARCH:"März",DATE_PICKER_MONTH_APRIL:"April",DATE_PICKER_MONTH_MAY:"Mai",DATE_PICKER_MONTH_JUNE:"Juni",DATE_PICKER_MONTH_JULY:"Juli",DATE_PICKER_MONTH_AUGUST:"August",DATE_PICKER_MONTH_SEPTEMBER:"September",DATE_PICKER_MONTH_OCTOBER:"Oktober",DATE_PICKER_MONTH_NOVEMBER:"November",DATE_PICKER_MONTH_DECEMBER:"Dezember",DATE_PICKER_DAY_MONDAY_LONG:"Montag",DATE_PICKER_DAY_MONDAY_SHORT:"Mo",DATE_PICKER_DAY_TUESDAY_LONG:"Dienstag",DATE_PICKER_DAY_TUESDAY_SHORT:"Di",DATE_PICKER_DAY_WEDNESDAY_LONG:"Mittwoch",DATE_PICKER_DAY_WEDNESDAY_SHORT:"Mi",DATE_PICKER_DAY_THURSDAY_LONG:"Donnerstag",DATE_PICKER_DAY_THURSDAY_SHORT:"Do",DATE_PICKER_DAY_FRIDAY_LONG:"Freitag",DATE_PICKER_DAY_FRIDAY_SHORT:"Fr",DATE_PICKER_DAY_SATURDAY_LONG:"Samstag",DATE_PICKER_DAY_SATURDAY_SHORT:"Sa",DATE_PICKER_DAY_SUNDAY_LONG:"Sonntag",DATE_PICKER_DAY_SUNDAY_SHORT:"So",DISCOUNT_APPLIED:"Rabatt eingelöst",DISCOUNT_CHECK:"Überprüfen",DISCOUNT_TITLE:"Rabattcode oder Gutschein",DISCOUNT_INVALID:"Ungültiger Rabattcode oder Gutschein",ERR_AMOUNTS_NO_PACKAGE:'Die Option "productAmounts" ist gesetzt, aber "package_id" ist nicht gesetzt',ERR_CONTACT_FORM_EMPTY:"Das Kontaktformular ist nicht ausgefüllt",ERR_DATE_NO_SINGLE_PACKAGE:'Die Option "date" erfordert ein einzelnes vorgefülltes Arrangement ("package_id")',ERR_DATE_PAST:'Option "date" ist ein Datum in der Vergangenheit',ERR_GENERAL:"Etwas ist schief gelaufen:",ERR_INVALID_DATE:'Die Option "date" ist keine gültige ISO 8601-Datumszeichenfolge (z. B. "2019-06-28")',ERR_INVALID_ELEMENT:'Option "Element" ist kein gültiges Element',ERR_INVALID_HOSTNAME:'Option "recras_hostname" ist ungültig.',ERR_INVALID_LOCALE:"Ungültiges Gebietsschema. Gültige Optionen sind: {LOCALES}",ERR_INVALID_REDIRECT_URL:"Ungültige redirect URL. Stellen Sie sicher, dass es mit http:// or https:// beginnt",ERR_INVALID_TIME:'Die Option "time" ist keine gültige Zeitzeichenfolge (z. B. "16:15")',ERR_NO_ELEMENT:'Option "element" nicht eingestellt.',ERR_NO_FORM:'Option "form_id" nicht eingestellt.',ERR_NO_HOSTNAME:'Option "recras_hostname" nicht eingestellt.',ERR_NO_TIMES_FOR_DATE:"Für diese Mengen sind an diesem Datum keine Zeiten mehr verfügbar. Versuchen Sie es mit einem anderen Datum.",ERR_OPTIONS_INVALID:'Options is not a "RecrasOptions" object',GENDER_UNKNOWN:"Unbekannte",GENDER_MALE:"Mann",GENDER_FEMALE:"Frau",HEADING_PRICE:"Preis",HEADING_QUANTITY:"Anzahl",LOADING:"Wird geladen...",NO_PRODUCTS:"Kein Produkt ausgewählt",PRICE_TOTAL:"Insgesamt",PRICE_TOTAL_WITH_DISCOUNT:"Insgesamt inklusive Rabatt",PRODUCT_MAXIMUM:"(höchstens {MAXIMUM})",PRODUCT_MINIMUM:"(mindestens {MINIMUM})",PRODUCT_REQUIRED:"{NUM} {PRODUCT} benötigt {REQUIRED_AMOUNT} {REQUIRED_PRODUCT} um auch gebucht zu werden.",TIME:"Zeit",TIME_FORMAT:"UU:MM",VOUCHER_ALREADY_APPLIED:"Gutschein bereits eingelöst",VOUCHER_APPLIED:"Gutschein eingelöst",VOUCHER_EMPTY:"Leerer Gutscheincode",VOUCHER_QUANTITY:"Anzahl der Gutscheine",VOUCHERS_DISCOUNT:"Rabatt von Gutschein(en)"},en_GB:{AGREE_ATTACHMENTS:"I agree with the following documents:",ATTR_REQUIRED:"Required",BOOKING_DISABLED_AGREEMENT:"You have not agreed to the terms yet",BOOKING_DISABLED_AMOUNTS_INVALID:"Programme amounts are invalid",BOOKING_DISABLED_CONTACT_FORM_INVALID:"Contact form is not filled in correctly",BOOKING_DISABLED_INVALID_DATE:"No date selected",BOOKING_DISABLED_INVALID_TIME:"No time selected",BOOKING_DISABLED_REQUIRED_PRODUCT:"Required product not yet selected",BUTTON_BOOK_NOW:"Book now",BUTTON_BUY_NOW:"Buy now",BUTTON_SUBMIT_CONTACT_FORM:"Submit",CONTACT_FORM_CHECKBOX_REQUIRED:"At least one option must be checked",CONTACT_FORM_FIELD_INVALID:'"{FIELD_NAME}" is invalid',CONTACT_FORM_FIELD_REQUIRED:'"{FIELD_NAME}" is a required field',CONTACT_FORM_SUBMIT_FAILED:"The contact form could not be sent. Please try again later.",CONTACT_FORM_SUBMIT_SUCCESS:"The contact form was sent successfully.",DATE:"Date",DATE_FORMAT:"DD-MM-YYYY",DATE_INVALID:"Invalid date",DATE_PICKER_NEXT_MONTH:"Next month",DATE_PICKER_PREVIOUS_MONTH:"Previous month",DATE_PICKER_MONTH_JANUARY:"January",DATE_PICKER_MONTH_FEBRUARY:"February",DATE_PICKER_MONTH_MARCH:"March",DATE_PICKER_MONTH_APRIL:"April",DATE_PICKER_MONTH_MAY:"May",DATE_PICKER_MONTH_JUNE:"June",DATE_PICKER_MONTH_JULY:"July",DATE_PICKER_MONTH_AUGUST:"August",DATE_PICKER_MONTH_SEPTEMBER:"September",DATE_PICKER_MONTH_OCTOBER:"October",DATE_PICKER_MONTH_NOVEMBER:"November",DATE_PICKER_MONTH_DECEMBER:"December",DATE_PICKER_DAY_MONDAY_LONG:"Monday",DATE_PICKER_DAY_MONDAY_SHORT:"Mon",DATE_PICKER_DAY_TUESDAY_LONG:"Tuesday",DATE_PICKER_DAY_TUESDAY_SHORT:"Tue",DATE_PICKER_DAY_WEDNESDAY_LONG:"Wednesday",DATE_PICKER_DAY_WEDNESDAY_SHORT:"Wed",DATE_PICKER_DAY_THURSDAY_LONG:"Thursday",DATE_PICKER_DAY_THURSDAY_SHORT:"Thu",DATE_PICKER_DAY_FRIDAY_LONG:"Friday",DATE_PICKER_DAY_FRIDAY_SHORT:"Fri",DATE_PICKER_DAY_SATURDAY_LONG:"Saturday",DATE_PICKER_DAY_SATURDAY_SHORT:"Sat",DATE_PICKER_DAY_SUNDAY_LONG:"Sunday",DATE_PICKER_DAY_SUNDAY_SHORT:"Sun",DISCOUNT_APPLIED:"Discount applied",DISCOUNT_CHECK:"Check",DISCOUNT_TITLE:"Discount code or voucher",DISCOUNT_INVALID:"Invalid discount code or voucher",ERR_AMOUNTS_NO_PACKAGE:'Option "productAmounts" is set, but "package_id" is not set',ERR_CONTACT_FORM_EMPTY:"Contact form is not filled in",ERR_DATE_NO_SINGLE_PACKAGE:'Option "date" requires a single pre-filled package ("package_id")',ERR_DATE_PAST:'Option "date" is a date in the past',ERR_GENERAL:"Something went wrong:",ERR_INVALID_DATE:'Option "date" is not a valid ISO 8601 date string (e.g. "2019-06-28")',ERR_INVALID_ELEMENT:'Option "element" is not a valid Element',ERR_INVALID_HOSTNAME:'Option "recras_hostname" is invalid.',ERR_INVALID_LOCALE:"Invalid locale. Valid options are: {LOCALES}",ERR_INVALID_REDIRECT_URL:"Invalid redirect URL. Make sure you it starts with http:// or https://",ERR_INVALID_TIME:'Option "time" is not a valid time string (e.g. "16:15")',ERR_NO_ELEMENT:'Option "element" not set.',ERR_NO_FORM:'Option "form_id" not set.',ERR_NO_HOSTNAME:'Option "recras_hostname" not set.',ERR_NO_TIMES_FOR_DATE:"There are no more times available on this date for these quantities. Try a different date.",ERR_OPTIONS_INVALID:'Options is not a "RecrasOptions" object',GENDER_UNKNOWN:"Unknown",GENDER_MALE:"Male",GENDER_FEMALE:"Female",HEADING_PRICE:"Price",HEADING_QUANTITY:"Quantity",LOADING:"Loading...",NO_PRODUCTS:"No product selected",PRICE_TOTAL:"Total",PRICE_TOTAL_WITH_DISCOUNT:"Total including discount",PRODUCT_MAXIMUM:"(at most {MAXIMUM})",PRODUCT_MINIMUM:"(at least {MINIMUM})",PRODUCT_REQUIRED:"{NUM} {PRODUCT} requires {REQUIRED_AMOUNT} {REQUIRED_PRODUCT} to also be booked.",TIME:"Time",TIME_FORMAT:"HH:MM",VOUCHER_ALREADY_APPLIED:"Voucher already applied",VOUCHER_APPLIED:"Voucher applied",VOUCHER_EMPTY:"Empty voucher code",VOUCHER_QUANTITY:"Number of vouchers",VOUCHERS_DISCOUNT:"Discount from voucher(s)"},nl_NL:{AGREE_ATTACHMENTS:"Ik ga akkoord met de volgende gegevens:",ATTR_REQUIRED:"Vereist",BOOKING_DISABLED_AGREEMENT:"Je bent nog niet akkoord met de voorwaarden",BOOKING_DISABLED_AMOUNTS_INVALID:"Aantallen in programma zijn ongeldig",BOOKING_DISABLED_CONTACT_FORM_INVALID:"Contactformulier is niet correct ingevuld",BOOKING_DISABLED_INVALID_DATE:"Geen datum geselecteerd",BOOKING_DISABLED_INVALID_TIME:"Geen tijd geselecteerd",BOOKING_DISABLED_REQUIRED_PRODUCT:"Vereist product nog niet geselecteerd",BUTTON_BOOK_NOW:"Nu boeken",BUTTON_BUY_NOW:"Nu kopen",BUTTON_SUBMIT_CONTACT_FORM:"Versturen",CONTACT_FORM_CHECKBOX_REQUIRED:"Ten minste één optie moet aangevinkt worden",CONTACT_FORM_FIELD_INVALID:'"{FIELD_NAME}" is ongeldig',CONTACT_FORM_FIELD_REQUIRED:'"{FIELD_NAME}" is een verplicht veld',CONTACT_FORM_SUBMIT_FAILED:"Het contactformulier kon niet worden verstuurd. Probeer het later nog eens.",CONTACT_FORM_SUBMIT_SUCCESS:"Het contactformulier is succesvol verstuurd.",DATE:"Datum",DATE_FORMAT:"DD-MM-JJJJ",DATE_INVALID:"Ongeldige datum",DATE_PICKER_NEXT_MONTH:"Volgende maand",DATE_PICKER_PREVIOUS_MONTH:"Vorige maand",DATE_PICKER_MONTH_JANUARY:"Januari",DATE_PICKER_MONTH_FEBRUARY:"Februari",DATE_PICKER_MONTH_MARCH:"Maart",DATE_PICKER_MONTH_APRIL:"April",DATE_PICKER_MONTH_MAY:"Mei",DATE_PICKER_MONTH_JUNE:"Juni",DATE_PICKER_MONTH_JULY:"Juli",DATE_PICKER_MONTH_AUGUST:"Augustus",DATE_PICKER_MONTH_SEPTEMBER:"September",DATE_PICKER_MONTH_OCTOBER:"Oktober",DATE_PICKER_MONTH_NOVEMBER:"November",DATE_PICKER_MONTH_DECEMBER:"December",DATE_PICKER_DAY_MONDAY_LONG:"Maandag",DATE_PICKER_DAY_MONDAY_SHORT:"Ma",DATE_PICKER_DAY_TUESDAY_LONG:"Dinsdag",DATE_PICKER_DAY_TUESDAY_SHORT:"Di",DATE_PICKER_DAY_WEDNESDAY_LONG:"Woensdag",DATE_PICKER_DAY_WEDNESDAY_SHORT:"Wo",DATE_PICKER_DAY_THURSDAY_LONG:"Donderdag",DATE_PICKER_DAY_THURSDAY_SHORT:"Do",DATE_PICKER_DAY_FRIDAY_LONG:"Vrijdag",DATE_PICKER_DAY_FRIDAY_SHORT:"Vr",DATE_PICKER_DAY_SATURDAY_LONG:"Zaterdag",DATE_PICKER_DAY_SATURDAY_SHORT:"Za",DATE_PICKER_DAY_SUNDAY_LONG:"Zondag",DATE_PICKER_DAY_SUNDAY_SHORT:"Zo",DISCOUNT_APPLIED:"Kortingscode toegepast",DISCOUNT_CHECK:"Controleren",DISCOUNT_TITLE:"Kortingscode of tegoedbon",DISCOUNT_INVALID:"Ongeldige kortingscode of tegoedbon",ERR_AMOUNTS_NO_PACKAGE:'Optie "productAmounts" is ingesteld, maar "package_id" is niet ingesteld',ERR_CONTACT_FORM_EMPTY:"Contactformulier is niet ingevuld",ERR_DATE_NO_SINGLE_PACKAGE:'Optie "date" vereist een enkel vooraf ingevuld arrangement ("package_id")',ERR_DATE_PAST:'Optie "date" is een datum in het verleden',ERR_GENERAL:"Er ging iets mis:",ERR_INVALID_DATE:'Optie "date" is geen geldige ISO 8601-datumstring (bijv. "2019-06-28")',ERR_INVALID_ELEMENT:'Optie "element" is geen geldig Element',ERR_INVALID_HOSTNAME:'Optie "recras_hostname" is ongeldig.',ERR_INVALID_LOCALE:"Ongeldige locale. Geldige opties zijn: {LOCALES}",ERR_INVALID_REDIRECT_URL:"Ongeldige redirect-URL. Zorg ervoor dat deze begint met http:// of https://",ERR_INVALID_TIME:'Optie "time" is geen geldige tijd-string (bijv. "16:15")',ERR_NO_ELEMENT:'Optie "element" niet ingesteld.',ERR_NO_FORM:'Optie "form_id" niet ingesteld.',ERR_NO_HOSTNAME:'Optie "recras_hostname" niet ingesteld.',ERR_NO_TIMES_FOR_DATE:"Er zijn geen tijden meer beschikbaar op deze datum voor deze aantallen. Probeer een andere datum.",ERR_OPTIONS_INVALID:'Opties is geen "RecrasOptions"-object',GENDER_UNKNOWN:"Onbekend",GENDER_MALE:"Man",GENDER_FEMALE:"Vrouw",HEADING_PRICE:"Prijs",HEADING_QUANTITY:"Aantal",LOADING:"Laden...",NO_PRODUCTS:"Geen product gekozen",PRICE_TOTAL:"Totaal",PRICE_TOTAL_WITH_DISCOUNT:"Totaal inclusief korting",PRODUCT_MAXIMUM:"(maximaal {MAXIMUM})",PRODUCT_MINIMUM:"(minimaal {MINIMUM})",PRODUCT_REQUIRED:"{NUM} {PRODUCT} vereist dat ook {REQUIRED_AMOUNT} {REQUIRED_PRODUCT} geboekt wordt.",TIME:"Tijd",TIME_FORMAT:"UU:MM",VOUCHER_ALREADY_APPLIED:"Tegoedbon al toegepast",VOUCHER_APPLIED:"Tegoedbon toegepast",VOUCHER_EMPTY:"Lege tegoedbon",VOUCHER_QUANTITY:"Aantal tegoedbonnen",VOUCHERS_DISCOUNT:"Korting uit tegoedbon(nen)"},sv_SE:{AGREE_ATTACHMENTS:"Jag håller med följande information:",ATTR_REQUIRED:"Obligatoriskt",BOOKING_DISABLED_AGREEMENT:"Du håller inte med villkoren ännu",BOOKING_DISABLED_AMOUNTS_INVALID:"Siffrorna i programmet är ogiltiga",BOOKING_DISABLED_CONTACT_FORM_INVALID:"Kontaktformuläret är inte korrekt ifyllt",BOOKING_DISABLED_INVALID_DATE:"Inget datum valt",BOOKING_DISABLED_INVALID_TIME:"Ingen tid vald",BOOKING_DISABLED_REQUIRED_PRODUCT:"Nödvändig produkt har ännu inte valts",BUTTON_BOOK_NOW:"Boka nu",BUTTON_BUY_NOW:"Köp nu",BUTTON_SUBMIT_CONTACT_FORM:"Skicka",CONTACT_FORM_CHECKBOX_REQUIRED:"Minst ett alternativ måste markeras",CONTACT_FORM_FIELD_INVALID:'"{FIELD_NAME}" är ogiltig',CONTACT_FORM_FIELD_REQUIRED:'"{FIELD_NAME}" är ett obligatoriskt fält',CONTACT_FORM_SUBMIT_FAILED:"Kontaktformuläret kunde inte skickas. Vänligen försök igen senare.",CONTACT_FORM_SUBMIT_SUCCESS:"Kontaktformuläret har skickats.",DATUM:"Datum",DATE_FORMAT:"DD-MM-ÅÅÅÅ",DATE_INVALID:"Ogiltigt datum",DATE_PICKER_NEXT_MONTH:"Nästa månad",DATE_PICKER_PREVIOUS_MONTH:"Förra månaden",DATE_PICKER_MONTH_JANUARI:"januari",DATE_PICKER_MONTH_FEBRUARY:"februari",DATE_PICKER_MONTH_MARCH:"mars",DATE_PICKER_MONTH_APRIL:"april",DATE_PICKER_MONTH_MAY:"aaj",DATE_PICKER_MONTH_JUNE:"juni",DATE_PICKER_MONTH_JULY:"Juli",DATE_PICKER_MONTH_AUGUST:"augusti",DATE_PICKER_MONTH_SEPTEMBER:"september",DATE_PICKER_MONTH_OCTOBER:"oktober",DATE_PICKER_MONTH_NOVEMBER:"november",DATE_PICKER_MONTH_DECEMBER:"december",DATE_PICKER_DAY_MONDAY_LONG:"Måndag",DATE_PICKER_DAY_MONDAY_SHORT:"Mån",DATE_PICKER_DAY_TUESDAY_LONG:"Tisdag",DATE_PICKER_DAY_TUESDAY_SHORT:"Tis",DATE_PICKER_DAY_WEDNESDAY_LONG:"Onsdag",DATE_PICKER_DAY_WEDNESDAY_SHORT:"Ons",DATE_PICKER_DAY_THURSDAY_LONG:"Torsdag",DATE_PICKER_DAY_THURSDAY_SHORT:"Tors",DATE_PICKER_DAY_FRIDAY_LONG:"Fredag",DATE_PICKER_DAY_FRIDAY_SHORT:"Fre",DATE_PICKER_DAY_SATURDAY_LONG:"Lördag",DATE_PICKER_DAY_SATURDAY_SHORT:"Lör",DATE_PICKER_DAY_SUNDAY_LONG:"Söndag",DATE_PICKER_DAY_SUNDAY_SHORT:"Sön",DISCOUNT_APPLIED:"Rabattkod tillämpas",DISCOUNT_CHECK:"Kontrollera",DISCOUNT_TITLE:"Rabattkod eller kupong",DISCOUNT_INVALID:"Ogiltig rabattkod eller kupong",ERR_AMOUNTS_NO_PACKAGE:'Alternativ "productAmounts" är inställt, men "package_id" är inte inställt',ERR_CONTACT_FORM_EMPTY:"Kontaktformuläret är inte ifyllt",ERR_DATE_NO_SINGLE_PACKAGE:'Alternativ "date" kräver ett enda förfyllt paket ("package_id")',ERR_DATE_PAST:'Alternativ "date" är ett datum tidigare',ERR_GENERAL:"Något gick fel:",ERR_INVALID_DATE:'Alternativ "date" är inte en giltig ISO 8601-datumsträng (t.ex. "2019-06-28")',ERR_INVALID_ELEMENT:'Alternativet "element" är inte ett giltigt element',ERR_INVALID_HOSTNAME:'Alternativet "recras_hostname" är ogiltigt.',ERR_INVALID_LOCALE:"Ogiltig land-språkkombination. Giltiga alternativ är: {LOCALES} ",ERR_INVALID_REDIRECT_URL:"Ogiltig omdirigerings-URL. Se till att det börjar med http:// eller https:// ",ERR_INVALID_TIME:'Alternativ "time" är inte en giltig tidsnotation (t.ex. "16:15")',ERR_NO_ELEMENT:'Alternativet "element" är inte inställt.',ERR_NO_FORM:'Alternativ "form_id" inte inställt.',ERR_NO_HOSTNAME:'Alternativ "recras_hostname" inte inställt.',ERR_NO_TIMES_FOR_DATE:"Det finns inga fler tillgängliga tider på detta datum för dessa nummer. Prova ett annat datum. ",ERR_OPTIONS_INVALID:'Alternativ är inte ett "RecrasOptions"-objekt',GENDER_UNKNOWN:"Okänd",GENDER_MALE:"Man",GENDER_FEMALE:"Kvinna",HEADING_PRICE:"Pris",HEADING_QUANTITY:"Antal",LOADING:"Laddar ...",NO_PRODUCTS:"Ingen produkt vald",PRICE_TOTAL:"Totalt",PRICE_TOTAL_WITH_DISCOUNT:"Totalt inklusive rabatt",PRODUCT_MAXIMUM:"(maximalt {MAXIMUM})",PRODUCT_MINIMUM:"(minimalt {MINIMUM})",PRODUCT_REQUIRED:"{NUM} {PRODUCT} kräver att {REQUIRED_AMOUNT} {REQUIRED_PRODUCT} också bokas.",TIME:"Tid",TIME_FORMAT:"TT:MM",VOUCHER_ALREADY_APPLIED:"Kupongen är redan inlöst",VOUCHER_APPLIED:"Kupong inlöst",VOUCHER_EMPTY:"Tom kupong",VOUCHER_QUANTITY:"Antal kuponger",VOUCHERS_DISCOUNT:"Rabatt från kupong(er)"}}}_createClass(RecrasLanguageHelper,[{key:"error",value:function error(msg){console.log("Error",msg)}},{key:"extractTags",value:function extractTags(msg){var alphanumericWithUnderscore="[a-zA-Z0-9_]";var regexPartMulticolumn="((?:\\((?:\\w+)(?::[^)]*)?\\))*)";var regex=new RegExp("{"+alphanumericWithUnderscore+"+"+regexPartMulticolumn+"}","g");var tags=msg.match(regex);if(!Array.isArray(tags)){return[]}return tags.map(function(tag){return tag.substring(1,tag.length-1)})}},{key:"filterTags",value:function filterTags(msg,packageID){var tags=this.extractTags(msg);if(tags.length===0){return Promise.resolve(msg)}return RecrasHttpHelper.postJson(this.options.getApiBase()+"tagfilter",{tags:tags,context:{packageID:packageID}},this.error).then(function(filtered){Object.keys(filtered).forEach(function(tag){msg=msg.split("{"+tag+"}").join(filtered[tag])});return msg})}},{key:"formatLocale",value:function formatLocale(what){switch(what){case"currency":return this.locale.replace("_","-").toUpperCase();default:return this.locale}}},{key:"formatPrice",value:function formatPrice(price){return parseFloat(price).toLocaleString(this.formatLocale("currency"),{currency:this.currency,style:"currency"})}},{key:"setCurrency",value:function setCurrency(){var _this40=this;var errorHandler=function errorHandler(err){_this40.currency="eur";_this40.error(err)};return RecrasHttpHelper.fetchJson(this.options.getApiBase()+"instellingen/currency",errorHandler).then(function(setting){_this40.currency=setting.waarde})}},{key:"setLocale",value:function setLocale(locale){this.locale=locale}},{key:"setOptions",value:function setOptions(options){this.options=options;return this.setCurrency()}},{key:"translate",value:function translate(string){var vars=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var translated;if(this.i18n[this.locale]&&this.i18n[this.locale][string]){translated=this.i18n[this.locale][string]}else if(this.i18n.en_GB[string]){translated=this.i18n.en_GB[string]}else{translated=string;console.warn("String not translated: "+string)}if(Object.keys(vars).length>0){Object.keys(vars).forEach(function(key){translated=translated.replace("{"+key+"}",vars[key])})}return translated}}],[{key:"isValid",value:function isValid(locale){return this.validLocales.indexOf(locale)>-1}}]);return RecrasLanguageHelper}();_defineProperty(RecrasLanguageHelper,"validLocales",["de_DE","en_GB","nl_NL","sv_SE"]);var RecrasOptions=function(){function RecrasOptions(options){_classCallCheck(this,RecrasOptions);this.languageHelper=new RecrasLanguageHelper;this.validate(options);this.options=this.setOptions(options)}_createClass(RecrasOptions,[{key:"getAnalyticsEvents",value:function getAnalyticsEvents(){if(!Array.isArray(this.options.analyticsEvents)){this.options.analyticsEvents=RecrasEventHelper.allEvents()}this.options.analyticsEvents=this.options.analyticsEvents.filter(function(event){var eventExists=RecrasEventHelper.allEvents().includes(event);if(!eventExists){console.warn("Invalid event: "+event)}return eventExists});if(this.options.analyticsEvents.length===0){this.options.analyticsEvents=RecrasEventHelper.allEvents()}return this.options.analyticsEvents}},{key:"getAnalytics",value:function getAnalytics(){return this.options.analytics}},{key:"getApiBase",value:function getApiBase(){return this.getHostname()+"/api2/"}},{key:"getAutoScroll",value:function getAutoScroll(){return this.options.autoScroll!==undefined?this.options.autoScroll:true}},{key:"getDefaultCountry",value:function getDefaultCountry(){if(this.options.defaultCountry!==undefined){return this.options.defaultCountry}return this.getLocale().substr(3,2)}},{key:"getElement",value:function getElement(){return this.options.element}},{key:"getFormId",value:function getFormId(){return this.options.form_id}},{key:"getHostname",value:function getHostname(){return this.options.hostname}},{key:"getLocale",value:function getLocale(){return this.options.locale}},{key:"getPackageId",value:function getPackageId(){return this.options.package_id}},{key:"getPreFilledAmounts",value:function getPreFilledAmounts(){return this.options.productAmounts}},{key:"getPreFilledDate",value:function getPreFilledDate(){return this.options.date}},{key:"getPreFilledTime",value:function getPreFilledTime(){return this.options.time}},{key:"getPreviewTimes",value:function getPreviewTimes(){return this.options.previewTimes!==undefined?this.options.previewTimes:true}},{key:"getRedirectUrl",value:function getRedirectUrl(){return this.options.redirect_url}},{key:"getVoucherTemplateId",value:function getVoucherTemplateId(){return this.options.voucher_template_id}},{key:"isSinglePackage",value:function isSinglePackage(){if(Array.isArray(this.options.package_id)){return this.options.package_id.length===1}return!isNaN(parseInt(this.options.package_id,10))}},{key:"setOption",value:function setOption(option,value){this.options[option]=value}},{key:"setOptions",value:function setOptions(options){var protocol="https";if(RecrasOptions.hostnamesDebug.includes(options.recras_hostname)){protocol="http"}options.hostname=protocol+"://"+options.recras_hostname;return options}},{key:"validate",value:function validate(options){var hostnameRegex=new RegExp(/^[a-z0-9\-]+\.recras\.nl$/i);if(!options.element){throw new Error(this.languageHelper.translate("ERR_NO_ELEMENT"))}if(options.element instanceof Element===false){throw new Error(this.languageHelper.translate("ERR_INVALID_ELEMENT"))}if(!options.recras_hostname){throw new Error(this.languageHelper.translate("ERR_NO_HOSTNAME"))}if(!hostnameRegex.test(options.recras_hostname)&&!RecrasOptions.hostnamesDebug.includes(options.recras_hostname)){throw new Error(this.languageHelper.translate("ERR_INVALID_HOSTNAME"))}if(options.redirect_url){if(options.redirect_url.indexOf("http://")===-1&&options.redirect_url.indexOf("https://")===-1){throw new Error(this.languageHelper.translate("ERR_INVALID_REDIRECT_URL"))}}}}]);return RecrasOptions}();_defineProperty(RecrasOptions,"hostnamesDebug",["nginx:8886","nginx"]);var RecrasVoucher=function(){function RecrasVoucher(){var _this41=this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,RecrasVoucher);this.languageHelper=new RecrasLanguageHelper;if(options instanceof RecrasOptions===false){throw new Error(this.languageHelper.translate("ERR_OPTIONS_INVALID"))}this.options=options;this.eventHelper=new RecrasEventHelper;this.eventHelper.setEvents(this.options.getAnalyticsEvents());this.element=this.options.getElement();this.element.classList.add("recras-buy-voucher");this.fetchJson=function(url){return RecrasHttpHelper.fetchJson(url,_this41.error)};this.postJson=function(url,data){return RecrasHttpHelper.postJson(_this41.options.getApiBase()+url,data,_this41.error)};RecrasCSSHelper.loadCSS("global");if(this.options.getLocale()){if(!RecrasLanguageHelper.isValid(this.options.getLocale())){console.warn(this.languageHelper.translate("ERR_INVALID_LOCALE",{LOCALES:RecrasLanguageHelper.validLocales.join(", ")}))}else{this.languageHelper.setLocale(this.options.getLocale())}}this.languageHelper.setOptions(options).then(function(){return _this41.getVoucherTemplates()}).then(function(templates){if(_this41.options.getVoucherTemplateId()){_this41.changeTemplate(_this41.options.getVoucherTemplateId())}else{_this41.showTemplates(templates)}})}_createClass(RecrasVoucher,[{key:"appendHtml",value:function appendHtml(msg){this.element.insertAdjacentHTML("beforeend",msg)}},{key:"formatGA4Item",value:function formatGA4Item(){return[{item_name:this.selectedTemplate.name,price:this.selectedTemplate.price,quantity:parseInt(this.findElement("#number-of-vouchers").value)}]}},{key:"buyTemplate",value:function buyTemplate(){var _this42=this;var status=this.contactForm.checkRequiredCheckboxes();if(!status){return false}this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER,RecrasEventHelper.EVENT_VOUCHER_VOUCHER_SUBMITTED,this.selectedTemplate.name,Math.round(this.totalPrice()));this.findElement(".buyTemplate").setAttribute("disabled","disabled");var payload={voucher_template_id:this.selectedTemplate.id,number_of_vouchers:parseInt(this.findElement(".number-of-vouchers").value,10),contact_form:this.contactForm.generateJson()};if(this.options.getRedirectUrl()){payload.redirect_url=this.options.getRedirectUrl()}this.postJson("vouchers/buy",payload).then(function(json){if(json.payment_url){_this42.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER,RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT,null,Math.round(_this42.totalPrice()),{currency:_this42.languageHelper.currency,value:_this42.totalPrice(),items:_this42.formatGA4Item()});window.top.location.href=json.payment_url}else{console.log(json)}_this42.findElement(".buyTemplate").removeAttribute("disabled")})}},{key:"changeTemplate",value:function changeTemplate(templateID){this.selectedTemplate=this.templates.filter(function(t){return t.id===templateID})[0];this.clearAllExceptTemplateSelection();this.showContactForm(this.selectedTemplate);this.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER,RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED,null,templateID,{content_type:"voucher",item_id:templateID})}},{key:"clearAll",value:function clearAll(){this.clearElements(this.element.children)}},{key:"clearAllExceptTemplateSelection",value:function clearAllExceptTemplateSelection(){var elements=document.querySelectorAll("#"+this.element.id+" > *:not(.recras-voucher-templates)");this.clearElements(elements)}},{key:"clearElements",value:function clearElements(elements){_toConsumableArray(elements).forEach(function(el){el.parentNode.removeChild(el)});this.maybeAddLatestErrorElement()}},{key:"error",value:function error(msg){this.maybeAddLatestErrorElement();this.findElement(".latestError").innerHTML="<strong>".concat(this.languageHelper.translate("ERR_GENERAL"),"</strong><p>").concat(msg,"</p>")}},{key:"findElement",value:function findElement(querystring){return this.element.querySelector(querystring)}},{key:"findElements",value:function findElements(querystring){return this.element.querySelectorAll(querystring)}},{key:"formatPrice",value:function formatPrice(price){return this.languageHelper.formatPrice(price)}},{key:"getContactForm",value:function getContactForm(template){var _this43=this;this.options.setOption("form_id",template.contactform_id);var contactForm=new RecrasContactForm(this.options);return contactForm.getContactFormFields().then(function(){_this43.contactForm=contactForm;return contactForm})}},{key:"getVoucherTemplates",value:function getVoucherTemplates(){var _this44=this;return this.fetchJson(this.options.getApiBase()+"voucher_templates").then(function(templates){templates=templates.filter(function(template){return!!template.contactform_id});_this44.templates=templates;return templates})}},{key:"maybeAddLatestErrorElement",value:function maybeAddLatestErrorElement(){var errorEl=this.findElement(".latestError");if(!errorEl){this.appendHtml('<div class="latestError"></div>')}}},{key:"maybeDisableBuyButton",value:function maybeDisableBuyButton(){var button=this.findElement(".buyTemplate");if(!button){return false}var shouldDisable=false;this.contactForm.removeErrors();if(this.contactForm.hasEmptyRequiredFields()||!this.contactForm.isValid()||!this.contactForm.checkRequiredCheckboxes()){this.contactForm.showInlineErrors();shouldDisable=true}if(shouldDisable){button.setAttribute("disabled","disabled")}else{button.removeAttribute("disabled")}}},{key:"showBuyButton",value:function showBuyButton(){var html='<div><button type="submit" class="buyTemplate" disabled>'.concat(this.languageHelper.translate("BUTTON_BUY_NOW"),"</button></div>");this.appendHtml(html);this.findElement(".buyTemplate").addEventListener("click",this.buyTemplate.bind(this))}},{key:"showContactForm",value:function showContactForm(template){var _this45=this;return this.getContactForm(template).then(function(form){return form.generateForm({voucherQuantitySelector:true,quantityTerm:_this45.selectedTemplate.quantity_term})}).then(function(html){_this45.appendHtml(html);_this45.showBuyButton();_toConsumableArray(_this45.findElements('#number-of-vouchers, [name^="contactformulier"]')).forEach(function(el){el.addEventListener("change",_this45.maybeDisableBuyButton.bind(_this45))})})}},{key:"showTemplates",value:function showTemplates(templates){var _this46=this;var templateOptions=templates.map(function(template){return'<option value="'.concat(template.id,'">').concat(template.name," (").concat(_this46.formatPrice(template.price),")")});var html='<select class="recrasVoucherTemplates"><option>'.concat(templateOptions.join(""),"</select>");this.appendHtml('<div class="recras-voucher-templates">'.concat(html,"</div>"));var voucherSelectEl=this.findElement(".recrasVoucherTemplates");voucherSelectEl.addEventListener("change",function(){var selectedTemplateId=parseInt(voucherSelectEl.value,10);_this46.changeTemplate(selectedTemplateId)})}},{key:"totalPrice",value:function totalPrice(){return this.selectedTemplate.price*this.findElement("#number-of-vouchers").value}}]);return RecrasVoucher}();
|
package/docs/onlinebooking.html
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
console.log(params);
|
|
21
21
|
};
|
|
22
22
|
const recrasOptions = {
|
|
23
|
-
recras_hostname: '
|
|
23
|
+
recras_hostname: 'demo.recras.nl', // Required
|
|
24
24
|
element: document.getElementById('onlinebooking'), // Required
|
|
25
25
|
locale: 'nl_NL', // Optional, default is nl_NL. Valid values are de_DE, en_GB, nl_NL, sv_SE
|
|
26
26
|
//package_id: 7, // Optional, this will skip the package selection step for online booking
|
package/package.json
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@recras/online-booking-js",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "JS library for easy integration of Recras online booking and voucher sales",
|
|
5
5
|
"main": "dist/onlinebooking.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"
|
|
7
|
+
"_babelSrc": "babel tmp -d dist && rm tmp/*.js",
|
|
8
|
+
"_catFiles": "mkdir -p tmp && cat src/*.js > tmp/onlinebooking.js",
|
|
9
|
+
"build": "npm run _catFiles && npm run _babelSrc && npm run minify",
|
|
8
10
|
"jshint": "jshint src",
|
|
9
|
-
"test": "karma start test/js-unit/karma.conf.js --verbose",
|
|
10
11
|
"karma": "npm test",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
12
|
+
"minify": "./node_modules/uglify-js/bin/uglifyjs dist/onlinebooking.js -o dist/onlinebooking.min.js",
|
|
13
|
+
"test": "karma start test/js-unit/karma.conf.js --verbose"
|
|
13
14
|
},
|
|
14
15
|
"repository": {
|
|
15
16
|
"type": "git",
|
|
@@ -30,21 +31,22 @@
|
|
|
30
31
|
},
|
|
31
32
|
"homepage": "https://github.com/Recras/online-booking-js#readme",
|
|
32
33
|
"devDependencies": {
|
|
33
|
-
"@babel/cli": "7.
|
|
34
|
-
"@babel/core": "7.
|
|
35
|
-
"@babel/plugin-proposal-class-properties": "7.
|
|
36
|
-
"@babel/plugin-transform-arrow-functions": "7.
|
|
37
|
-
"@babel/plugin-transform-for-of": "7.
|
|
38
|
-
"@babel/plugin-transform-object-assign": "7.
|
|
39
|
-
"@babel/preset-env": "7.
|
|
34
|
+
"@babel/cli": "7.17.0",
|
|
35
|
+
"@babel/core": "7.17.0",
|
|
36
|
+
"@babel/plugin-proposal-class-properties": "7.16.7",
|
|
37
|
+
"@babel/plugin-transform-arrow-functions": "7.16.7",
|
|
38
|
+
"@babel/plugin-transform-for-of": "7.16.7",
|
|
39
|
+
"@babel/plugin-transform-object-assign": "7.16.7",
|
|
40
|
+
"@babel/preset-env": "7.16.11",
|
|
40
41
|
"babel-plugin-transform-es2017-object-entries": "0.0.5",
|
|
41
|
-
"jasmine-core": "
|
|
42
|
+
"jasmine-core": "4.0.1",
|
|
42
43
|
"jasmine-spec-reporter": "7.0.0",
|
|
43
|
-
"jshint": "2.13.
|
|
44
|
-
"karma": "6.3.
|
|
44
|
+
"jshint": "2.13.4",
|
|
45
|
+
"karma": "6.3.17",
|
|
45
46
|
"karma-chrome-launcher": "3.1.0",
|
|
46
|
-
"karma-firefox-launcher": "2.1.
|
|
47
|
-
"karma-jasmine": "4.0.
|
|
48
|
-
"karma-spec-reporter": "0.0.
|
|
47
|
+
"karma-firefox-launcher": "2.1.2",
|
|
48
|
+
"karma-jasmine": "4.0.2",
|
|
49
|
+
"karma-spec-reporter": "0.0.33",
|
|
50
|
+
"uglify-js": "3.15.3"
|
|
49
51
|
}
|
|
50
52
|
}
|
package/src/booking.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*******************************
|
|
2
2
|
* Recras integration library *
|
|
3
|
-
* v 1.
|
|
3
|
+
* v 1.11.0 *
|
|
4
4
|
*******************************/
|
|
5
5
|
|
|
6
6
|
class RecrasBooking {
|
|
@@ -318,7 +318,11 @@ class RecrasBooking {
|
|
|
318
318
|
RecrasEventHelper.PREFIX_BOOKING,
|
|
319
319
|
RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED,
|
|
320
320
|
selectedPackage[0].arrangement,
|
|
321
|
-
selectedPackage[0].id
|
|
321
|
+
selectedPackage[0].id,
|
|
322
|
+
{
|
|
323
|
+
content_type: 'package',
|
|
324
|
+
item_id: selectedPackage[0].id,
|
|
325
|
+
}
|
|
322
326
|
);
|
|
323
327
|
}
|
|
324
328
|
this.selectedPackage = selectedPackage[0];
|
|
@@ -1375,6 +1379,43 @@ ${ msgs[1] }</p></div>`);
|
|
|
1375
1379
|
return attachments;
|
|
1376
1380
|
}
|
|
1377
1381
|
|
|
1382
|
+
formatGA4Items() {
|
|
1383
|
+
let items = [];
|
|
1384
|
+
|
|
1385
|
+
if (this.bookingSize() > 0) {
|
|
1386
|
+
let pck = this.selectedPackage;
|
|
1387
|
+
items.push({
|
|
1388
|
+
item_name: (pck.weergavenaam || pck.arrangement),
|
|
1389
|
+
price: this.bookingSizePrice(pck),
|
|
1390
|
+
quantity: this.bookingSize(),
|
|
1391
|
+
});
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
let linesNoBookingSize = this.getLinesNoBookingSize(this.selectedPackage);
|
|
1395
|
+
linesNoBookingSize = linesNoBookingSize.filter(line => {
|
|
1396
|
+
const lineEl = this.findElement(`[data-package-id="${ line.id }"]`);
|
|
1397
|
+
if (!lineEl) {
|
|
1398
|
+
return false;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
if (isNaN(parseInt(lineEl.value))) {
|
|
1402
|
+
return false;
|
|
1403
|
+
}
|
|
1404
|
+
return parseInt(lineEl.value) > 0;
|
|
1405
|
+
});
|
|
1406
|
+
linesNoBookingSize = linesNoBookingSize.map(line => {
|
|
1407
|
+
const lineEl = this.findElement(`[data-package-id="${line.id}"]`);
|
|
1408
|
+
return {
|
|
1409
|
+
item_name: line.beschrijving_templated,
|
|
1410
|
+
price: line.product.verkoop,
|
|
1411
|
+
quantity: parseInt(lineEl.value),
|
|
1412
|
+
};
|
|
1413
|
+
});
|
|
1414
|
+
items.push(...linesNoBookingSize);
|
|
1415
|
+
|
|
1416
|
+
return items;
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1378
1419
|
submitBooking() {
|
|
1379
1420
|
let productCounts = this.productCounts().map(line => line.aantal);
|
|
1380
1421
|
let productSum = productCounts.reduce((a, b) => a + b, 0);
|
|
@@ -1432,7 +1473,12 @@ ${ msgs[1] }</p></div>`);
|
|
|
1432
1473
|
RecrasEventHelper.PREFIX_BOOKING,
|
|
1433
1474
|
RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT,
|
|
1434
1475
|
null,
|
|
1435
|
-
Math.round(this.getTotalPrice())
|
|
1476
|
+
Math.round(this.getTotalPrice()),
|
|
1477
|
+
{
|
|
1478
|
+
currency: this.languageHelper.currency,
|
|
1479
|
+
value: this.getTotalPrice(),
|
|
1480
|
+
items: this.formatGA4Items(),
|
|
1481
|
+
}
|
|
1436
1482
|
);
|
|
1437
1483
|
window.top.location.href = json.payment_url;
|
|
1438
1484
|
} else if (json.redirect) {
|
package/src/eventHelper.js
CHANGED
|
@@ -48,7 +48,26 @@ class RecrasEventHelper {
|
|
|
48
48
|
return this.eventsEnabled.includes(name);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
ga4EventMap(action) {
|
|
52
|
+
let map = {
|
|
53
|
+
[RecrasEventHelper.EVENT_BOOKING_PACKAGE_CHANGED]: 'select_content',
|
|
54
|
+
[RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT]: 'begin_checkout',
|
|
55
|
+
[RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED]: 'select_content',
|
|
56
|
+
[RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT]: 'begin_checkout',
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
if (map[action] === undefined) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return map[action];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
isGA4() {
|
|
66
|
+
const fn = window[window.GoogleAnalyticsObject || 'ga'];
|
|
67
|
+
return fn && fn.h && fn.h.gtm4;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
sendEvent(cat, action, label = undefined, value = undefined, ga4Value = undefined) {
|
|
52
71
|
let event;
|
|
53
72
|
|
|
54
73
|
try {
|
|
@@ -60,8 +79,11 @@ class RecrasEventHelper {
|
|
|
60
79
|
}
|
|
61
80
|
|
|
62
81
|
if (this.analyticsEnabled && this.eventEnabled(action)) {
|
|
63
|
-
if (
|
|
64
|
-
//
|
|
82
|
+
if (this.isGA4() && this.ga4EventMap(action) && ga4Value) {
|
|
83
|
+
// v4
|
|
84
|
+
this.sendGA4Event(this.ga4EventMap(action), ga4Value);
|
|
85
|
+
} else if (typeof window.gtag === 'function') {
|
|
86
|
+
// Global Site Tag (v3)
|
|
65
87
|
let eventData = {
|
|
66
88
|
event_category: RecrasEventHelper.PREFIX_GLOBAL + ':' + cat,
|
|
67
89
|
};
|
|
@@ -73,7 +95,7 @@ class RecrasEventHelper {
|
|
|
73
95
|
}
|
|
74
96
|
window.gtag('event', action, eventData);
|
|
75
97
|
} else if (typeof window.ga === 'function') {
|
|
76
|
-
// "Old" Google Analytics
|
|
98
|
+
// "Old" Google Analytics (v2) and Tag Manager
|
|
77
99
|
let eventData = {
|
|
78
100
|
hitType: 'event',
|
|
79
101
|
eventCategory: RecrasEventHelper.PREFIX_GLOBAL + ':' + cat,
|
|
@@ -92,13 +114,18 @@ class RecrasEventHelper {
|
|
|
92
114
|
prefix += '.';
|
|
93
115
|
}
|
|
94
116
|
window.ga(prefix + 'send', eventData);
|
|
95
|
-
})
|
|
117
|
+
});
|
|
96
118
|
}
|
|
97
119
|
}
|
|
98
120
|
|
|
99
121
|
return document.dispatchEvent(event);
|
|
100
122
|
}
|
|
101
123
|
|
|
124
|
+
sendGA4Event(action, data) {
|
|
125
|
+
const fn = window[window.GoogleAnalyticsObject || 'ga'];
|
|
126
|
+
fn('event', action, data);
|
|
127
|
+
}
|
|
128
|
+
|
|
102
129
|
setAnalytics(bool) {
|
|
103
130
|
this.analyticsEnabled = bool;
|
|
104
131
|
}
|
package/src/vouchers.js
CHANGED
|
@@ -43,6 +43,16 @@ class RecrasVoucher {
|
|
|
43
43
|
this.element.insertAdjacentHTML('beforeend', msg);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
formatGA4Item() {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
item_name: this.selectedTemplate.name,
|
|
50
|
+
price: this.selectedTemplate.price,
|
|
51
|
+
quantity: parseInt(this.findElement('#number-of-vouchers').value),
|
|
52
|
+
}
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
|
|
46
56
|
buyTemplate() {
|
|
47
57
|
let status = this.contactForm.checkRequiredCheckboxes();
|
|
48
58
|
if (!status) {
|
|
@@ -72,7 +82,12 @@ class RecrasVoucher {
|
|
|
72
82
|
RecrasEventHelper.PREFIX_VOUCHER,
|
|
73
83
|
RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT,
|
|
74
84
|
null,
|
|
75
|
-
Math.round(this.totalPrice())
|
|
85
|
+
Math.round(this.totalPrice()),
|
|
86
|
+
{
|
|
87
|
+
currency: this.languageHelper.currency,
|
|
88
|
+
value: this.totalPrice(),
|
|
89
|
+
items: this.formatGA4Item(),
|
|
90
|
+
}
|
|
76
91
|
);
|
|
77
92
|
window.top.location.href = json.payment_url;
|
|
78
93
|
} else {
|
|
@@ -94,7 +109,11 @@ class RecrasVoucher {
|
|
|
94
109
|
RecrasEventHelper.PREFIX_VOUCHER,
|
|
95
110
|
RecrasEventHelper.EVENT_VOUCHER_TEMPLATE_CHANGED,
|
|
96
111
|
null,
|
|
97
|
-
templateID
|
|
112
|
+
templateID,
|
|
113
|
+
{
|
|
114
|
+
content_type: 'voucher',
|
|
115
|
+
item_id: templateID,
|
|
116
|
+
}
|
|
98
117
|
);
|
|
99
118
|
}
|
|
100
119
|
|