{"version":3,"file":"js/42784-d547b83c75f675183a02.js","mappings":"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","sources":["webpack://cms-web/./app/frontend/src/shared/filters_sidebar_mice/filters_sidebar_mice.analytics.js","webpack://cms-web/./app/frontend/src/shared/filters_sidebar_mice/filters_sidebar_mice.js","webpack://cms-web/./app/frontend/src/blocks/hotels_info_with_filtering_mice/dependencies/filters.js","webpack://cms-web/./app/frontend/src/blocks/hotels_info_with_filtering_mice/dependencies/list_events.js","webpack://cms-web/./app/frontend/src/blocks/hotels_info_with_filtering_mice/dependencies/pagination/pagination_constants.js","webpack://cms-web/./app/frontend/src/elements/wait_loading/wait_loading.js","webpack://cms-web/./app/frontend/src/shared/update_prices/update_prices.js","webpack://cms-web/./app/frontend/src/utils/from_string_to_array.js"],"sourcesContent":["import { sendUtagEvent } from '../../core/analytics/utag_events'\nimport on from '../../utils/events_delegation'\nimport { getCleanedString } from '../../utils/utilities'\n\nconst BLOCK_SELECTOR = '.js-filters-sidebar'\n\nexport function initializeUtagEvents() {\n on({\n eventName: 'click',\n selector: `${BLOCK_SELECTOR} .utag-hotels-filters-continents`,\n handler() {\n let continent\n\n switch (element.getAttribute('data-root-destination')) {\n case 'destination-2':\n continent = 'europe'\n break\n case 'destination-3':\n continent = 'the americas'\n break\n case 'destination-95':\n continent = 'africa'\n break\n default:\n continent = 'undefined'\n }\n\n sendUtagEvent({\n data: {\n event_name: 'filters',\n event_cat: 'filters destinations',\n event_act: 'continents',\n event_lbl: continent,\n event_purpose: 'inspiration',\n event_structure: 'body',\n },\n })\n },\n })\n\n on({\n eventName: 'click',\n selector: `${BLOCK_SELECTOR} input.utag-hotels-filters-stars`,\n handler() {\n const element = this\n\n if (!element.checked) {\n return\n }\n\n sendUtagEvent({\n data: {\n event_name: 'filters',\n event_cat: 'filters destinations',\n event_act: 'stars',\n event_lbl: getCleanedString(element.getAttribute('data-utag-stars')),\n event_purpose: 'inspiration',\n event_structure: 'body',\n },\n })\n },\n })\n\n on({\n eventName: 'click',\n selector: `${BLOCK_SELECTOR} input.utag-hotels-filters-services`,\n handler() {\n const element = this\n\n if (!element.checked) {\n return\n }\n\n sendUtagEvent({\n data: {\n event_name: 'filters',\n event_cat: 'filters destinations',\n event_act: 'services',\n event_lbl: getCleanedString(element.getAttribute('data-utag-service')),\n event_purpose: 'inspiration',\n event_structure: 'body',\n },\n })\n },\n })\n\n on({\n eventName: 'click',\n selector: `${BLOCK_SELECTOR} input.utag-hotels-filters-specilities`,\n handler() {\n const element = this\n\n if (!element.checked) {\n return\n }\n\n sendUtagEvent({\n data: {\n event_name: 'filters',\n event_cat: 'filters destinations',\n event_act: 'specialities',\n event_lbl: getCleanedString(element.getAttribute('data-utag-sepeciality')),\n event_purpose: 'inspiration',\n event_structure: 'body',\n },\n })\n },\n })\n\n on({\n eventName: 'click',\n selector: `${BLOCK_SELECTOR} input.utag-hotels-filters-countries`,\n handler() {\n const element = this\n\n if (!element.checked) {\n return\n }\n\n sendUtagEvent({\n data: {\n event_name: 'filters',\n event_cat: 'filters destinations',\n event_act: 'countries',\n event_lbl: getCleanedString(element.getAttribute('data-utag-country') || ''),\n event_purpose: 'inspiration',\n event_structure: 'body',\n },\n })\n },\n })\n}\n","/* eslint-disable */\nimport { readCookie } from '../../utils/cookie_manager';\nimport { currentDevice } from '../../core/utils/currentDevice';\nimport on from '../../utils/events_delegation';\n// import '../hotels_map_for_filter_mice_page/hotels_map_for_filter_mice_page';\nimport _filter from 'lodash/filter';\nimport _uniq from 'lodash/uniq';\nimport _omit from 'lodash/omit';\nimport _omitBy from 'lodash/omitBy';\nimport _isEmpty from 'lodash/isEmpty';\nimport _includes from 'lodash/includes';\nimport _pickBy from 'lodash/pickBy';\nimport _size from 'lodash/size';\nimport _forEach from 'lodash/forEach';\nimport _difference from 'lodash/difference';\nimport _values from 'lodash/values';\n\nimport { initializeUtagEvents } from './filters_sidebar_mice.analytics';\n\nconst LOCALSTORAGE_KEY = 'hotel_search';\nconst AUTO_OFFER_LIST_PRESENT = document.querySelectorAll ('.automatic-offer-list');\nconst filters = { destinations: [], categories: [], specialties: [], amenities: [], budgets: [] };\nlet currentHotels = [];\n\n// Get LocalStorage key for search criteria\nfunction getLocalStorage() {\n let search;\n try {\n search = localStorage.getItem(LOCALSTORAGE_KEY);\n } catch (e) { }\n search = initializeOrFindSearch(search);\n return search;\n}\n\n// Save search criteria to LocalStorage\nfunction setLocalStorage(search) {\n try {\n localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(search));\n } catch (e) { }\n}\n\n// Empty LocalStorage search criteria\nfunction emptyLocalStorage() {\n localStorage.removeItem(LOCALSTORAGE_KEY);\n}\n\n\nfunction applyFilters($wrapper, $element) {\n let $elements = $wrapper.find('[data-filterable]');\n if (!$elements.length) return;\n\n let $filters_sidebar = $('.js-filters-sidebar');\n let filters = { destinations: [], categories: [], specialties: [], amenities: [], budgets: [] };\n let available_options = { categories: [], specialties: [], amenities: [] };\n let global_counter = 0;\n let $total_counter = $('.total-hotels-counter');\n let $total_counter_mice = $('.meetings .counter-search-meetings');\n currentHotels = [];\n\n $filters_sidebar.find('[data-filter]:checked').map(function () {\n let filter_value = $(this).val();\n if ($(this).attr('data-filter') !== 'categories') {\n filter_value = parseInt($(this).val(), 10);\n }\n filters[$(this).attr('data-filter')]?.push(filter_value);\n });\n\n if ((!currentDevice.isMobile|| !currentDevice.isLikeMobile) && $element === undefined) createAllCheckedTags($filters_sidebar);\n\n $('.destination-set').removeClass('hidden');\n\n checkFiltersBottomActionsVisibility();\n\n let $filtered_els = $elements.removeClass('hidden').filter(function () {\n let $this = $(this);\n let data = $this.data('filterable');\n\n if (!_filter(filters, function (o) {return o.length;}).length) {\n let index;\n for (index = 0; index < data.length; index++) {\n $.each(available_options, function (key) {\n available_options[key] = _uniq(available_options[key].concat(data[index][key]));\n });\n }\n if ($this.hasClass('dest-card')) combineText($this.find('.hotel-count'), data.length, getVisibleHotels().length);\n\n return true;\n }\n\n let f_destinations = filters.destinations;\n let f_other_obj = _omit(filters, ['destinations']);\n let filters_omit = _omitBy(f_other_obj, _isEmpty);\n let valid_destination = false;\n let valid_options = false;\n let valid = false;\n let counter = 0;\n let visibleHotels = getVisibleHotels();\n let omit;\n\n let index;\n for (index = 0; index < data.length; index++) {\n let obj = {};\n\n valid_destination = f_destinations.length ? data[index].destinations.some(function (dest) {return _includes(f_destinations, dest);}) : true;\n\n omit = _pickBy(data[index], function (value, key) {\n return filters_omit[key] !== undefined;\n });\n\n if (_size(omit)) {\n _forEach(omit, function (value, key) {\n obj[key] = _difference(filters_omit[key], data[index][key]).length === 0;\n });\n\n valid_options = !_includes(_values(obj), false);\n } else {\n valid_options = true;\n }\n\n if (valid_options && valid_destination) {\n counter++;\n $.each(available_options, function (key) {\n if (data[index][key] !== undefined) available_options[key] = _uniq(available_options[key].concat(data[index][key]));\n });\n\n if ($this.hasClass('dest-card')) combineText($this.find('.hotel-count'), counter, visibleHotels.length);\n }\n\n if (!valid) valid = valid_options && valid_destination;\n }\n\n return valid;\n });\n\n $elements.not($filtered_els).addClass('hidden');\n\n global_counter = getVisibleHotels().length;\n // Actualizamos los data-global-counter si los hay\n if ($('[data-global-counter]').length) {\n $('[data-global-counter]').find('b').text(global_counter);\n }\n\n // Esconder los paises que no tienen destinos válidos para los filtros\n $('.destination-set').each(function (i, element) {\n let $actual = $(element);\n $actual.toggleClass('hidden', $actual.find('.js-dest-card:not(.hidden)').length === 0);\n });\n\n // Deshabilitamos todos los checks que no tengan posibles resultados\n disableFiltersWithoutVisibleElements($filters_sidebar, available_options);\n $wrapper.trigger('filtering.finish', filters);\n if ((!currentDevice.isMobile|| !currentDevice.isLikeMobile)) {\n if ($('#hotels-filter-map').is(':visible')) {\n IB.hotels_filter_map.filterVisible();\n }\n }\n if (_filter(filters, function (o) {return o.length;}).length) {\n let visibleHotels = getVisibleHotels().length;\n $total_counter.find('.counter').text(visibleHotels);\n $total_counter.removeClass('hidden');\n\n visibleHotels >= 1 ? $('.message-hotels-not-found').addClass('hidden') : $('.message-hotels-not-found').removeClass('hidden');\n\n // Header results mice searches\n if ($total_counter_mice.length > 0) {\n $total_counter_mice.find('b').html(visibleHotels);\n let spanText = $total_counter_mice.parent().find('.results-search-meetings');\n if (visibleHotels > 1) {\n spanText.html(spanText.data('text-plural'));\n } else {\n spanText.html(spanText.data('text-singular'));\n }\n }else{\n let visibleHotels = getVisibleHotelsInHotelPage(filters);\n currentHotels = visibleHotels;\n $total_counter.find('.counter').text(visibleHotels.length);\n\n //filtros\n disableFiltersWithoutVisibleElements($filters_sidebar, available_options,visibleHotels);\n FilterSidebar.updateFiltersCounter();\n }\n } else {\n $total_counter.addClass('hidden');\n }\n\n if ($element !== undefined) {\n let $select_all = $element.closest('.filters').find('.select-all').find('input');\n\n if ($element.attr('data-filter') === 'destinations' && $select_all.length && $select_all.hasClass('selected')) {\n $select_all.prop('checked', false).change();\n $select_all.removeClass('selected');\n }\n }\n}\n\nfunction getVisibleHotelsInHotelPage(filters) {\n let total_filters = _filter(filters, function (o) { return o.length; }).length;\n let visibleHotels = [];\n let hotels = document.querySelectorAll('.destination-list:not(.hidden) .dest-card:not(.hidden)');\n hotels.forEach(function (element) {\n const options = JSON.parse(element.dataset.filterable);\n const hotels = JSON.parse(element.dataset.hotels);\n options.forEach(function (option, index) {\n const options_name = Object.keys(option);\n let valid_options = 0;\n options_name.forEach(function (key) {\n if(!filters[key].length){\n return false\n }\n\n if (key !== 'destinations' && filters[key].every(r => option[key].includes(r))) {\n valid_options++;\n }\n\n if (key === 'destinations' && filters[key].some(r => option[key].includes(r))) {\n valid_options++;\n }\n });\n if (valid_options == total_filters) {\n visibleHotels.push(hotels[index]);\n }\n });\n });\n return visibleHotels;\n}\n\nfunction contains(values, array) {\n return array.some(function (v) {\n return values.indexOf(v) >= 0;\n });\n}\n\nfunction clearFilters($wrapper, kinds) {\n kinds = (typeof kinds === 'undefined') ? ['destinations', 'categories', 'specialties', 'amenities'] : kinds;\n $.each(kinds, function () {\n $('.js-filters-sidebar').find('[data-filter=\"' + this + '\"]:checked, .select-all input:checked').prop('checked', false)\n .change();\n });\n applyFilters($wrapper);\n FilterSidebar.updateFiltersCounter();\n}\n\nfunction selectorForFilter(key, values) {\n let selector = [];\n for (let i = 0; i < values.length; i++) {\n selector.push('[value=\"' + values[i] + '\"]');\n }\n return selector.join(',');\n}\n\nfunction disableFiltersWithoutVisibleElements($wrapper, available_options) {\n let $checkboxes = $wrapper.find('[data-filter]').not('[data-filter=\"destinations\"]');\n\n if (!_filter(available_options, function (o) {return o.length;}).length) {\n return true;\n }\n // Active all\n $checkboxes.prop('disabled', false).trigger('formikation.update');\n\n // Disable filters that doesn't have hotels in visible cards\n let visibleHotels = getVisibleHotels();\n if(currentHotels.length){\n visibleHotels = currentHotels;\n }\n\n $checkboxes.filter(function () {\n let $this = $(this);\n let visibleHotelNumberInFilter = 0;\n visibleHotels.forEach((hotel) => {\n if (_includes(Object.values($this.data('hotels-by-zone')).flat(), hotel)) visibleHotelNumberInFilter += 1;\n });\n return visibleHotelNumberInFilter < 1;\n }).prop('disabled', true).trigger('formikation.update');\n\n FilterSidebar.updateFiltersCounter();\n}\n\n\nfunction getHotelsThatMatchCategory($inputs) {\n return $inputs.toArray().reduce(function (acc, element) {\n let hotelsByCountry = $(element).data('');\n\n\n if (hotelsByCountry !== undefined) {\n Object.keys(hotelsByCountry).forEach(function (country) {\n acc[country] = (acc[country] || []).concat(hotelsByCountry[country]);\n });\n return acc;\n }\n }, {});\n}\n\n\nfunction intersectArrays() {\n return Array.prototype.slice.call(arguments).reduce(function (acc, array) {\n return intersectTwoArrays(acc, array);\n });\n}\n\nfunction intersectTwoArrays(a, b) {\n if (!b) return a;\n return $.grep(a, function (i) {\n return $.inArray(i, b) > -1;\n });\n}\n\n\nfunction countHotels($element) {\n let $checked = $('.checked [data-filter]');\n let $checkedCategories = $(\"[data-filter='categories']:checked\");\n let $checkedSpecialties = $(\"[data-filter='specialties']:checked\");\n let $checkedAmenities = $(\"[data-filter='amenities']:checked\");\n\n if ($checked.length != 0) {\n if ($checkedCategories.length == 0) {$checkedCategories = $(\"[data-filter='categories']\");}\n if ($checkedSpecialties.length == 0) {$checkedSpecialties = $(\"[data-filter='specialties']\");}\n if ($checkedAmenities.length == 0) {$checkedAmenities = $(\"[data-filter='amenities']\");}\n }\n\n let hotelsAvailableByCategory = getHotelsThatMatchCategory($checkedCategories);\n let hotelsAvailableBySpecialty = getHotelsThatMatchCategory($checkedSpecialties);\n let hotelsAvailableByAmenity = getHotelsThatMatchCategory($checkedAmenities);\n\n let allCountries = Object.keys($.extend({}, hotelsAvailableByCategory, hotelsAvailableBySpecialty, hotelsAvailableByAmenity ));\n\n let result = allCountries.reduce(function (acc, country) {\n let hotelsToIntersect = [];\n if ($checkedCategories.length) hotelsToIntersect.push(hotelsAvailableByCategory[country] || {});\n if ($checkedSpecialties.length) hotelsToIntersect.push(hotelsAvailableBySpecialty[country] || {});\n if ($checkedAmenities.length) hotelsToIntersect.push(hotelsAvailableByAmenity[country] || {});\n\n let hotels = intersectArrays.apply(this, hotelsToIntersect);\n\n let newResult = (acc[country] || []).concat(hotels).unique();\n if (newResult.length > 0) acc[country] = newResult;\n return acc;\n }, {});\n\n if (($checked.length > 0) &&\n (($checkedCategories.length != $(\"[data-filter='categories']\").length) ||\n ($checkedSpecialties.length != $(\"[data-filter='specialties']\").length) ||\n ($checkedAmenities.length != $(\"[data-filter='amenities']\").length))) {\n Object.keys(result).forEach(function (country) {\n $('.js-dest-card[data-id=' + country + ']').find('.hotel-count').data('count', result[country].length);\n if ($('.js-dest-card[data-id=' + country + ']').length > 0) {\n combineText($('.js-dest-card[data-id=' + country + ']').find('.hotel-count'), result[country].length);\n }\n });\n } else {\n $.each($('.js-dest-card'), function (e, f) {\n $(f).find('.hotel-count').data('count', $(f).find('.hotel-count').data('all'));\n if ($(f).length > 0) {\n combineText($(f).find('.hotel-count'), $(f).find('.hotel-count').data('all'));\n }\n });\n }\n\n return result;\n}\n\nfunction updateFiltersCounter() {\n // Obtiene las ids de los hoteles visibles\n let visibleHotels = getVisibleHotels();\n if(currentHotels.length){\n visibleHotels = currentHotels;\n }\n\n let hotelsCount = 0;\n\n // Recorre todos los filtros para actualizar su contador de hoteles\n $('[data-filter]').each(function (index, elem) {\n hotelsCount = 0;\n\n let $el = $(elem);\n let $counterLabel = $el.closest('label').find('.hotel-count');\n let hotelsByZone = $el.data('hotels-by-zone') || $el.data('crs-offers-by-zone');\n\n // Sumatorio de los hoteles visibles\n for (let key in hotelsByZone) {\n hotelsByZone[key].map(function (hotelId) {\n if (visibleHotels.indexOf(hotelId) !== -1) hotelsCount += 1;\n });\n }\n\n // Actualización del contador\n if (!$el.hasClass('init')) combineText($counterLabel, hotelsCount, visibleHotels.length);\n if ($el.data('filter') === 'destinations' && !$el.hasClass('init')) $el.addClass('init');\n\n if(hotelsCount == 0){\n elem.parentElement.classList.add('disabled')\n }\n });\n}\n\nfunction combineText($span, count, total) {\n let trans_one = $span.data('one');\n let trans_other = $span.data('other');\n\n if ($span && (count || count === 0)) {\n if ($span && count > 1 && trans_other) {\n $span.html(trans_other.replace('{{count}}', count));\n } else if (trans_one) {\n $span.html(trans_one.replace('{{count}}', count));\n }\n }\n}\n\n// Get visible Hotels\nfunction getVisibleHotels() {\n let visibleHotels = [];\n\n if ($('.wrapper.hotels-info-with-filtering').length > 0) {\n $('.wrapper.hotels-info-with-filtering').data('hotels-filterable-info').map(function(hotel, index) {\n hotel['hotels'].map(function (hotelId, i) {\n\n let obj = {};\n let data = hotel[\"filterable\"][0];\n\n _forEach(data, function (value, key) {\n obj[key] = _difference(filters[key], data[key]).length === 0;\n });\n\n if (!_includes(_values(obj), false)) visibleHotels.push(hotelId);\n });\n });\n }\n\n // Get commons hotels from filters\n let filterHotels = [];\n $('.js-filters-sidebar').find('[data-filter=\"date\"]:checked').map(function () {\n if($(this).data('hotels-by-zone') === undefined)\n return\n if (filterHotels.length > 0) {\n filterHotels = intersectTwoArrays(filterHotels, Object.values($(this).data('hotels-by-zone')).flat());\n } else {\n if (!AUTO_OFFER_LIST_PRESENT)\n filterHotels = filterHotels.concat(Object.values($(this).data('hotels-by-zone')).flat());\n }\n });\n\n\n\n //Get selected continent and check only hotels visible on it\n //If there is only one filter, concatenate hotels, and if not, get intersection of the filters\n let selectedContinent = $('[data-root-destination].active').data('root-destination');\n if ($('.filtering-container .' + selectedContinent + ' .js-dest-card.dest-card:not(.hidden)').length > 0) {\n $('.filtering-container .' + selectedContinent + ' .js-dest-card.dest-card:not(.hidden)').map(function (index) {\n let hotelIds = $(this).data('hotels');\n if (filterHotels.length) {\n visibleHotels = visibleHotels.concat(_filter(hotelIds, function (hotel) {return _includes(filterHotels, hotel);}));\n } else {\n visibleHotels = visibleHotels.concat(hotelIds);\n }\n });\n }\n\n return visibleHotels;\n}\n\n// Return true if visible in list or map\nfunction isVisible(el) {\n let $el = $(el);\n let second_check = $el.closest('.root-destination').length ? (!$el.hasClass('hidden') && $el.closest('.root-destination').hasClass('current')) : !$el.hasClass('hidden');\n\n return $el.is(':visible') || second_check;\n}\n\n// Initialize search criteria with empty values or get the current one from LocalStorage key\nfunction initializeOrFindSearch(search) {\n if (search === null) {\n search = {};\n search['destinations'] = [];\n search['categories'] = [];\n search['specialties'] = [];\n search['amenities'] = [];\n\n } else {\n search = JSON.parse(search);\n }\n return search;\n}\n\n\n// Check selected options in next page visualization\nfunction checkOptions() {\n let search = getLocalStorage();\n\n $.each(search, function (key, filters_values) {\n if (filters_values.length > 0) {\n $('.filters-block.' + key + ' p').addClass('active').closest();\n $('.filters-block.' + key + ' div').removeClass('hidden');\n }\n $.each(filters_values, function (index, value) {\n $(\"[data-filter='\" + key + \"'][value='\" + value + \"']\").prop('checked', true).change();\n });\n });\n}\n\nfunction checkFiltersBottomActionsVisibility() {\n let $filters_sidebar = $('.js-filters-sidebar');\n let $bottomActions = $filters_sidebar.find('.bottom-actions');\n\n // isLikeMobile de momento solo está disponible en la página de destino\n if ((!currentDevice.isMobile || (!currentDevice.isLikeMobile && IB.currentPageType.get() == 'destination'))) {\n //$bottomActions.hide();\n return;\n }\n\n // Then it's mobile\n let checkedFilters = $filters_sidebar.find('[data-filter]:checked').length;\n\n if (checkedFilters) {\n $bottomActions.css('display', 'flex');\n $bottomActions.removeClass('bottom-actions--apply-only');\n } else {\n let $orderOptionList = $('.js-filters-panel').find('.js-order-option-list');\n let lastOrderFilter = $orderOptionList.attr('data-current-order');\n let selectedOrderFilter = $orderOptionList.find('input:checked').val();\n\n // Check if order filter has changed\n if (lastOrderFilter === selectedOrderFilter) {\n $bottomActions.hide();\n } else {\n $bottomActions.css('display', 'flex');\n $bottomActions.addClass('bottom-actions--apply-only');\n }\n }\n}\n\n/**\n * Toggle current clicked filter\n *\n * @param {*} filter_block Clicked filter block\n */\nfunction toggleFilters(filter_block) {\n let title = filter_block.querySelector('.js-filter-title');\n let filters = filter_block.querySelector('.js-filter-block');\n //let filters_index = filter_block.querySelectorAll('.filters-index');\n\n title.classList.toggle('active');\n filter_block.classList.toggle('active');\n\n $(filters).slideToggle();\n}\n\nfunction filterDropDownToggle() {\n on({\n eventName: 'click',\n selector: '.js-filters-sidebar .js-filter .js-filter-title',\n handler() {\n toggleFilters(this.closest('.js-filter'));\n },\n })\n}\n\nfunction initFilterSidebar() {\n if (!$('[data-filterable-wrap]').length) return false;\n\n FilterSidebar.updateFiltersCounter();\n\n filterDropDownToggle();\n\n $(document).on('change', '[data-filter]', function () {\n let $this = $(this);\n FilterSidebar.apply($('[data-filterable-wrap]'), $(this));\n FilterSidebar.updateFiltersCounter();\n $('.card-banner').remove();\n\n }).on('change', '.js-pagination-mobile-order-by', function () {\n checkFiltersBottomActionsVisibility();\n })\n .on('click', '.clear-all', function (e) {\n e.preventDefault();\n $('.destination-index-tags').remove();\n FilterSidebar.clear($('[data-filterable-wrap]'));\n })\n .on('click', '.destination-index-tags .tag', function (event) {\n event.preventDefault();\n let $this = $(this);\n let id = $this.data('id');\n $('.js-filters-sidebar').find('#' + id).prop('checked', false)\n .change();\n })\n .on('click', '.js-filters-sidebar .select-all input', function (e) {\n let $this = $(this);\n\n if ($this.is(':checked')) {\n $this.closest('.filters').find('[data-filter]:not(:checked)').each(function (index, element) {\n $(element).prop('checked', true).change();\n });\n $this.addClass('selected');\n } else {\n $this.closest('.filters').find('[data-filter]').each(function (index, element) {\n $(element).prop('checked', false).change();\n });\n $this.removeClass('selected');\n }\n });\n\n initializeUtagEvents();\n}\n\nwindow.FilterSidebar = {\n init: initFilterSidebar,\n apply: applyFilters,\n empty: emptyLocalStorage,\n clear: clearFilters,\n contains: contains,\n countHotels: countHotels,\n getFilters: getLocalStorage,\n checkOptions: checkOptions,\n updateFiltersCounter: updateFiltersCounter,\n checkFiltersBottomActionsVisibility: checkFiltersBottomActionsVisibility\n};\n\n\nFilterSidebar.init();\n","// TODO: First refactor of this file on 202307\n/**\n * Filters\n *\n * Manage hotels info with filtering filters functionality.\n * - Send the requests to the server with the params needed\n * - Process the response, replacing current hotels with the HTML in the response's JSON\n */\n\nimport '../../../shared/filters_sidebar_mice/filters_sidebar_mice'\nimport '../../../utils/page_type_detector'\n\nimport _intersection from 'lodash/intersection'\nimport _union from 'lodash/union'\n\nimport { currentDevice } from '../../../core/utils/currentDevice'\nimport { closeLoader, openLoader } from '../../../elements/wait_loading/wait_loading'\nimport { updatePricesInfo } from '../../../shared/update_prices/update_prices'\nimport { fromStringToArr } from '../../../utils/from_string_to_array'\nimport { getLazyData } from '../../../utils/get_lazy_data'\n\nimport { DEFAULT_ORDER } from './pagination/pagination_constants'\nimport { dispatchHotelListUpdatedEvent } from './list_events'\n\nconst HOTELS_INFO_WITH_FILTERING_SELECTOR = '.js-hotels-info-with-filtering'\nconst LOCALSTORAGE_KEY = 'filter_hotel_ids'\n\nexport const UPDATE_FILTERS_EVENT = 'hotels-info-filter:update'\nexport const FILTERS_UPDATE_EVENT = 'filters:update'\n\nlet PaginationManager = null\nlet initialPageHotelIDs = null\nlet autoOfferList = null\nlet pagStatusText = null\nlet inResultsPage = null\nlet filterOff = false\nlet micePage = null\n\nfunction handleAvailabilityFinished(e) {\n //Set hotels without prices to append at the end of results in order by price\n if (e.fromCRSPricesSync) {\n e.idsToAppend && PaginationManager.setIdsToAppend(e.idsToAppend)\n }\n}\n\nfunction handlePaginationMobileOrderByClick(event) {\n if (event.target && event.target.classList.contains('js-pagination-mobile-order-by')) {\n const previouslySelectedOpt = document.querySelector('.js-pagination-mobile-order-by[checked]')\n previouslySelectedOpt && previouslySelectedOpt.removeAttribute('checked')\n\n event.target.setAttribute('checked', true)\n document.querySelector('[data-mobile-panel] .bottom-actions').classList.remove('hidden')\n }\n}\n\nfunction handleApplyFiltersClick(e) {\n if (e.target && e.target.classList.contains('js-apply-filters')) {\n const orderType = $('#order-list input[type=radio]:checked').attr('value')\n PaginationManager.updateState({ order: orderType })\n fetchHotels()\n }\n}\n\nfunction handleTagClick(e) {\n if (e.target && e.target.classList.contains('tag')) {\n document.querySelector(`.filters-sidebar #${e.target.dataset.id}`).click()\n }\n}\n\nfunction handleFiltersUpdate(e) {\n fetchHotels()\n FilterSidebar.updateFiltersCounter()\n}\n\nexport function init(PManager) {\n // PY04776-683 - 777523\n /**\n * Open fancybox modal after entering a booking page,\n * and thus block the user from checking filters before the request.\n * When the request ends, it will close as many modals as are open.\n */\n IB.currentPageType.isBookings() && openSpinner()\n\n PaginationManager = PManager\n inResultsPage = !!document.querySelector('#fb-results')\n initialPageHotelIDs = getAllHotelIDs()\n pagStatusText = document.querySelector('.pagination .status')\n // endpoint and parameter config\n autoOfferList = document.querySelector('.automatic-offer-list')\n micePage = document.querySelector('.results-search-meetings')\n\n //Stops init if hotels_info_with_filtering does not exist\n if (!document.querySelector('.hotels-info-with-filtering')) return\n\n if (currentDevice.isMobile || currentDevice.isLikeMobile) {\n document.addEventListener('click', handlePaginationMobileOrderByClick)\n\n if (document.querySelector('.filters-sidebar')) {\n document.querySelector('.filters-sidebar').addEventListener('click', clearFiltersMobile, { once: true })\n }\n }\n document.querySelectorAll('.filters-sidebar .with-counter input').forEach(el => {\n el.addEventListener('click', function (event) {\n if (el.parentElement.classList.contains('disabled')) {\n event.preventDefault()\n event.stopImmediatePropagation()\n return\n }\n\n if (checkBlockedFilter(el, event)) return\n\n if (currentDevice.isMobile || currentDevice.isLikeMobile) {\n const bottomActions = document.querySelector('[data-mobile-panel] .bottom-actions')\n\n if (!document.querySelectorAll('.filters-sidebar')[0].querySelectorAll('.checked')[0]) {\n filterOff = true\n }\n\n el.parentElement.classList.toggle('checked')\n el.classList.toggle('active')\n const hotelIDsToShow = getHotelIDsToShow()\n\n const filterType = el.closest('[data-filter-type]')?.dataset.filterType\n\n // not caching .bottom-actions in var because it is built via JS\n // and would not be available upfront\n if (hotelIDsToShow.length) {\n updateApplicableFilters(hotelIDsToShow, filterType)\n bottomActions?.classList.remove('hidden')\n } else {\n initialApplicableFilters()\n bottomActions?.classList.add('hidden')\n }\n } else {\n if (!el.checked) {\n // we are deactivating the filter\n el.parentElement.classList.toggle('checked')\n const tag = document.querySelector(`.filter-header [data-id=\"${el.id}\"]`)\n tag && tag.remove()\n }\n\n setTimeout(() => {\n fetchHotels(el)\n FilterSidebar.updateFiltersCounter()\n }, 0) // waits for all active/inactive filter classes to be applied\n }\n })\n })\n\n $(document).on('click', '.clear-all', clearFilters)\n\n document.addEventListener('click', handleApplyFiltersClick)\n\n document.addEventListener('click', handleTagClick)\n\n /**\n * Update Filters state\n *\n * Used for filters that are applied upfront from params in URL\n * Should manage filter-specific task related to that:\n * * Update applicable filters.\n * * Adds tags.\n *\n */\n document.addEventListener(FILTERS_UPDATE_EVENT, handleFiltersUpdate)\n\n if (typeof IB === 'undefined') {\n window.IB = {}\n }\n if (typeof IB.filters === 'undefined') {\n window.IB.filters = {}\n }\n window.IB.filters.getHotelIDsToShow = getHotelIDsToShow\n}\n\n// Remove all event listeners\nexport function destroyEvents() {\n document.removeEventListener('availability:finished', handleAvailabilityFinished)\n document.removeEventListener('click', handlePaginationMobileOrderByClick)\n document.removeEventListener('click', handleApplyFiltersClick)\n $(document).off('click', '.clear-all', clearFilters)\n document.removeEventListener('click', handleTagClick)\n document.removeEventListener(FILTERS_UPDATE_EVENT, handleFiltersUpdate)\n}\n\n/**\n * Opens modal when user clicks a blocked filter\n */\nfunction checkBlockedFilter(checkedFilter, event) {\n const allCheckedFilters = document.querySelectorAll('.filters-block .filters label.checked input')\n const $modal = document.querySelector('#deactivated-filter')\n checkedFilter.parentElement.classList.toggle('checked')\n let isBlocked = false\n\n if (!getHotelIDsToShow().length && allCheckedFilters.length > 1) {\n event.preventDefault()\n event.stopImmediatePropagation()\n $.fancybox.open($modal, {\n beforeShow() {\n ScrollLock.on()\n },\n beforeClose() {\n ScrollLock.off()\n },\n })\n isBlocked = true\n }\n checkedFilter.parentElement.classList.toggle('checked')\n\n return isBlocked\n}\n\n/**\n *\n * @returns An array with all hotel ids from \"hotels-info-with-filtering\" dataset\n */\nfunction getAllHotelIDs() {\n let hotelIDs = []\n const hotels_info_block = document.querySelector('.hotels-info-with-filtering')\n\n try {\n if (hotels_info_block !== null) hotelIDs = fromStringToArr(hotels_info_block.dataset.allHotels)\n } catch (error) {\n console.log(`Errors: ${error}`)\n }\n\n return hotelIDs\n}\n\n/**\n * Builds the endpoint with the hotel IDs for the selected filter\n * using current active filters\n * and calls the function that sends the request.\n *\n * @param {HTMLNode | null}\n * filterNode: The HTML node of the filter\n * null if called from \"clear all filters\" button\n *\n */\nfunction fetchHotels(filterNode) {\n if (filterNode && (!currentDevice.isMobile || !currentDevice.isLikeMobile)) {\n filterNode.classList.toggle('active')\n }\n\n const hotelIDsToShow = getHotelIDsToShow()\n const filterType = filterNode?.closest('[data-filter-type]')?.dataset.filterType\n if (hotelIDsToShow.length) {\n showAllFilters()\n updateApplicableFilters(hotelIDsToShow, filterType)\n if (!autoOfferList) {\n hidePagStatusText()\n }\n } else {\n hideAllFilters()\n initialApplicableFilters()\n if (!autoOfferList) {\n showPagStatusText()\n }\n }\n\n autoOfferList && updatePagStatusText(hotelIDsToShow)\n\n let hotelIDsToFetch = hotelIDsToShow.length ? hotelIDsToShow : initialPageHotelIDs\n\n if (inResultsPage && PaginationManager.state.order === DEFAULT_ORDER) {\n hotelIDsToFetch = PaginationManager.state.initialResourceIDs.filter(value => hotelIDsToFetch.includes(value))\n }\n if (inResultsPage && PaginationManager.state.order === 'descending_price') {\n hotelIDsToFetch = PaginationManager.state.initialResourceIDs\n .filter(value => hotelIDsToFetch.includes(value))\n .reverse()\n }\n PaginationManager.updateState({ ids: hotelIDsToFetch })\n if (!micePage) {\n fetchResults()\n }\n // else if (!$('#hotels-filter-map').is(':hidden')) {\n // IB.hotels_filter_map.filterVisible()\n // }\n\n // Dispatch Event when filters change\n const updateFiltersEvent = new Event(UPDATE_FILTERS_EVENT)\n const hotelInfoWithFiltering = document.querySelector(HOTELS_INFO_WITH_FILTERING_SELECTOR)\n\n if (hotelInfoWithFiltering) {\n hotelInfoWithFiltering.dispatchEvent(updateFiltersEvent)\n }\n}\n\n/**\n * Clear filters in desktop/tablet\n */\nexport function clearFilters(e, updateFilters = true) {\n e && e.preventDefault()\n document.querySelector('.destination-index-tags')?.remove()\n\n if (updateFilters && (currentDevice.isMobile || currentDevice.isLikeMobile)) {\n document\n .querySelectorAll('.mobile-panel.opened form #order-list input[type=radio]')\n .forEach(radio => radio.removeAttribute('checked'))\n document.querySelector('.mobile-panel.opened form #order-list input[type=radio]#ascending_price_panel').checked =\n true\n const orderType = $('#order-list input[type=radio]:checked').attr('value')\n PaginationManager.updateState({ order: orderType })\n document.querySelector('.mobile-panel.opened .close-mobile-panel').click()\n }\n\n filterOff = false\n\n const allFiltersInputs = document.querySelectorAll('.filters-sidebar .with-counter input')\n allFiltersInputs.forEach(input => {\n input.classList.remove('active')\n input.parentElement.classList.remove('checked') // the parent label\n input.checked = false\n })\n\n updateFilters && fetchHotels()\n}\n\n/**\n * Clear filters in mobile\n */\nfunction clearFiltersMobile(e) {\n // Evitamos duplicados de cargar filters en varios scripts\n setTimeout(() => {\n if (document.querySelector('.mobile-panel.filters-panel.js-filters-panel.right.ready.opened')) {\n if (document.querySelector('.filters-sidebar .checked') === null && filterOff) {\n filterOff = false\n document.querySelector('.filters-sidebar').removeEventListener('click', clearFiltersMobile)\n clearFilters(e)\n }\n }\n document.querySelector('.filters-sidebar').addEventListener('click', clearFiltersMobile, { once: true })\n FilterSidebar.updateFiltersCounter()\n }, 300)\n}\n\n/**\n * Hide all filters\n *\n */\nfunction hideAllFilters() {\n $('.hotels-info-with-filtering .bottom-actions').addClass('hidden')\n}\n\n/**\n * Show all filters\n *\n */\nfunction showAllFilters() {\n $('.hotels-info-with-filtering .bottom-actions').removeClass('hidden')\n}\n\n/**\n * Checks active filters and returns their IDs.\n *\n * @returns {array} hotelIDs: IDs from previously applied filters\n */\nfunction getHotelIDsToShow() {\n const acumulativeFilters = getIDsFromIntersectionOfAcumulativeFilters()\n const restrictiveFilters = getIDsFromIntersectionOfRestrictiveFilters()\n const hotelIDsToShow =\n !!acumulativeFilters.length && !!restrictiveFilters.length\n ? _intersection(acumulativeFilters, restrictiveFilters)\n : _union(acumulativeFilters, restrictiveFilters)\n localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(hotelIDsToShow))\n\n return hotelIDsToShow\n}\n\n/**\n * Gets all unique acumulative types.\n */\n\nfunction getAcumulativeTypes() {\n const allAcumulativeFilterActivated = [\n ...document.querySelectorAll('.filters-block.acumulatives .filters label.checked input'),\n ]\n let acumulativeTypes = []\n allAcumulativeFilterActivated.forEach(filter => {\n acumulativeTypes = _union(acumulativeTypes, [filter.dataset.filterType])\n })\n return acumulativeTypes\n}\n\nfunction getIDsFromIntersectionOfAcumulativeFilters() {\n const allCheckedAcumulativeFilters = document.querySelectorAll(\n '.filters-block.acumulatives .filters label.checked input'\n )\n const acumulativeTypes = getAcumulativeTypes()\n let acumulativeIntersection = []\n\n acumulativeTypes.forEach(acumulativeType => {\n let acumulation = []\n allCheckedAcumulativeFilters.forEach(filter => {\n const filterIds = getIDsFromFilterDataset(filter)\n const IDsFromFilter = Object.values(filterIds)[0]\n if (filter.dataset.filterType === acumulativeType) {\n acumulation = _union(acumulation, IDsFromFilter)\n }\n })\n acumulativeIntersection = acumulativeIntersection.length\n ? _intersection(acumulativeIntersection, acumulation)\n : _union(acumulativeIntersection, acumulation)\n })\n return acumulativeIntersection\n}\n\nfunction getIDsFromUnionOfAcumulativeFiltersByType() {\n const allCheckedAcumulativeFilters = document.querySelectorAll(\n '.filters-block.acumulatives .filters label.checked input'\n )\n const acumulativeTypes = getAcumulativeTypes()\n const acumulativeUnionByType = {}\n\n acumulativeTypes.forEach(acumulativeType => {\n let acumulation = []\n allCheckedAcumulativeFilters.forEach(filter => {\n const filterIds = getIDsFromFilterDataset(filter)\n const IDsFromFilter = Object.values(filterIds)[0]\n if (filter.dataset.filterType === acumulativeType) {\n acumulation = _union(acumulation, IDsFromFilter)\n }\n })\n acumulativeUnionByType[acumulativeType] = acumulation\n })\n return acumulativeUnionByType\n}\n\nfunction getIDsFromIntersectionOfRestrictiveFilters() {\n const allCheckedRestrictiveFilters = document.querySelectorAll(\n '.filters-block.restrictives .filters label.checked input'\n )\n let restrictiveIntersection = []\n\n allCheckedRestrictiveFilters.forEach(filter => {\n const filterIds = getIDsFromFilterDataset(filter)\n const IDsFromFilter = []\n\n for (const value of Object.values(filterIds)) {\n Array.prototype.push.apply(IDsFromFilter, value)\n }\n\n restrictiveIntersection = restrictiveIntersection.length\n ? _intersection(restrictiveIntersection, IDsFromFilter)\n : _union(restrictiveIntersection, IDsFromFilter)\n })\n return restrictiveIntersection\n}\n\nfunction getIDsFromFilterDataset(filter) {\n let filterIds = []\n try {\n filterIds = autoOfferList ? JSON.parse(filter.dataset.crsOffersByZone) : JSON.parse(filter.dataset.hotelsByZone)\n } catch (error) {\n console.log(`Errors: ${error}`)\n }\n return filterIds\n}\n\n/**\n * Iterate over the filters in page to check wether each one\n * of them is applicable or not based on the current selected.\n */\nfunction updateApplicableFilters(hotelIDsToShow, filterType) {\n if (hotelIDsToShow.length) {\n const allFilters = document.querySelectorAll('.filters-sidebar .deactivables .with-counter input')\n const idsFromIntersectionOfRestrictiveFilters = getIDsFromIntersectionOfRestrictiveFilters()\n const idsFromIntersectionOfAcumulativeFilters = getIDsFromIntersectionOfAcumulativeFilters()\n const idsFromUnionOfAcumulativeFiltersByType = getIDsFromUnionOfAcumulativeFiltersByType()\n for (let index = 0; index < allFilters.length; index++) {\n const filter = allFilters[index]\n const hotelIDs = getHotelIDsByFilter(filter)\n const isAcumulativeFilter = !!filter.closest('.acumulatives')\n const filterIntersection = _intersection(hotelIDs, hotelIDsToShow).length\n if (\n isAcumulativeFilter &&\n filterType === filter.closest('[data-filter-type]').dataset.filterType &&\n idsFromIntersectionOfAcumulativeFilters.length\n )\n continue\n\n isAcumulativeFilter\n ? updateAcumulativeFilters(\n filter,\n hotelIDs,\n filterIntersection,\n idsFromUnionOfAcumulativeFiltersByType,\n idsFromIntersectionOfRestrictiveFilters\n )\n : updateGeneralFilters(filter, filterIntersection)\n }\n }\n}\n\nfunction updateAcumulativeFilters(\n filter,\n hotelIDs,\n filterIntersection,\n idsFromUnionOfAcumulativeFiltersByType,\n idsFromIntersectionOfRestrictiveFilters\n) {\n const filterType = filter.dataset.filterType\n const _idsFromUnionOfAcumulativeFiltersByType = { ...idsFromUnionOfAcumulativeFiltersByType }\n const acumulativeTypes = getAcumulativeTypes()\n const restAccumulativeFiltersEmpty =\n !acumulativeTypes.length || (acumulativeTypes.length === 1 && acumulativeTypes[0] === filterType)\n const isChecked = filter.checked\n let filteredResults = filterIntersection\n\n if (!idsFromIntersectionOfRestrictiveFilters.length) {\n filteredResults = _intersection(hotelIDs, initialPageHotelIDs).length\n }\n\n // Get valid ids from another acumulative filters blocks\n _idsFromUnionOfAcumulativeFiltersByType[filterType] && delete _idsFromUnionOfAcumulativeFiltersByType[filterType]\n let currentAccumulativeFilterValidIDs = Object.values(_idsFromUnionOfAcumulativeFiltersByType).flat(1)\n // remove duplicates\n currentAccumulativeFilterValidIDs = [...new Set(currentAccumulativeFilterValidIDs)]\n\n const passesRestrictiveFilters =\n !idsFromIntersectionOfRestrictiveFilters.length ||\n hotelIDs.some(hotelId => idsFromIntersectionOfRestrictiveFilters.includes(hotelId))\n const passesOtherAccumulativeFilters =\n restAccumulativeFiltersEmpty || hotelIDs.some(hotelId => currentAccumulativeFilterValidIDs.includes(hotelId))\n\n const isEnabled = passesRestrictiveFilters && passesOtherAccumulativeFilters && filteredResults\n\n if (isEnabled) {\n filter.parentElement.classList.remove('disabled')\n\n // Could be enabled but not checked. In this case its necessary calculate how many ids passes all filters ignoring current accumulative type\n if (!isChecked && currentAccumulativeFilterValidIDs.length && !idsFromIntersectionOfRestrictiveFilters.length) {\n filteredResults = _intersection(hotelIDs, currentAccumulativeFilterValidIDs).length\n }\n } else {\n filter.parentElement.classList.add('disabled')\n filter.classList.remove('active')\n filter.parentElement.classList.remove('checked')\n\n const filterToRemove = document.querySelector(`.filter-header [data-id=\"${filter.id}\"]`)\n if (filterToRemove !== null) filterToRemove.remove()\n }\n const $hotel_count = filter.parentElement.querySelector('.hotel-count')\n if ($hotel_count) {\n $hotel_count.classList.add('is-hidden')\n const counterEl = filter.parentElement.querySelector('.auto-count')\n counterEl.classList.remove('hidden')\n const counterText = filteredResults === 1 ? counterEl.dataset.one : counterEl.dataset.other\n counterEl.innerText = counterText.replace('{{count}}', filteredResults)\n }\n}\n\nfunction initialApplicableFilters() {\n const allFiltersInputs = document.querySelectorAll('.filters-sidebar .deactivables .with-counter input')\n\n allFiltersInputs.forEach(filterInput => {\n const $hotel_count = filterInput.parentElement.querySelector('.hotel-count')\n const $auto_count = filterInput.parentElement.querySelector('.auto-count')\n if ($auto_count) $auto_count.classList.add('hidden')\n if ($hotel_count) $hotel_count.classList.remove('is-hidden')\n filterInput.parentElement.classList.remove('disabled')\n })\n}\n\nfunction updateGeneralFilters(filter, filterIntersection) {\n if (filterIntersection) {\n filter.parentElement.classList.remove('disabled')\n } else {\n filter.parentElement.classList.add('disabled')\n\n if (filter.parentElement.classList.contains('checked')) {\n filter.classList.remove('active')\n filter.parentElement.classList.remove('checked')\n\n const filterToRemove = document.querySelector(`.filter-header [data-id=\"${filter.id}\"]`)\n if (filterToRemove !== null) filterToRemove.remove()\n }\n }\n const $hotel_count = filter.parentElement.querySelector('.hotel-count')\n if ($hotel_count) {\n $hotel_count.classList.add('is-hidden')\n const counterEl = filter.parentElement.querySelector('.auto-count')\n counterEl.classList.remove('hidden')\n const counterText = filterIntersection === 1 ? counterEl.dataset.one : counterEl.dataset.other\n counterEl.innerText = counterText.replace('{{count}}', filterIntersection)\n }\n}\n\nfunction getHotelIDsByFilter(filter) {\n const hotelIds = []\n let hotelsByZoneObject\n\n if (autoOfferList) {\n hotelsByZoneObject = JSON.parse(filter.dataset.crsOffersByZone)\n } else {\n hotelsByZoneObject = filter.dataset.hotelsByZone ? JSON.parse(filter.dataset.hotelsByZone) : {}\n }\n\n for (const value of Object.values(hotelsByZoneObject)) {\n Array.prototype.push.apply(hotelIds, value)\n }\n return hotelIds\n}\n\n/**\n * Sends the request to the endpoint and executes the callback to update page\n */\nfunction fetchResults() {\n openSpinner()\n togglePreventFurtherClicks()\n\n let offer_type = ''\n if ($('.automatic-offer-list').length) {\n offer_type = $('.automatic-offer-list').data('crsOfferType')\n }\n\n let offer_id = ''\n if (document.querySelector('html').dataset['pageType'] === 'offer') {\n offer_id = document.querySelector('html').dataset['resourceId']\n }\n\n const url = PaginationManager.getEndpoint({ for_bookings_page: inResultsPage, offer_type, offer_id })\n\n getLazyData(url, function (response, isResponseOK) {\n if (!isResponseOK) {\n closeSpinner()\n return\n }\n const data = JSON.parse(response)\n updatePage(data)\n inResultsPage && IB.booking_results.forceCRSprices()\n\n if (currentDevice.isMobile || currentDevice.isLikeMobile) {\n document.querySelector('.mobile-panel .close-mobile-panel').click()\n }\n\n if (response?.utag_add_product_impressions) {\n if (inResultsPage) {\n IB?.utag_eec_events?.utagLinkProductImpressionPaginationSearch(\n JSON.parse(response['utag_add_product_impressions']),\n PaginationManager.getCurrentPage()\n )\n } else {\n IB?.utag_eec_events?.utagLinkProductImpressionPagination(\n JSON.parse(response['utag_add_product_impressions']),\n PaginationManager.getCurrentPage()\n )\n }\n }\n\n // removes spinner and allow filters interactivity again\n closeSpinner()\n togglePreventFurtherClicks()\n\n if (autoOfferList) {\n //Event for reset counters in automatic offers\n const endFiltersEvent = new Event('appliedFilterResults')\n document.dispatchEvent(endFiltersEvent)\n }\n\n // add images in the response to observer,\n // initialize tooltips functionality.\n IB.lazyImg.addImgToObserver($('.hotels-info-with-filtering'))\n document.querySelectorAll('.hotel-list [data-tooltip]').forEach(tooltip => {\n IB.tooltip.init($(tooltip))\n })\n IB.currencyForm.forceUpdate()\n updatePricesInfo()\n IB.hotel_card_slider_mobile_gallery.init()\n\n // Si el mapa está visible/existe\n // if (!$('#hotels-filter-map').is(':hidden')) IB.hotels_filter_map.filterVisible()\n\n dispatchHotelListUpdatedEvent()\n })\n}\n\n/*\n * Fill the hotel list div with the HTML from the results json, updates elements' classes\n */\nfunction updatePage(response) {\n if (autoOfferList) {\n document.querySelector('.hotel-list.hotel-list-with-filtering').innerHTML = response.html_replacements\n } else {\n document.querySelector('.hotels-info-with-filtering [data-block-list]').innerHTML = response.html_replacements\n }\n\n const paginationUpdateEvent = new Event('pagination:update')\n paginationUpdateEvent.hotelIDs = response.all_ids_hotel_by_order\n paginationUpdateEvent.page = PaginationManager.getCurrentPage()\n document.dispatchEvent(paginationUpdateEvent)\n\n const visibleHotels = JSON.parse(response.all_ids_hotel_by_order).length\n const total_counter = document.querySelector('.total-hotels-counter')\n const message_hotels_not_found = document.querySelector('.message-hotels-not-found')\n\n if (total_counter === null) {\n return false\n }\n\n if (visibleHotels) {\n message_hotels_not_found?.classList.add('hidden')\n total_counter.querySelector('.counter').textContent = visibleHotels\n total_counter.classList.remove('hidden')\n } else {\n message_hotels_not_found?.classList.remove('hidden')\n total_counter.classList.add('hidden')\n }\n}\n\nfunction openSpinner() {\n openLoader()\n}\n\nfunction closeSpinner() {\n closeLoader()\n}\n\n/**\n * Prevents sending more requests when already sent one\n * with a class with rule cursor-events: none\n */\nfunction togglePreventFurtherClicks() {\n document.querySelector('.filters-sidebar').classList.toggle('loading')\n}\n\n/**\n * Hides pagination text \"X - Y of Z Hotels in/for ...\"\n *\n * Does not make sense when filtering. Implementing hiding it\n * when filtering for Black Friday release. May come back.\n */\nfunction hidePagStatusText() {\n if (pagStatusText) pagStatusText.classList.add('invisible')\n}\n\nfunction showPagStatusText() {\n if (pagStatusText) pagStatusText.classList.remove('invisible')\n}\n\nfunction updatePagStatusText(selectedHotels) {\n const counter = document.querySelector('.js-pagination-total-hotels')\n if (counter) {\n counter.innerText = selectedHotels.length === 0 ? initialPageHotelIDs.length : selectedHotels.length\n }\n}\n\nexport function getCheckedFilters() {\n window.IB.filters.getHotelIDsToShow()\n}\n","export const HOTEL_LIST_UPDATED_EVENT = 'hotel-list:list-updated'\n\n// Dispatch hotel list updated event\nexport function dispatchHotelListUpdatedEvent() {\n document.dispatchEvent(new CustomEvent(HOTEL_LIST_UPDATED_EVENT))\n}\n","//\n// ORDER OPTIONS\n// must match data-order-types attributes in order selector's HTML\n//\nexport const ALPHABETICAL_ORDER_OPTIONS = ['alphabetical_order_up', 'alphabetical_order_down'];\n\nexport const PRICE_ORDER_OPTIONS = ['ascending_price', 'descending_price'];\n\nexport const DATE_ORDER_OPTIONS = ['ascending_date', 'descending_date'];\n\nexport const RECOMMENDED_ORDER_OPTIONS = 'recommended';\n\nexport const HOTEL_WITHOUT_PRICE = 'hotel_ids_without_price';\n\nexport const OTHER_ORDER_OPTIONS = ['category', RECOMMENDED_ORDER_OPTIONS];\n\nexport const VALID_ORDER_VALUES = ALPHABETICAL_ORDER_OPTIONS + PRICE_ORDER_OPTIONS + DATE_ORDER_OPTIONS + OTHER_ORDER_OPTIONS;\n\nconst AUTO_OFFER_LIST_PRESENT = document.querySelector('.automatic-offer-list');\n\nexport const DEFAULT_ORDER = RECOMMENDED_ORDER_OPTIONS;\n\nexport const PAGINATION_CONFIG = {\n hotels_info_with_filtering: {\n action: 'ajax_contents/hotels_pagination',\n maxResourcesPerPage: 6,\n resourceParam: 'hotel_ids',\n },\n automatic_offer_list: {\n action: 'ajax_contents/crs_offers_pagination',\n maxResourcesPerPage: 7,\n resourceParam: 'crs_offer_ids',\n },\n}\n","import Modal from '../../shared/modal/modal'\n\nexport function openLoader() {\n Modal.show('wait-loading', {\n onShow: () => ScrollLock.on(),\n onClose: () => ScrollLock.off(),\n })\n}\n\nexport function closeLoader() {\n Modal.close()\n}\n\nfunction init() {\n const loadingPage = IB.currentPageType.isNeedsLoaderPage()\n if (loadingPage) {\n openLoader()\n }\n}\n\ninit()\n","import { readCookie } from '../../utils/cookie_manager'\n\nconst user_resident = readCookie('resident')\nlet currency = readCookie('currency')\n\nif (typeof currency === 'undefined' || currency === null) {\n currency = 'DEF'\n}\n\nfunction isResident(resident_type) {\n return user_resident !== undefined && resident_type !== undefined && user_resident == resident_type\n}\n\nexport function updatePricesInfo() {\n $.each($('.price-info'), function (index, element) {\n const $this = $(this)\n const base_price = parseInt($this.data('base-price'))\n const resident_price = parseInt($this.data('resident-price'))\n const resident_type = $this.data('resident-type')\n let final_price = parseInt($this.data('price'))\n\n if (\n isResident(resident_type) &&\n resident_price !== null &&\n typeof resident_price !== 'undefined' &&\n !isNaN(resident_price)\n ) {\n final_price = resident_price\n }\n if (final_price < base_price) {\n const $text = $($this.find('[data-now-text]')[0])\n const text = $text.data('now-text')\n $text.text(text)\n // Cambiamos el data para la ordenación\n $this.closest('div.card').attr('data-price', final_price)\n\n // Texto 'desde' en ofertas\n $this.find('p.text-before-price').hide()\n } else {\n $this.find('.price-before, [data-price-before]').hide()\n }\n\n // remove prices skeleton\n $this.closest('.call-to-action').find('.price-info-fake').remove()\n })\n}\n","/**\n * fromStringToArr\n *\n * Parse and returns an array from an\n * array inside a String.\n *\n * Regex Fragment | Meaning\n * ==============================\n * [ ] | Match characters that are...\n * \" | ... double-quote\n * | | OR\n * \\[ | ... opening bracket\n * | | OR\n * \\] | ... closing bracket\n */\n\nexport function fromStringToArr(arrString) {\n let result = [];\n let arrOfStringValues = arrString.replace(/\"|\\[|\\]/g, '').split(',');\n\n arrOfStringValues.map((strNumber) => result.push(+strNumber));\n\n return result;\n}\n"],"names":["BLOCK_SELECTOR","LOCALSTORAGE_KEY","AUTO_OFFER_LIST_PRESENT","document","querySelectorAll","filters","destinations","categories","specialties","amenities","budgets","currentHotels","getLocalStorage","search","localStorage","getItem","e","JSON","parse","initializeOrFindSearch","applyFilters","$wrapper","$element","$elements","find","length","$filters_sidebar","$","available_options","global_counter","$total_counter","$total_counter_mice","map","filter_value","this","val","attr","parseInt","push","currentDevice","isMobile","isLikeMobile","undefined","createAllCheckedTags","removeClass","checkFiltersBottomActionsVisibility","$filtered_els","filter","$this","data","_filter","o","index","each","key","_uniq","concat","hasClass","combineText","getVisibleHotels","omit","f_destinations","f_other_obj","_omit","filters_omit","_omitBy","_isEmpty","valid_destination","valid_options","valid","counter","visibleHotels","obj","some","dest","_includes","_pickBy","value","_size","_forEach","_difference","_values","not","addClass","text","i","element","$actual","toggleClass","disableFiltersWithoutVisibleElements","trigger","is","IB","hotels_filter_map","filterVisible","html","spanText","parent","total_filters","forEach","options","dataset","filterable","hotels","option","options_name","Object","keys","every","r","includes","getVisibleHotelsInHotelPage","FilterSidebar","updateFiltersCounter","$select_all","closest","prop","change","$checkboxes","visibleHotelNumberInFilter","hotel","values","flat","getHotelsThatMatchCategory","$inputs","toArray","reduce","acc","hotelsByCountry","country","intersectArrays","Array","prototype","slice","call","arguments","array","intersectTwoArrays","a","b","grep","inArray","$span","count","total","trans_one","trans_other","replace","hotelId","filterHotels","selectedContinent","hotelIds","$bottomActions","currentPageType","get","css","$orderOptionList","hide","filterDropDownToggle","on","eventName","selector","handler","filter_block","title","querySelector","classList","toggle","slideToggle","toggleFilters","window","init","apply","remove","preventDefault","clear","event","id","continent","getAttribute","sendUtagEvent","event_name","event_cat","event_act","event_lbl","event_purpose","event_structure","checked","getCleanedString","empty","removeItem","kinds","contains","v","indexOf","countHotels","$checked","$checkedCategories","$checkedSpecialties","$checkedAmenities","hotelsAvailableByCategory","hotelsAvailableBySpecialty","hotelsAvailableByAmenity","result","extend","hotelsToIntersect","newResult","unique","f","getFilters","checkOptions","filters_values","hotelsCount","elem","$el","$counterLabel","hotelsByZone","parentElement","add","HOTELS_INFO_WITH_FILTERING_SELECTOR","UPDATE_FILTERS_EVENT","FILTERS_UPDATE_EVENT","PaginationManager","initialPageHotelIDs","autoOfferList","pagStatusText","inResultsPage","filterOff","micePage","handleAvailabilityFinished","fromCRSPricesSync","idsToAppend","setIdsToAppend","handlePaginationMobileOrderByClick","target","previouslySelectedOpt","removeAttribute","setAttribute","handleApplyFiltersClick","orderType","updateState","order","fetchHotels","handleTagClick","click","handleFiltersUpdate","PManager","isBookings","openSpinner","hotelIDs","hotels_info_block","fromStringToArr","allHotels","error","console","log","getAllHotelIDs","addEventListener","clearFiltersMobile","once","el","stopImmediatePropagation","checkedFilter","allCheckedFilters","$modal","isBlocked","getHotelIDsToShow","fancybox","open","beforeShow","ScrollLock","beforeClose","off","checkBlockedFilter","bottomActions","hotelIDsToShow","filterType","updateApplicableFilters","initialApplicableFilters","tag","setTimeout","clearFilters","destroyEvents","removeEventListener","filterNode","selectedHotels","innerText","updatePagStatusText","hotelIDsToFetch","state","DEFAULT_ORDER","initialResourceIDs","reverse","ids","togglePreventFurtherClicks","offer_type","offer_id","url","getEndpoint","for_bookings_page","getLazyData","response","isResponseOK","closeSpinner","innerHTML","html_replacements","paginationUpdateEvent","Event","all_ids_hotel_by_order","page","getCurrentPage","dispatchEvent","total_counter","message_hotels_not_found","textContent","updatePage","booking_results","forceCRSprices","utag_add_product_impressions","utag_eec_events","utagLinkProductImpressionPaginationSearch","utagLinkProductImpressionPagination","endFiltersEvent","lazyImg","addImgToObserver","tooltip","currencyForm","forceUpdate","updatePricesInfo","hotel_card_slider_mobile_gallery","dispatchHotelListUpdatedEvent","fetchResults","updateFiltersEvent","hotelInfoWithFiltering","updateFilters","radio","input","acumulativeFilters","getIDsFromIntersectionOfAcumulativeFilters","restrictiveFilters","getIDsFromIntersectionOfRestrictiveFilters","_intersection","_union","setItem","stringify","getAcumulativeTypes","allAcumulativeFilterActivated","acumulativeTypes","allCheckedAcumulativeFilters","acumulativeIntersection","acumulativeType","acumulation","filterIds","getIDsFromFilterDataset","IDsFromFilter","allCheckedRestrictiveFilters","restrictiveIntersection","crsOffersByZone","allFilters","idsFromIntersectionOfRestrictiveFilters","idsFromIntersectionOfAcumulativeFilters","idsFromUnionOfAcumulativeFiltersByType","acumulativeUnionByType","getIDsFromUnionOfAcumulativeFiltersByType","getHotelIDsByFilter","isAcumulativeFilter","filterIntersection","updateAcumulativeFilters","updateGeneralFilters","_idsFromUnionOfAcumulativeFiltersByType","restAccumulativeFiltersEmpty","isChecked","filteredResults","currentAccumulativeFilterValidIDs","Set","passesRestrictiveFilters","passesOtherAccumulativeFilters","filterToRemove","$hotel_count","counterEl","counterText","one","other","filterInput","$auto_count","hotelsByZoneObject","openLoader","closeLoader","getCheckedFilters","HOTEL_LIST_UPDATED_EVENT","CustomEvent","ALPHABETICAL_ORDER_OPTIONS","PRICE_ORDER_OPTIONS","DATE_ORDER_OPTIONS","RECOMMENDED_ORDER_OPTIONS","HOTEL_WITHOUT_PRICE","OTHER_ORDER_OPTIONS","VALID_ORDER_VALUES","PAGINATION_CONFIG","hotels_info_with_filtering","action","maxResourcesPerPage","resourceParam","automatic_offer_list","Modal","show","onShow","onClose","close","isNeedsLoaderPage","user_resident","readCookie","currency","base_price","resident_price","resident_type","final_price","isResident","isNaN","$text","arrString","split","strNumber"],"sourceRoot":""}