@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  [![Build Status](https://travis-ci.org/Recras/online-booking-js.svg?branch=master)](https://travis-ci.org/Recras/online-booking-js)
2
2
 
3
3
  # Recras JS Integration Library
4
- Version: 1.10.3
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
 
@@ -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.10.3 *
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 _this28 = this;
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
- _this28.eventHelper.sendEvent(RecrasEventHelper.PREFIX_BOOKING, RecrasEventHelper.EVENT_BOOKING_REDIRECT_PAYMENT, null, Math.round(_this28.getTotalPrice()));
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
- _this28.findElement('.recras-amountsform').reset();
1786
+ _this29.findElement('.recras-amountsform').reset();
1738
1787
 
1739
- _this28.findElement('.recras-datetime').reset();
1788
+ _this29.findElement('.recras-datetime').reset();
1740
1789
 
1741
- _this28.findElement('.recras-contactform').reset();
1790
+ _this29.findElement('.recras-contactform').reset();
1742
1791
 
1743
- _this28.element.scrollIntoView({
1792
+ _this29.element.scrollIntoView({
1744
1793
  behavior: 'smooth'
1745
1794
  });
1746
1795
 
1747
- _this28.element.insertAdjacentHTML('afterbegin', "<p class=\"recras-success\">".concat(json.message, "</p>"));
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
- _this28.loadingIndicatorHide();
1801
+ _this29.loadingIndicatorHide();
1753
1802
 
1754
- _this28.findElement('.bookPackage').removeAttribute('disabled');
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 _this29 = this;
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
- _this29.showTotalPrice();
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 _this30 = this;
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
- _this30.loadingIndicatorHide();
1901
+ _this31.loadingIndicatorHide();
1853
1902
 
1854
1903
  if (datePickerEl.value && availableDays.indexOf(datePickerEl.value) === -1) {
1855
1904
  datePickerEl.value = '';
1856
1905
 
1857
- _this30.clearTimes();
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 _this31 = this;
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, _this31.error.bind(_this31));
2031
+ return RecrasHttpHelper.fetchJson(url, _this32.error.bind(_this32));
1983
2032
  };
1984
2033
 
1985
2034
  this.postJson = function (url, data) {
1986
- return RecrasHttpHelper.postJson(_this31.options.getApiBase() + url, data, _this31.error.bind(_this31));
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 _this32 = this;
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(_this32.languageHelper.translate('CONTACT_FORM_CHECKBOX_REQUIRED'), "</div>"));
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 _this33 = this;
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 = _this33.isStandalone(extraOptions);
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 += _this33.quantitySelector(extraOptions.quantityTerm);
2130
+ html += _this34.quantitySelector(extraOptions.quantityTerm);
2082
2131
  }
2083
2132
 
2084
- _this33.contactFormFields.forEach(function (field, idx) {
2085
- html += '<div>' + _this33.showField(field, idx) + '</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 += _this33.submitButtonHtml();
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 _this34 = this;
2173
+ var _this35 = this;
2125
2174
 
2126
2175
  return this.fetchJson(this.options.getApiBase() + 'contactformulieren/' + this.options.getFormId() + '?embed=Velden').then(function (form) {
2127
- _this34.contactFormFields = form.Velden;
2128
- _this34.packages = _this34.sortPackages(form.Arrangementen);
2129
- return _this34.contactFormFields;
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 _this35 = this;
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
- _this35.countries = json;
2139
- return _this35.countries;
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 _this36 = this;
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(_this36.languageHelper.translate(_this36.GENDERS[key]));
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() === _this36.options.getDefaultCountry() ? 'selected' : '';
2382
- html += "<option value=\"".concat(code, "\" ").concat(selectedText, ">").concat(_this36.countries[code]);
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 _this37 = this;
2511
+ var _this38 = this;
2463
2512
 
2464
2513
  this.loadingIndicatorShow(this.element);
2465
2514
  return this.getContactFormFields().then(function () {
2466
- return _this37.generateForm({
2515
+ return _this38.generateForm({
2467
2516
  standalone: true
2468
2517
  });
2469
2518
  }).then(function (html) {
2470
- _this37.appendHtml(html);
2519
+ _this38.appendHtml(html);
2471
2520
 
2472
- _toConsumableArray(_this37.findElements('.checkboxGroupRequired')).forEach(function (group) {
2521
+ _toConsumableArray(_this38.findElements('.checkboxGroupRequired')).forEach(function (group) {
2473
2522
  _toConsumableArray(group.querySelectorAll('input')).forEach(function (el) {
2474
- el.addEventListener('change', _this37.checkRequiredCheckboxes.bind(_this37));
2523
+ el.addEventListener('change', _this38.checkRequiredCheckboxes.bind(_this38));
2475
2524
  });
2476
2525
  });
2477
2526
 
2478
- _this37.findElement('.recras-contactform').addEventListener('submit', _this37.submitForm.bind(_this37));
2527
+ _this38.findElement('.recras-contactform').addEventListener('submit', _this38.submitForm.bind(_this38));
2479
2528
 
2480
- if (_this37.hasBookingDateField()) {
2529
+ if (_this38.hasBookingDateField()) {
2481
2530
  var pikadayOptions = _extends(RecrasCalendarHelper.defaultOptions(), {
2482
- field: _this37.findElement('[data-identifier="boeking.datum"]'),
2483
- i18n: RecrasCalendarHelper.i18n(_this37.languageHelper),
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 (_this37.hasRelationDateField()) {
2491
- var fields = _this37.getRelationExtraDateFields();
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(_this37.languageHelper),
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 = _this37.findElement("[data-identifier=\"".concat(field.field_identifier, "\"]"));
2554
+ _pikadayOptions.field = _this38.findElement("[data-identifier=\"".concat(field.field_identifier, "\"]"));
2506
2555
  new Pikaday(_pikadayOptions);
2507
2556
  }
2508
2557
  }
2509
2558
 
2510
- _this37.loadingIndicatorHide();
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 _this38 = this;
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 (_this38.options.getRedirectUrl()) {
2585
- window.top.location.href = _this38.options.getRedirectUrl();
2633
+ if (_this39.options.getRedirectUrl()) {
2634
+ window.top.location.href = _this39.options.getRedirectUrl();
2586
2635
  } else {
2587
- _this38.element.scrollIntoView({
2636
+ _this39.element.scrollIntoView({
2588
2637
  behavior: 'smooth'
2589
2638
  });
2590
2639
 
2591
- _this38.element.insertAdjacentHTML('afterbegin', "<p class=\"recras-success\">".concat(_this38.languageHelper.translate('CONTACT_FORM_SUBMIT_SUCCESS'), "</p>"));
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
- _this38.error(_this38.languageHelper.translate('CONTACT_FORM_SUBMIT_FAILED'));
2645
+ _this39.error(_this39.languageHelper.translate('CONTACT_FORM_SUBMIT_FAILED'));
2597
2646
  }
2598
2647
 
2599
2648
  submitButton.removeAttribute('disabled');
2600
2649
 
2601
- _this38.loadingIndicatorHide();
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 (typeof window.gtag === 'function') {
2774
- // Global Site Tag - the more modern variant
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 _this39 = this;
3429
+ var _this40 = this;
3352
3430
 
3353
3431
  var errorHandler = function errorHandler(err) {
3354
- _this39.currency = 'eur';
3432
+ _this40.currency = 'eur';
3355
3433
 
3356
- _this39.error(err);
3434
+ _this40.error(err);
3357
3435
  };
3358
3436
 
3359
3437
  return RecrasHttpHelper.fetchJson(this.options.getApiBase() + 'instellingen/currency', errorHandler).then(function (setting) {
3360
- _this39.currency = setting.waarde;
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 _this40 = this;
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, _this40.error);
3681
+ return RecrasHttpHelper.fetchJson(url, _this41.error);
3604
3682
  };
3605
3683
 
3606
3684
  this.postJson = function (url, data) {
3607
- return RecrasHttpHelper.postJson(_this40.options.getApiBase() + url, data, _this40.error);
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 _this40.getVoucherTemplates();
3701
+ return _this41.getVoucherTemplates();
3624
3702
  }).then(function (templates) {
3625
- if (_this40.options.getVoucherTemplateId()) {
3626
- _this40.changeTemplate(_this40.options.getVoucherTemplateId());
3703
+ if (_this41.options.getVoucherTemplateId()) {
3704
+ _this41.changeTemplate(_this41.options.getVoucherTemplateId());
3627
3705
  } else {
3628
- _this40.showTemplates(templates);
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 _this41 = this;
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
- _this41.eventHelper.sendEvent(RecrasEventHelper.PREFIX_VOUCHER, RecrasEventHelper.EVENT_VOUCHER_REDIRECT_PAYMENT, null, Math.round(_this41.totalPrice()));
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
- _this41.findElement('.buyTemplate').removeAttribute('disabled');
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 _this42 = this;
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
- _this42.contactForm = contactForm;
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 _this43 = this;
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
- _this43.templates = templates;
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 _this44 = this;
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: _this44.selectedTemplate.quantity_term
3890
+ quantityTerm: _this45.selectedTemplate.quantity_term
3797
3891
  });
3798
3892
  }).then(function (html) {
3799
- _this44.appendHtml(html);
3893
+ _this45.appendHtml(html);
3800
3894
 
3801
- _this44.showBuyButton();
3895
+ _this45.showBuyButton();
3802
3896
 
3803
- _toConsumableArray(_this44.findElements('#number-of-vouchers, [name^="contactformulier"]')).forEach(function (el) {
3804
- el.addEventListener('change', _this44.maybeDisableBuyButton.bind(_this44));
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 _this45 = this;
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(_this45.formatPrice(template.price), ")");
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
- _this45.changeTemplate(selectedTemplateId);
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>&nbsp;</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}();
@@ -20,7 +20,7 @@
20
20
  console.log(params);
21
21
  };
22
22
  const recrasOptions = {
23
- recras_hostname: 'staging-7164-boek-3v9yx2.recras.nl', // Required
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.10.3",
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
- "build": "npm run _catFiles && npm run _babelSrc",
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
- "_babelSrc": "babel tmp -d dist && rm tmp/*.js",
12
- "_catFiles": "mkdir -p tmp && cat src/*.js > tmp/onlinebooking.js"
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.14.5",
34
- "@babel/core": "7.14.6",
35
- "@babel/plugin-proposal-class-properties": "7.14.5",
36
- "@babel/plugin-transform-arrow-functions": "7.14.5",
37
- "@babel/plugin-transform-for-of": "7.14.5",
38
- "@babel/plugin-transform-object-assign": "7.14.5",
39
- "@babel/preset-env": "7.14.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": "3.7.1",
42
+ "jasmine-core": "4.0.1",
42
43
  "jasmine-spec-reporter": "7.0.0",
43
- "jshint": "2.13.0",
44
- "karma": "6.3.4",
44
+ "jshint": "2.13.4",
45
+ "karma": "6.3.17",
45
46
  "karma-chrome-launcher": "3.1.0",
46
- "karma-firefox-launcher": "2.1.1",
47
- "karma-jasmine": "4.0.1",
48
- "karma-spec-reporter": "0.0.32"
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.10.3 *
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) {
@@ -48,7 +48,26 @@ class RecrasEventHelper {
48
48
  return this.eventsEnabled.includes(name);
49
49
  }
50
50
 
51
- sendEvent(cat, action, label = undefined, value = undefined) {
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 (typeof window.gtag === 'function') {
64
- // Global Site Tag - the more modern variant
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