UNPKG

@qite/tide-booking-component

Version:

React Booking wizard & Booking product component for Tide

1,645 lines (1,547 loc) 655 kB
/* eslint-disable */ import React, { useLayoutEffect as useLayoutEffect$1, useEffect, useContext, useState, useRef } from 'react'; import JsonURL from '@jsonurl/jsonurl'; import { isToday, getDate, getYear, getMonth, startOfWeek, startOfMonth, endOfWeek, addWeeks, endOfMonth, eachDayOfInterval, format as format$1, getISOWeek, getISODay, isSameMonth, startOfDay, isAfter, isEqual, isWithinInterval, endOfDay, isBefore, addMonths, addDays, formatISO, differenceInYears, parseISO, differenceInMinutes, differenceInCalendarDays, parse } from 'date-fns'; import { isNil, isArray, compact, isEmpty, range, chunk, isFunction, clamp, omit, sum, first, orderBy, uniq, uniqBy, sortBy, last, findIndex, set, get as get$2 } from 'lodash'; import { nlBE, fr } from 'date-fns/locale'; import { usePopper } from 'react-popper'; import { useSelector, useDispatch, Provider } from 'react-redux'; import { navigate, Link, useLocation, Router } from '@reach/router'; import { createSlice, createSelector, createAsyncThunk, configureStore } from '@reduxjs/toolkit'; import flat from 'flat'; import { useFormik } from 'formik'; import produce from 'immer'; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __awaiter$1(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator$1(thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } function __spreadArray(to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; var STEPS$1 = { PERSONAL_DETAILS: "Coordonnées personnelles", EXTRA_OPTIONS: "Options de voyage", SUMMARY: "Récapitulatif", CONFIRMATION: "Confirmation", ERROR: "Échec de réservation", PREVIOUS: "Étape précédente", NEXT: "Étape suivante", SUBMIT_BOOKING: "Confirmer la réservation", SUBMIT_OFFER: "Demander un devis", COMPOSE: "Composer", ROOM_OPTIONS: "Options de chambre", FLIGHT_OPTIONS: "Options de vol" }; var INPUT$1 = { INCREASE: "Augmenter", DECREASE: "Diminuer" }; var FLIGHTS_FORM$1 = { OUTWARD_FLIGHTS: "Vols aller", OUTWARD_FLIGHT: "Vol aller", RETURN_FLIGHTS: "Vols retour", RETURN_FLIGHT: "Vol retour", DIRECT_FLIGHT: "Vol direct", STOP: "escale", STOPS: "escales", FLIGHT_STOPS: "escale(s)", DIFFERENT_OPTION_WARNING: "Attention : Ce vol modifie la durée du séjour.", FILTER_OPTIONS: "Options de filtre", AIRLINES: "Compagnies aériennes", AIRPORTS: "Aéroports", NUMBER_OF_STOPS: "Nombre d'escales", FLIGHT_OUTWARD: "Vol aller", DEPARTURE_TIME: "Heure de départ", TRAVEL_DURATION: "Durée du voyage", CHANGE_TIME: "Temps de correspondance", FLIGHT_RETURN: "Vol retour", NO_FLIGHTS_FOUND: "Aucun vol trouvé.", STARTING: "À partir de", LOWEST_PRICE: "Prix le plus bas", CHOOSE_YOUR_CLASS: "Choisissez votre classe :", PLUS_ONE_DAY: "+1 jour", STOP_TIME: "Temps d'escale", NIGHT_DEPARTURE: "Nuit (00:00 - 05:00)", MORNING_DEPARTURE: "Matin (05:00 - 12:00)", AFTERNOON_DEPARTURE: "Après-midi (12:00 - 18:00)", EVENING_DEPARTURE: "Soir (18:00 - 00:00)", FLIGHTS_FOUND_1: "", FLIGHTS_FOUND_2: "vols", FLIGHTS_FOUND_3: "trouvés" }; var PRODUCT$1 = { STAY_INCLUDED: "Séjour inclus", FLIGHT_INCLUDED: "Vol inclus", TRANSFER_INCLUDED: "Transfert inclus", LOADING_PRICE: "Votre prix est en cours de composition.", PER_PERSON: "Par personne", PER_NIGHT: "Par nuit", PER_PERSON_PER_NIGHT: "Par personne / par nuit", BOOK_NOW: "Réserver maintenant", TO_YOUR_OFFER: "Vers votre devis", NOT_AVAILABLE: "Non disponible", NUMBER_OF_ROOMS: "Nombre de chambres", AGE_BY_DEPARTURE_DATE: "Âge des enfants à la date de départ", YEAR: "Année", APPLY: "Appliquer", EDIT: "Modifier", DEPARTURE: "Départ", DEPARTURE_DATE: "Date de départ", RETURN: "Retour", RETURN_DATE: "Date de retour", WHO_YOU_TRAVELING_WITH: "Avec qui voyagez-vous ?", TRAVEL_PERIOD: "Période de voyage", CLOSE: "Fermer" }; var MAIN$1 = { PREPARING_BOOKING: "Veuillez patienter, nous préparons votre réservation", PREPARING_OFFER: "Veuillez patienter, nous préparons votre devis", PRODUCT_UNAVAILABLE: "Produit non disponible" }; var SHARED$1 = { ROOM: "Chambre", ROOMS: "Chambres", TOTAL_PRICE: "Prix total", ADULTS: "Adultes", CHILDREN: "Enfants", SELECT: "Sélectionner", SELECTED: "Sélectionné" }; var SIDEBAR$1 = { OVERVIEW: "Aperçu", SLIDE_TOTAL_PRICE: "Montant total : ", SLIDE_DEPOSIT: "Acompte à payer : ", TRAVEL_INFO: "Informations de voyage", TRAVELERS: "Personnes", TRAVELERS_ADULTS: "adultes", TRAVELERS_ADULT: "adulte", TRAVELERS_CHILDREN: "enfants", TRAVELERS_CHILD: "enfant", DEPARTURE: "Aller", DEPARTURE_SINGLE: "Date", ARRIVAL: "Retour", FLIGHT: "Vol", ACCOMMODATION: "Hébergement réservé", BASE_PRICE: "Prix de base", OPTIONS: "Options", INCLUDED_COSTS: "Coûts inclus", EXTRA_COSTS: "Coûts supplémentaires", DEPOSIT: "Acompte à payer", DEPOSIT_TEXT1: "Les étapes pour le ", DEPOSIT_TEXT2: "solde restant", DEPOSIT_TEXT3: " de ", DEPOSIT_TEXT4: " sont détaillées à l'étape ", DEPOSIT_TEXT5: "3 (\"récapitulatif\")", DEPOSIT_TEXT6: " du processus de réservation.", LUGGAGE_INCLUDED: "Bagages inclus", DEPARTURE_FLIGHT: "Vol aller", ARRIVAL_FLIGHT: "Vol retour", FLIGHT_DEPARTURE: "Départ", FLIGHT_ARRIVAL: "Arrivée", ON_REQUEST: "Sur demande", CHANGES: "correspondances" }; var TRAVELERS_FORM$1 = { TRAVELER: "Voyageur", ADULT: "adulte", ADULTS: "adultes", CHILD: "enfant", CHILDREN: "enfants", GENDER: "Titre", MALE: "Monsieur", FEMALE: "Madame", OTHER: "Autre", MAIN_BOOKER: "Principal réservant", FIRST_NAME: "Prénom", LAST_NAME: "Nom", BIRTHDATE: "Date de naissance", STREET: "Rue", STREET_PLACEHOLDER: "Votre rue", HOUSE_NUMBER: "N°", POST_BOX: "Boîte", ZIPCODE: "Code postal", CITY: "Ville", CITY_PLACEHOLDER: "Ville", COUNTRY: "Pays", SELECT_COUNTRY: "Sélectionner le pays", PHONE: "Numéro de téléphone", EMAIL: "E-mail", REPEAT_EMAIL: "Répéter l'e-mail", VALIDATION_MESSAGE: "Veuillez vérifier les champs du formulaire ci-dessous et remplissez-les correctement.", BOOK_WITH_AGENT: "Je souhaite réserver auprès de mon agent de voyage local", CHOOSE_OFFICE: "Je choisis une agence", COUNTRIES: { BELGIUM: "Belgique", NETHERLANDS: "Pays-Bas", FRANCE: "France" }, CHOOSE_AGENT_PLACEHOLDER: "Choisissez votre agent de voyage", VALIDATION: { TRAVELER_X_FIELD: "Chambre {0} - Voyageur {1} : {2}", TRAVELER_X_IS_NO_ADULT: "Chambre {0} - Voyageur {1} : n'est pas un adulte", TRAVELER_X_IS_NO_CHILD: "Chambre {0} - Voyageur {1} : n'est pas un enfant", NO_MAIN_BOOKER_SELECTED: "Aucun réservant principal n'a été sélectionné", MAIN_BOOKER_FIELD: "Principal réservant : {0}", MAIN_BOOKER_EMAIL_IS_INVALID: "Principal réservant : e-mail invalide", MAIN_BOOKER_EMAIL_DOES_NOT_MATCH: "Principal réservant : e-mail ne correspond pas", AGENT_IS_REQUIRED: "Agent de voyage requis" } }; var OPTIONS_FORM$1 = { NO_OPTIONS_TITLE: "Aucune option", NO_OPTIONS_MESSAGE: "Ce voyage n'a pas d'options supplémentaires.", UNIT_TITLE: "Groupe", PACKAGE: "Forfait", DAY: "jour", DAYS: "jours", NIGHT: "nuit", NIGHTS: "nuits", PER_PAX_TITLE: "Sélectionner les options par voyageur", PER_BOOKING_TITLE: "Sélectionner les options par dossier", PER_UNIT_TITLE: "Sélectionner les options par groupe", NONE: "Aucune" }; var ROOM_OPTIONS_FORM$1 = { TRAVELER_GROUP: "Groupe de voyageurs", ALTERNATIVES_TRAVELER_GROUP: "Options de chambre alternatives pour le groupe de voyageurs", SHOW_ALTERNATIVES: "Afficher les options de chambre alternatives" }; var SUMMARY$1 = { PERSONAL_DETAILS: "Coordonnées personnelles", TRAVELERS: "voyageurs", TRAVELER: "voyageur", ADULTS: "adultes", ADULT: "adulte", CHILDREN: "enfants", CHILD: "enfant", MAIN_BOOKER: "Principal réservant", NOTIFICATIONS_TITLE: "Attention", VALIDATE_TITLE: "Vérifiez vos données", VALIDATE_TEXT_BOOKING: "Vous êtes sur le point de confirmer votre réservation. Veuillez vérifier que toutes les informations sont correctes et que les noms sont tels qu'ils apparaissent sur votre carte d'identité ou votre passeport. Elles sont définitives et ne peuvent plus être modifiées.", VALIDATE_TEXT_OFFER: "Vous êtes sur le point de demander un devis. Veuillez vérifier que toutes les informations sont correctes et que les noms sont tels qu'ils apparaissent sur votre carte d'identité ou votre passeport. Cela nous permettra d'éviter les problèmes en cas de réservation.", OPTIONS: "Options", REMARKS: "Remarques", VOUCHERS: "Bons", VOUCHER_VALIDATE: "Valider le bon", ADD_VOUCHER: "Ajouter un bon", VOUCHER_VALID: "Bon valide", VOUCHER_INVALID: "Bon invalide" }; var CONFIRMATION$1 = { TITLE_TEXT_OFFER: "Votre devis numéro {0} a été demandé", TITLE_TEXT_BOOKING: "Votre réservation avec le numéro {0} est confirmée", MESSAGE_TEXT1: "Votre voyage de rêve est maintenant très proche.", MESSAGE_TEXT2_OFFER: "Nos spécialistes voyages traitent votre demande et vous contacteront dans les 48 heures.", MESSAGE_TEXT2_BOOKING: "Nos spécialistes voyages traitent votre réservation et vous contacteront dans les 48 heures.", QUESTIONS_TEXT1: "Avez-vous d'autres questions? ", QUESTIONS_TEXT2: "Faites-le nous savoir", QUESTIONS_TEXT3: ".", QUESTIONS_ALT: "Contactez-nous", MAIL_SUBJECT: "Infos réservation" }; var ERROR$1 = { TRY_AGAIN: "Réessayez de réserver", MESSAGE_TEXT1: "Une erreur s'est produite lors de la confirmation de votre voyage.", MESSAGE_TEXT2: "Cliquez ci-dessous pour réessayer.", ERROR_TEXT1: "Si le problème persiste, ", ERROR_TEXT2: "faites-le nous savoir", ERROR_TEXT3: ".", ERROR_ALT: "Contactez-nous" }; var frJson = { STEPS: STEPS$1, INPUT: INPUT$1, FLIGHTS_FORM: FLIGHTS_FORM$1, PRODUCT: PRODUCT$1, MAIN: MAIN$1, SHARED: SHARED$1, SIDEBAR: SIDEBAR$1, TRAVELERS_FORM: TRAVELERS_FORM$1, OPTIONS_FORM: OPTIONS_FORM$1, ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM$1, SUMMARY: SUMMARY$1, CONFIRMATION: CONFIRMATION$1, ERROR: ERROR$1 }; var STEPS = { PERSONAL_DETAILS: "Persoonlijke gegevens", EXTRA_OPTIONS: "Extra opties", SUMMARY: "Overzicht", CONFIRMATION: "Bevestiging", ERROR: "Boeken mislukt", PREVIOUS: "Vorige stap", NEXT: "Volgende stap", SUBMIT_BOOKING: "Bevestig boeking", SUBMIT_OFFER: "Vraag offerte aan", COMPOSE: "Samenstellen", ROOM_OPTIONS: "Kamer opties", FLIGHT_OPTIONS: "Vlucht opties" }; var INPUT = { INCREASE: "Verhogen", DECREASE: "Verminderen" }; var FLIGHTS_FORM = { OUTWARD_FLIGHTS: "Heenvluchten", OUTWARD_FLIGHT: "Heenvlucht", RETURN_FLIGHTS: "Retourvluchten", RETURN_FLIGHT: "Retourvlucht", DIRECT_FLIGHT: "Directe vlucht", STOP: "stop", STOPS: "stops", FLIGHT_STOPS: "tussenstop(s)", DIFFERENT_OPTION_WARNING: "Opgelet: Met deze vlucht veranderd de verblijfsduur.", FILTER_OPTIONS: "Filter opties", AIRLINES: "Luchtvaartmaatschappijen", AIRPORTS: "Luchthavens", NUMBER_OF_STOPS: "Aantal stops", FLIGHT_OUTWARD: "Vlucht heenreis", DEPARTURE_TIME: "Vertrektijd", TRAVEL_DURATION: "Reisduur", CHANGE_TIME: "Overstaptijd", FLIGHT_RETURN: "Vlucht terugreis", NO_FLIGHTS_FOUND: "Geen vluchten gevonden.", STARTING: "Vanaf", LOWEST_PRICE: "Laagste prijs", CHOOSE_YOUR_CLASS: "Kies uw klasse:", PLUS_ONE_DAY: "+1 dag", STOP_TIME: "Overstaptijd", NIGHT_DEPARTURE: "Nacht (00:00 - 05:00)", MORNING_DEPARTURE: "Ochtend (05:00 - 12:00)", AFTERNOON_DEPARTURE: "Namiddag (12:00 - 18:00)", EVENING_DEPARTURE: "Avond (18:00 - 00:00)", FLIGHTS_FOUND_1: "Er zijn", FLIGHTS_FOUND_2: "vluchten", FLIGHTS_FOUND_3: "gevonden" }; var PRODUCT = { STAY_INCLUDED: "Inclusief verblijf", FLIGHT_INCLUDED: "Inclusief vlucht", TRANSFER_INCLUDED: "Inclusief transfer", LOADING_PRICE: "Uw prijs wordt samengesteld.", PER_PERSON: "Per persoon", PER_NIGHT: "Per nacht", PER_PERSON_PER_NIGHT: "Per persoon / per nacht", BOOK_NOW: "Boek nu", TO_YOUR_OFFER: "Naar uw offerte", NOT_AVAILABLE: "Niet beschikbaar", NUMBER_OF_ROOMS: "Aantal kamers", AGE_BY_DEPARTURE_DATE: "Leeftijd kinderen op vertrekdatum", YEAR: "Jaar", APPLY: "Toepassen", EDIT: "Wijzigen", DEPARTURE: "Vertrek", DEPARTURE_DATE: "Vertrekdatum", RETURN: "Terugkeer", RETURN_DATE: "Terugkeerdatum", WHO_YOU_TRAVELING_WITH: "Met wie ga je?", TRAVEL_PERIOD: "Reisperiode", CLOSE: "Sluiten" }; var MAIN = { PREPARING_BOOKING: "Even geduld, we bereiden uw boeking voor", PREPARING_OFFER: "Even geduld, we bereiden uw offerte voor", PRODUCT_UNAVAILABLE: "Product niet beschikbaar" }; var SHARED = { ROOM: "Kamer", ROOMS: "Kamers", TOTAL_PRICE: "Totale prijs", ADULTS: "Volwassenen", CHILDREN: "Kinderen", SELECT: "Selecteer", SELECTED: "Geselecteerd" }; var SIDEBAR = { OVERVIEW: "Overzicht", SLIDE_TOTAL_PRICE: "Totaalbedrag: ", SLIDE_DEPOSIT: "Te betalen voorschot: ", TRAVEL_INFO: "Gegevens", TRAVELERS: "Personen", TRAVELERS_ADULTS: "volwassenen", TRAVELERS_ADULT: "volwassene", TRAVELERS_CHILDREN: "kinderen", TRAVELERS_CHILD: "kind", DEPARTURE: "Heenreis", DEPARTURE_SINGLE: "Datum", ARRIVAL: "Terugreis", FLIGHT: "Vlucht", ACCOMMODATION: "Geboekt", BASE_PRICE: "Basisprijs", OPTIONS: "Opties", INCLUDED_COSTS: "Inbegrepen", EXTRA_COSTS: "Bijkomende kosten", DEPOSIT: "Te betalen voorschot", DEPOSIT_TEXT1: "De te nemen stappen voor het ", DEPOSIT_TEXT2: "restbedrag", DEPOSIT_TEXT3: " van ", DEPOSIT_TEXT4: " wordt op ", DEPOSIT_TEXT5: "stap 3 (\"overzicht\")", DEPOSIT_TEXT6: " in het boekingsproces beschreven.", LUGGAGE_INCLUDED: "Inclusief bagage", DEPARTURE_FLIGHT: "Vlucht heenreis", ARRIVAL_FLIGHT: "Vlucht terugreis", FLIGHT_DEPARTURE: "Vertrek", FLIGHT_ARRIVAL: "Aankomst", ON_REQUEST: "Op aanvraag", CHANGES: "overstappen" }; var TRAVELERS_FORM = { TRAVELER: "Reiziger", ADULT: "volwassene", ADULTS: "volwassenen", CHILD: "kind", CHILDREN: "kinderen", GENDER: "Aanspreking", MALE: "Meneer", FEMALE: "Mevrouw", OTHER: "Anders", MAIN_BOOKER: "Hoofdboeker", FIRST_NAME: "Voornaam", LAST_NAME: "Naam", BIRTHDATE: "Geboortedatum", STREET: "Straat", STREET_PLACEHOLDER: "Jouw straat", HOUSE_NUMBER: "Huisnr", POST_BOX: "Bus", ZIPCODE: "Postcode", CITY: "Plaats", CITY_PLACEHOLDER: "Plaats", COUNTRY: "Land", SELECT_COUNTRY: "Selecteer land", PHONE: "Telefoonnummer", EMAIL: "E-mail", REPEAT_EMAIL: "Herhaal e-mail", VALIDATION_MESSAGE: "Controleer onderstaande velden in het formulier en vul deze correct in.", BOOK_WITH_AGENT: "Ik wens te boeken bij mijn lokale reisagent", CHOOSE_OFFICE: "Ik kies een kantoor", COUNTRIES: { BELGIUM: "België", NETHERLANDS: "Nederland", FRANCE: "Frankrijk" }, CHOOSE_AGENT_PLACEHOLDER: "Kies uw reisagent", VALIDATION: { TRAVELER_X_FIELD: "Kamer {0} - Reiziger {1}: {2}", TRAVELER_X_IS_NO_ADULT: "Kamer {0} - Reiziger {1}: is geen volwassene", TRAVELER_X_IS_NO_CHILD: "Kamer {0} - Reiziger {1}: is geen kind", NO_MAIN_BOOKER_SELECTED: "Er werd geen hoofdboeker geselecteerd", MAIN_BOOKER_FIELD: "Hoofdboeker: {0}", MAIN_BOOKER_EMAIL_IS_INVALID: "Hoofdboeker: e-mail is ongeldig", MAIN_BOOKER_EMAIL_DOES_NOT_MATCH: "Hoofdboeker: e-mail komt niet overeen", AGENT_IS_REQUIRED: "Reisagent is verplicht" } }; var OPTIONS_FORM = { NO_OPTIONS_TITLE: "Geen opties", NO_OPTIONS_MESSAGE: "Deze reis heeft geen bijkomende opties.", UNIT_TITLE: "Gezelschap", PACKAGE: "Pakket", DAY: "dag", DAYS: "dagen", NIGHT: "nacht", NIGHTS: "nachten", PER_PAX_TITLE: "Opties per reiziger selecteren", PER_BOOKING_TITLE: "Opties per dossier selecteren", PER_UNIT_TITLE: "Opties per gezelschap selecteren", NONE: "Geen" }; var ROOM_OPTIONS_FORM = { TRAVELER_GROUP: "Reisgezelschap", ALTERNATIVES_TRAVELER_GROUP: "Alternatieve kameropties voor reisgezelschap", SHOW_ALTERNATIVES: "Toon alternatieve kameropties" }; var SUMMARY = { PERSONAL_DETAILS: "Persoonlijke gegevens", TRAVELERS: "reizigers", TRAVELER: "reiziger", ADULTS: "volwassenen", ADULT: "volwassene", CHILDREN: "kinderen", CHILD: "kind", MAIN_BOOKER: "Hoofdboeker", NOTIFICATIONS_TITLE: "Aandacht", VALIDATE_TITLE: "Controleer je gegevens", VALIDATE_TEXT_BOOKING: "Je staat op het punt je boeking te bevestigen. Controleer of alle gegevens correct zijn en de namen zoals vermeld op je identiteitskaart of paspoort gebruikt worden. Deze zijn definitief en niet meer aanpasbaar.", VALIDATE_TEXT_OFFER: "Je staat op het punt een offerte aan te vragen. Controleer of alle gegevens correct zijn en de namen zoals vermeld op je identiteitskaart of paspoort gebruikt worden. Zo vermijden we problemen bij een eventuele boeking.", OPTIONS: "Opties", REMARKS: "Opmerkingen", VOUCHERS: "Vouchers", VOUCHER_VALIDATE: "Valideer voucher", ADD_VOUCHER: "Voucher toevoegen", VOUCHER_VALID: "Voucher is geldig", VOUCHER_INVALID: "Voucher is niet geldig" }; var CONFIRMATION = { TITLE_TEXT_OFFER: "Je offerte met nummer {0} is aangevraagd", TITLE_TEXT_BOOKING: "Je boeking met nummer {0} is bevestigd", MESSAGE_TEXT1: "Jouw droomreis komt nu heel dichtbij.", MESSAGE_TEXT2_OFFER: "Onze reisspecialisten verwerken je aanvraag en nemen binnen de 48u contact met je op.", MESSAGE_TEXT2_BOOKING: "Onze reisspecialisten verwerken je reservatie en nemen binnen de 48u contact met je op.", QUESTIONS_TEXT1: "Heb je nog vragen? ", QUESTIONS_TEXT2: "Laat het ons weten", QUESTIONS_TEXT3: ".", QUESTIONS_ALT: "Contacteer ons", MAIL_SUBJECT: "Boeking info" }; var ERROR = { TRY_AGAIN: "Probeer opnieuw te boeken", MESSAGE_TEXT1: "Tijdens het bevestigen van uw reis is er iets misgelopen.", MESSAGE_TEXT2: "Klik hieronder om nog eens te proberen.", ERROR_TEXT1: "Blijft het misgaan? ", ERROR_TEXT2: "Laat het ons dan zeker weten", ERROR_TEXT3: ".", ERROR_ALT: "Contacteer ons" }; var nlJson = { STEPS: STEPS, INPUT: INPUT, FLIGHTS_FORM: FLIGHTS_FORM, PRODUCT: PRODUCT, MAIN: MAIN, SHARED: SHARED, SIDEBAR: SIDEBAR, TRAVELERS_FORM: TRAVELERS_FORM, OPTIONS_FORM: OPTIONS_FORM, ROOM_OPTIONS_FORM: ROOM_OPTIONS_FORM, SUMMARY: SUMMARY, CONFIRMATION: CONFIRMATION, ERROR: ERROR }; var formatPrice = function (price, locale) { if (locale === void 0) { locale = "nl-BE"; } var priceFormat = Intl.NumberFormat(locale, { style: "currency", currency: "EUR", minimumFractionDigits: 2, useGrouping: true, }); return priceFormat.format(price); }; var getTranslations = function (language) { switch (language) { case "nl-BE": return nlJson; case "fr-BE": return frJson; default: throw new Error("The language '".concat(language, "' is not yet supported.")); } }; var locales = { "nl-BE": nlBE, "fr-BE": fr, }; function getLocale(code) { switch (code) { case "nl-BE": return locales[code]; case "fr-BE": return locales[code]; default: return locales["nl-BE"]; } } var getPriceDifferenceText = function (price) { return price > 0 ? "+ ".concat(formatPrice(Math.abs(price))) : "- ".concat(formatPrice(Math.abs(price))); }; function format(text, args) { return text.replace(/{([0-9]+)}/g, function (match, index) { return typeof args[index] == "undefined" ? match : args[index]; }); } var getDateFromParams = function (params, name) { var dateString = params.get(name); if (dateString === null) { return null; } var year = parseInt(dateString.slice(0, 5)); var month = parseInt(dateString.slice(5, 7)); var date = parseInt(dateString.slice(8, 10)); return new Date(Date.UTC(year, month - 1, date)).toISOString(); }; var getDateAsDateFromParams = function (params, name) { var dateString = params.get(name); if (dateString === null) { return null; } var year = parseInt(dateString.slice(0, 5)); var month = parseInt(dateString.slice(5, 7)); var date = parseInt(dateString.slice(8, 10)); return new Date(Date.UTC(year, month - 1, date)); }; var getNumberFromParams = function (params, name) { var numberString = params.get(name); if (numberString === null) { return null; } return parseInt(numberString); }; var getRoomsFromParams = function (params, name) { var roomString = params.get(name); if (roomString === null) { return null; } // Encode the accommodation code in the room string because (external) acco codes can contain special characters like '='. eg: 'ACNYNEgUzMDc4NBoKMTAzODcwMjk4NQ==' var safeRoomsString = roomString.replace(/accommodationCode:([^,]*)/, function (match, code) { return "accommodationCode:".concat(encodeURIComponent(code)); }); var rooms = JsonURL.parse(safeRoomsString); if (isNil(rooms)) { return null; } return rooms.map(function (room) { var _a; if (!isArray(room.childAges)) room.childAges = []; room.children = (_a = room.childAges.length) !== null && _a !== void 0 ? _a : 0; return room; }); }; var getFlightsFromParams = function (params, name) { var flightString = params.get(name); if (flightString === null) { return null; } flightString = flightString.replace(/ /g, "%20"); var flightInfo = JsonURL.parse(flightString, { AQF: true }); if (isNil(flightInfo)) { return null; } return flightInfo; }; var getStringFromParams = function (params, name) { return params.get(name); }; var getNumbersFromParams = function (params, name) { var numberStrings = params.getAll(name); return numberStrings.map(function (x) { return parseInt(x); }); }; var SettingsContext$1 = React.createContext({ officeId: 1, catalogueId: 1, language: "nl-BE", basePath: 'boeken', priceMode: 0 }); var commonjsGlobal$1 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; var build = {}; Object.defineProperty(build, "__esModule", { value: true }); var AllotmentType = { freeSell: 0, onRequest: 1, allotment: 2, }; var AvailabilitySearchType = { default: 0, allotment: 1, }; var DataType = { text: "text", numeric: "number", int: "int", bool: "bool", value: "value", enum: "enum", date: "date", dateTime: "datetime", dateFrom: "dateFrom", html: "html", list: "list", template: "template", }; var EntryStatus; (function (EntryStatus) { EntryStatus[(EntryStatus["new"] = -1)] = "new"; EntryStatus[(EntryStatus["offer"] = 0)] = "offer"; EntryStatus[(EntryStatus["option"] = 1)] = "option"; EntryStatus[(EntryStatus["booking"] = 2)] = "booking"; EntryStatus[(EntryStatus["cancellationByClient"] = 3)] = "cancellationByClient"; EntryStatus[(EntryStatus["cancellationByYou"] = 4)] = "cancellationByYou"; })(EntryStatus || (EntryStatus = {})); var Gender = { male: 0, female: 1, other: 2, }; var MetaDataType = { flight: 0, publicTransport: 1, rawHubData: 2, rawFlightData: 3, flightInfo: 4, bookFeedback: 5, cancelFeedback: 6, additionalServices: 7, }; var PrintActionGroup; (function (PrintActionGroup) { PrintActionGroup[(PrintActionGroup["Dossier"] = 0)] = "Dossier"; PrintActionGroup[(PrintActionGroup["Offer"] = 1)] = "Offer"; PrintActionGroup[(PrintActionGroup["Invoice"] = 2)] = "Invoice"; PrintActionGroup[(PrintActionGroup["CreditNote"] = 3)] = "CreditNote"; PrintActionGroup[(PrintActionGroup["Allotment"] = 4)] = "Allotment"; PrintActionGroup[(PrintActionGroup["Product"] = 5)] = "Product"; PrintActionGroup[(PrintActionGroup["EntryLine"] = 6)] = "EntryLine"; PrintActionGroup[(PrintActionGroup["SelfBillingInvoice"] = 7)] = "SelfBillingInvoice"; })(PrintActionGroup || (PrintActionGroup = {})); var RequirementType = { mandatory: 0, optional: 1, optionalInGroup: 2, }; var ServiceType = { package: 0, roundTrip: 1, singleTrip: 2, hotel: 3, excursion: 4, extraService: 5, insurance: 6, flight: 7, serviceFee: 8, visum: 9, charter: 10, cruise: 11, ferry: 12, transfer: 13, bus: 14, tax: 15, fee: 16, car: 17, camper: 18, specialServices: 19, train: 20, gift: 21, rental: 22, restaurant: 23, event: 24, training: 25, voucher: 26, reduction: 27, rocket: 28, tent: 29, camp: 30, }; /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } function __generator(thisArg, body) { var _ = { label: 0, sent: function () { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [], }, f, y, t, g = Object.create( (typeof Iterator === "function" ? Iterator : Object).prototype ); return ( (g.next = verb(0)), (g["throw"] = verb(1)), (g["return"] = verb(2)), typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g ); function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while ((g && ((g = 0), op[0] && (_ = 0)), _)) try { if ( ((f = 1), y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) ) return t; if (((y = 0), t)) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if ( !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && (op[0] === 6 || op[0] === 2) ) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return ( (e.name = "SuppressedError"), (e.error = error), (e.suppressed = suppressed), e ); }; var post$1 = function (url, apiKey, body, token, signal, languageCode) { return __awaiter(void 0, void 0, void 0, function () { var response; return __generator(this, function (_a) { switch (_a.label) { case 0: return [ 4 /*yield*/, fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "Api-Key": apiKey, Language: languageCode || "nl-BE", Authorization: token ? "Bearer " + token : "", }, credentials: "include", body: body, signal: signal, }), ]; case 1: response = _a.sent(); if (!response.ok) { throw new Error(response.statusText); } return [2 /*return*/, response]; } }); }); }; var patch$1 = function (url, apiKey, body, token, signal, languageCode) { return __awaiter(void 0, void 0, void 0, function () { var response; return __generator(this, function (_a) { switch (_a.label) { case 0: return [ 4 /*yield*/, fetch(url, { method: "PATCH", headers: { "Content-Type": "application/json", "Api-Key": apiKey, Language: languageCode || "nl-BE", Authorization: token ? "Bearer " + token : "", }, credentials: "include", body: body, signal: signal, }), ]; case 1: response = _a.sent(); if (!response.ok) { throw new Error(response.statusText); } return [2 /*return*/, response]; } }); }); }; var get$1 = function (url, apiKey, token, signal, languageCode) { return __awaiter(void 0, void 0, void 0, function () { var response; return __generator(this, function (_a) { switch (_a.label) { case 0: return [ 4 /*yield*/, fetch(url, { method: "GET", headers: { "Content-Type": "application/json", "Api-Key": apiKey, Language: languageCode || "nl-BE", "Accept-Language": languageCode || "nl-BE", Authorization: token ? "Bearer " + token : "", }, credentials: "include", signal: signal, }), ]; case 1: response = _a.sent(); if (!response.ok) { throw new Error(response.statusText); } return [2 /*return*/, response]; } }); }); }; var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : {}; function commonjsRequire(path) { throw new Error( 'Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.' ); } var moment$1 = { exports: {} }; (function (module, exports) { (function (global, factory) { module.exports = factory(); })(commonjsGlobal, function () { var hookCallback; function hooks() { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback(callback) { hookCallback = callback; } function isArray(input) { return ( input instanceof Array || Object.prototype.toString.call(input) === "[object Array]" ); } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return ( input != null && Object.prototype.toString.call(input) === "[object Object]" ); } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return Object.getOwnPropertyNames(obj).length === 0; } else { var k; for (k in obj) { if (hasOwnProp(obj, k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return ( typeof input === "number" || Object.prototype.toString.call(input) === "[object Number]" ); } function isDate(input) { return ( input instanceof Date || Object.prototype.toString.call(input) === "[object Date]" ); } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, "toString")) { a.toString = b.toString; } if (hasOwnProp(b, "valueOf")) { a.valueOf = b.valueOf; } return a; } function createUTC(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty: false, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidEra: null, invalidMonth: null, invalidFormat: false, userInvalidated: false, iso: false, parsedDateParts: [], era: null, meridiem: null, rfc2822: false, weekdayMismatch: false, }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this), len = t.length >>> 0, i; for (i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m), parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }), isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid(flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = (hooks.momentProperties = []), updateInProgress = false; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment(obj) { return ( obj instanceof Moment || (obj != null && obj._isAMomentObject != null) ); } function warn(msg) { if ( hooks.suppressDeprecationWarnings === false && typeof console !== "undefined" && console.warn ) { console.warn("Deprecation warning: " + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = [], arg, i, key; for (i = 0; i < arguments.length; i++) { arg = ""; if (typeof arguments[i] === "object") { arg += "\n[" + i + "] "; for (key in arguments[0]) { if (hasOwnProp(arguments[0], key)) { arg += key + ": " + arguments[0][key] + ", "; } } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn( msg + "\nArguments: " + Array.prototype.slice.call(args).join("") + "\n" + new Error().stack ); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return ( (typeof Function !== "undefined" && input instanceof Function) || Object.prototype.toString.call(input) === "[object Function]" ); } function set(config) { var prop, i; for (i in config) { if (hasOwnProp(config, i)) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this["_" + i] = prop; } } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source ); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if ( hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop]) ) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay: "[Today at] LT", nextDay: "[Tomorrow at] LT", nextWeek: "dddd [at] LT", lastDay: "[Yesterday at] LT", lastWeek: "[Last] dddd [at] LT", sameElse: "L", }; function calendar(key, mom, now) { var output = this._calendar[key] || this._calendar["sameElse"]; return isFunction(output) ? output.call(mom, now) : output; } function zeroFill(number, targetLength, forceSign) { var absNumber = "" + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return ( (sign ? (forceSign ? "+" : "") : "-") + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber ); } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken(token, padded, ordinal, callback) { var func = callback; if (typeof callback === "string") { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal(func.apply(this, arguments), token); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ""); } return input.replace(/\\/g, ""); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = "", i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace( localFormattingTokens, replaceLongDateFormatTokens ); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var defaultLongDateFormat = { LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A", }; function longDateFormat(key) { var format = this._longDateFormat[key], formatUpper = this._longDate