{"version":3,"sources":["searchBoxes.js"],"names":["SearchBoxValidationCallback","_listeners","invoke","addListener","searchType","listener","setTimeout","l","forEach","searchBoxes","SearchBoxFactory","editSearch","search","AttractionSearchBox","type","target","CrossingSearchBox","ExcursionsSearchBox","setSelectedValue","optionSelectSetValueAndSelected","caption","syncWrappedSelectCaption","for","selectedOption","rememberedSearch","JSON","initiliseTask","_","rememberedSearchElm","document","querySelector","parse","value","then","Initialise","keyValues","option","selectField","appendChild","dataset","innerText","selectedKey","innerHTML","minutes","setWrappedSelectText","kv","buildUnixString","Option","date","hours","concat","container","parsedDate","bindList","dateTimes","setDate","text","momentDateTime","moment","dateContainer","format","d","setDateTime","classList","contains","getValues","setTime","passengers","buildSelectionCaption","Array","formElm","querySelectorAll","hourElement","typeElement","minuteElement","setSelectedPax","passengerTypeElm","matches","length","parentElement","timeContainer","rawDate","undefined","setSelected","getSelectedForTypeArrayId","getSelectedForTypeId","response","from","filter","x","dataSearch","DefaultRoute","name","pluralizedname","join","SearchBoxTabs","getAffiliateId","affiliateId","id","initSearchBox","passengerId","window","fetch","affiliate","searchBoxContainer","passengerIds","includes","setupTab","searchBoxTab","json","Promise","resolve","setAffiliateName","addEventListener","loaded","defaultSearch","tabNum","searchBoxContainerSelector","init","setDefaultRoute"],"mappings":"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","file":"searchBoxes.js","sourcesContent":["const SearchBoxValidationCallback = (function() {\n const _listeners = [];\n\n const addListener = (searchType, listener) => {\n _listeners.push({\n searchType: searchType,\n listener: listener\n });\n }\n const invoke = (searchType) => {\n //cannot validate straight away as the pax popup prevents checking passengers until it is closed\n setTimeout(() => {\n _listeners\n .filter(l => l.searchType == searchType)\n .forEach(l => l.listener());\n },\n 100);\n };\n\n return {\n addListener: addListener,\n invoke: invoke\n };\n})();\n\nconst searchBoxes = (function () {\n const SearchBoxFactory = (function() {\n const bind = (target, type) => {\n switch (type) {\n case \"Product\":\n return new AttractionSearchBox(target);\n case \"Crossing\":\n return new CrossingSearchBox(target);\n case \"Excursion\":\n return new ExcursionsSearchBox(target);\n default:\n throw \"Unknown search box\";\n }\n };\n\n return {\n for: bind\n };\n })();\n\n const editSearch = (target, type) => {\n let search = SearchBoxFactory.for(target, type);\n let initiliseTask = search.Initialise();\n let rememberedSearchElm = document.querySelector(\"[name=searchCriteria]\");\n\n if (rememberedSearchElm) {\n let rememberedSearch = JSON.parse(rememberedSearchElm.value);\n\n return initiliseTask.then(_ => {\n search.bind(rememberedSearch);\n });\n }\n\n return initiliseTask;\n };\n\n const defaultSearch = (target, type) => {\n let search = SearchBoxFactory.for(target, type);\n\n return search.Initialise();\n };\n\n return {\n defaultSearch: defaultSearch,\n editSearch: editSearch\n };\n})();\n\nsearchBoxes.formWrappers = (function () {\n const syncWrappedSelectCaption = (selectField) => {\n let selectedOption = selectField.querySelector(\"option[selected]\");\n let caption = selectedOption ? selectedOption.dataset[\"textvalue\"] || selectedOption.innerText : \"\";\n\n selectField.closest(\".large-select-list\").querySelector(\"[data-select-type] .large-select__value\").innerHTML = caption;\n };\n\n const setSelectedValue = (selectField, value) => {\n optionSelectSetValueAndSelected(selectField, value);\n syncWrappedSelectCaption(selectField);\n };\n\n const bindList = (selectField, keyValues, selectedKey) => {\n selectField.innerHTML = '';\n\n keyValues.forEach(kv => {\n let option = new Option(kv.value, kv.key, kv.key == selectedKey);\n option.dataset[\"textvalue\"] = kv.value;\n selectField.appendChild(option);\n });\n\n selectField.value = selectedKey;\n syncWrappedSelectCaption(selectField);\n };\n\n return {\n bindList: bindList,\n setSelectedValue: setSelectedValue\n };\n})();\n\nsearchBoxes.dateTimes = (function () {\n const setWrappedSelectText = (container, text) => {\n container.querySelector(\"[data-select-type] .large-select__value\").innerHTML = text;\n };\n\n const buildUnixString = (date, hours, minutes) => `${date} ${hours}:${minutes}:00`;\n\n const getValues = (container) => {\n let rawDate = container.querySelector(\".date-time-picker__date input[type=hidden]\").value;\n let hours = container.querySelector(\"[data-select-hours]\").value;\n let minutes = container.querySelector(\"[data-select-minutes]\").value;\n\n return {\n date: rawDate,\n hours: hours,\n minutes: minutes,\n parsedDate: () => rawDate ? new moment(buildUnixString(rawDate, hours, minutes)) : undefined\n };\n };\n\n const setDate = (container, d) => {\n let momentDateTime = new moment(d);\n let dateContainer = container.classList.contains(\"date-time-picker__date\")\n ? container\n : container.querySelector(\".date-time-picker__date\");\n\n dateContainer.closest(\".date-time-picker\").querySelector(\".time-popup__selected-date\").innerHTML = momentDateTime.format(\"DD MMMM, YYYY\");\n dateContainer.querySelector(\"input[type=hidden]\").value = momentDateTime.format('YYYY-MM-DD');\n setWrappedSelectText(dateContainer, momentDateTime.format(\"DD/MM/YYYY\"));\n };\n\n const setTime = (container, d) => {\n let momentDateTime = new moment(d);\n let timeContainer = container.classList.contains(\"date-time-picker__time\")\n ? container\n : container.querySelector(\".date-time-picker__time\");\n\n let hourElement = timeContainer.querySelector(\"[data-select-hours]\");\n let minuteElement = timeContainer.querySelector(\"[data-select-minutes]\");\n\n var hours = momentDateTime.format(\"HH\");\n var minutes = momentDateTime.format(\"mm\");\n\n optionSelectSetValueAndSelected(hourElement, hours);\n optionSelectSetValueAndSelected(minuteElement, minutes);\n\n hourElement.parentElement.querySelector(\"input\").value = hours;\n minuteElement.parentElement.querySelector(\"input\").value = minutes;\n\n setWrappedSelectText(timeContainer, `${hours} : ${minutes}`);\n };\n\n const setDateTime = (container, d) => {\n setDate(container, d);\n setTime(container, d);\n };\n\n return {\n getValues: getValues,\n setDateTime: setDateTime,\n setDate: setDate,\n setTime: setTime,\n buildUnixString: buildUnixString\n };\n})();\n\n\nsearchBoxes.passengers = (function () {\n const buildSelectionCaption = (formElm) => {\n return Array.from(formElm.querySelectorAll(\"[data-passengertype]\"))\n .filter(x => x.value !== \"0\")\n .map(typeElement => {\n return typeElement.value === \"1\"\n ? `${typeElement.value} ${typeElement.dataset.name}`\n : `${typeElement.value} ${typeElement.dataset.pluralizedname}`;\n })\n .join(', ');\n };\n\n const setSelectedPax = (formElm, passengers) => {\n Array.from(formElm.querySelectorAll(\"[name=passengerType]\")).forEach(passengerTypeElm => {\n let matches = passengers.filter(x => x.id == passengerTypeElm.dataset.id);\n\n optionSelectSetValueAndSelected(passengerTypeElm, matches.length == 1 ? matches[0].value : 0);\n });\n\n formElm.querySelector('[data-select-type=pax] .large-select__value').innerHTML = buildSelectionCaption(formElm);\n };\n \n const getSelectedForTypeId = (formElm, passengerId) => {\n return formElm.querySelector(`select[data-id='${passengerId}']`);\n };\n \n const getSelectedForTypeArrayId = (formElm, passengerIds) => {\n return Array.from(formElm.querySelectorAll(`select[data-id]`))\n .filter(type => passengerIds.includes(type.dataset.id));\n };\n\n return {\n setSelected: setSelectedPax,\n buildSelectionCaption: buildSelectionCaption,\n getSelectedForTypeId: getSelectedForTypeId,\n getSelectedForTypeArrayId: getSelectedForTypeArrayId\n };\n})();\n\nconst setDefaultRoute = () => {\n const id = getAffiliateId()\n if (id !== \"\") {\n return window.fetch(`/api/data/SearchBox?name=${id}`)\n .then(response => response.json())\n .then(response=> {\n const dataSearch = document.querySelector(\"[data-search='herosearch']\")\n if (dataSearch && response.DefaultRoute !== \"\" && response.DefaultRoute != null) {\n dataSearch.dataset[\"defaultRoute\"] = response.DefaultRoute\n }\n })\n }else{\n return Promise.resolve()\n }\n}\n\nconst getAffiliateId = () => {\n const affiliateId = document.querySelector(\"[data-affiliate-id]\");\n if(affiliateId){\n return affiliateId.value; \n }\n return \"\";\n}\n\nconst setAffiliateName = () => {\n const affiliate = getAffiliateId()\n if(affiliate !== \"\"){\n window.fetch(`/api/data/GetAffiliateName/${affiliate}`)\n .then(response => response.json())\n .then(response=> {\n document.querySelectorAll(\"#Affiliate\").forEach(x=>x.value = response);\n });\n }\n \n \n}\n\nconst SearchBoxTabs = (function () {\n \n const initSearchBox = (searchBoxContainer, type) => {\n if (typeof searchBoxContainer.dataset.loaded === 'undefined') {\n searchBoxContainer.dataset.loaded = true;\n \n searchBoxes.defaultSearch(searchBoxContainer, type);\n\n }\n };\n\n \n const setupTab = (tabNum, searchBoxContainerSelector, type) => {\n let searchBoxTab = document.querySelector(`[data-tabs=\"herosearch\"] [data-target=\"${tabNum}\"]`);\n let searchBoxContainer = document.querySelector(`.hero-search ${searchBoxContainerSelector}`);\n\n if (!searchBoxTab || !searchBoxContainer) {\n return;\n }\n\n \n if (searchBoxTab.classList.contains(\"active\")) {\n initSearchBox(searchBoxContainer, type);\n } else {\n searchBoxTab.addEventListener('click',\n () => {\n initSearchBox(searchBoxContainer, type);\n \n });\n }\n };\n\n const init = () => {\n setDefaultRoute()\n .then(_ =>{\n setupTab(0, \"[data-crossingSearchBox]\", \"Crossing\");\n setupTab(1, \"[data-attractionSearchBox]\", \"Product\");\n setupTab(2, \"[data-excursionsSearchBox]\", \"Excursion\");\n })\n \n };\n\n return {\n init: init\n };\n})();\n\ndocument.addEventListener(\"DOMContentLoaded\",\n () => SearchBoxTabs.init());"]}