{"version":3,"sources":["global-world/global-world.js"],"names":["globalWorld","document","querySelector","apiUrl","getAttribute","markerIconUrl","markerDownIconUrl","markerLeftIconUrl","markerRightIconUrl","mapDiv","getElementById","backgroundVideo","imageCityButtons","querySelectorAll","cityButtons","locationFindOutMore","initialRegion","regionMaps","Array","from","mapInitialized","currentMap","currentMarkers","currentCity","swiperContainer","response","fetch","ok","console","error","data","json","dropdownContainer","allCities","Continents","flatMap","region","Cities","log","map","i","Id","Name","continentCodeToName","code","regions","forEach","regionData","index","regionSection","createElement","classList","add","setAttribute","regionTitle","ContinentCode","innerText","addEventListener","toggleDropdown","cityList","city","cityItem","toLowerCase","appendChild","push","initButtonState","contains","parentSection","closest","but","remove","handleLocationClick","initRegions","filteredCards","Locations","getLocations","renderCards","globeFilterCards","initializeSwiper","loadCards","window","isMobile","innerWidth","toggleMapView","toggleRegionImage","europeTitle","asiaTitle","europeList","asiaList","europeCityButtons","asiaCityButtons","activeCity","button","toggle","show","regionImage","filter","regionMobileImage","marker","removeLayer","markers","getMarkersForCity","addMarkersToMap","maxZoom","invalidateSize","setTimeout","fitMapToBounds","updateMapCenter","cityCoordinates","getCityCenter","L","center","zoom","zoomControl","scrollWheelZoom","dragging","doubleClickZoom","tap","tileLayer","attribution","addTo","whenReady","initializeMap","cityId","dataset","regionName","correspondingCityButton","name","regionCode","find","continent","findRegionByName","id","findCityById","parseFloat","Latitude","Longitude","markerPosition","customIcon","icon","iconUrl","iconAnchor","iconSize","mapMarker","position","bindTooltip","popupText","permanent","offset","direction","interactive","on","smoothScroll","addLeftMarker","addRightMarker","addDownMarker","addMarker","markerGroup","featureGroup","padding","fitBounds","getBounds","pad","targetId","targetElement","offsetPosition","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","card","showCardsByCity","showCardsByRegion","cityDetails","locations","length","groupedLocations","reduce","acc","location","key","Object","values","firstlocation","MapLabel","LocationName","title","MaxZoomLevel","MarkerPosition","cards","containerId","isSwiper","innerHTML","replace","LocationCity","ImageSizes","ImageSrcSet","ImageUrl","ImageAlt","ShortDescription","facilities","html","facility","IconSvgPath","ShortDescriptions","getFacilitiesHtml","Facilities","LocationUrl","createCard","join","prevButton","nextButton","Swiper","slidesPerView","spaceBetween","pagination","el","clickable","navigation","nextEl","prevEl","swiper","destroy"],"mappings":"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","sourcesContent":["(async () => {\r\n const globalWorld = document.querySelector(\".global-world\");\r\n if (!globalWorld) {\r\n return;\r\n }\r\n\r\n const apiUrl = globalWorld.getAttribute('data-api-url');\r\n const markerIconUrl = globalWorld.getAttribute('data-marker-icon-url');\r\n const markerDownIconUrl = globalWorld.getAttribute('data-marker-down-icon-url');\r\n const markerLeftIconUrl = globalWorld.getAttribute('data-marker-left-icon-url');\r\n const markerRightIconUrl = globalWorld.getAttribute('data-marker-right-icon-url');\r\n const mapDiv = document.getElementById(\"map\");\r\n const backgroundVideo = document.getElementById(\"backgroundVideo\");\r\n const imageCityButtons = globalWorld.querySelectorAll(\".global-world__map-city\");\r\n const cityButtons = [];\r\n const locationFindOutMore = globalWorld.getAttribute('data-find-out-more') || 'Find out more';\r\n const initialRegion = globalWorld.getAttribute('data-initial-region') || '';\r\n const regionMaps = Array.from(globalWorld.querySelectorAll('.global-world__map-region-image'));\r\n\r\n let mapInitialized = false;\r\n let currentMap = null;\r\n let currentMarkers = [];\r\n let currentCity = null; // To keep track of the currently selected city\r\n\r\n const swiperContainer = document.querySelector('.global-world-cards .swiper-container');\r\n\r\n const response = await fetch(apiUrl);\r\n if (!response.ok) {\r\n console.error(`Failed to fetch data from ${apiUrl}`);\r\n return;\r\n }\r\n\r\n const data = await response.json();\r\n const dropdownContainer = globalWorld.querySelector(\".dropdown-container\");\r\n\r\n const allCities = data.Continents.flatMap((region) => region.Cities);\r\n console.log(allCities.map(i => { return { Id: i.Id, Name: i.Name}}));\r\n\r\n const continentCodeToName = (code) => {\r\n return code === \"EU\" ? \"europe\" : \"asia\";\r\n };\r\n\r\n const initRegions = (regions) => {\r\n regions.forEach((regionData, index) => {\r\n const regionSection = document.createElement(\"div\");\r\n regionSection.classList.add(\"global-world__menu-section\");\r\n regionSection.setAttribute(\"data-city\", \"\");\r\n\r\n if (index > 0) {\r\n regionSection.classList.add(\"pt-4\");\r\n }\r\n\r\n const regionTitle = document.createElement(\"span\");\r\n regionTitle.classList.add(\r\n \"global-world__dd-title\",\r\n \"text-[3rem]\",\r\n \"font-medium\",\r\n \"text-[#000000D9]\"\r\n );\r\n regionTitle.setAttribute(\"data-region\", regionData.ContinentCode);\r\n regionTitle.innerText = regionData.Name;\r\n regionTitle.addEventListener(\"click\", () => {\r\n toggleDropdown(regionData.ContinentCode);\r\n });\r\n\r\n const cityList = document.createElement(\"ul\");\r\n cityList.classList.add(\r\n 'global-container__dropdown-list',\r\n `list-${regionData.ContinentCode === \"EU\" ? \"one\" : \"two\"}`,\r\n `overflow-hidden`\r\n );\r\n\r\n regionData.Cities.forEach((city) => {\r\n const cityItem = document.createElement(\"li\");\r\n cityItem.classList.add(\r\n \"global-world__city\",\r\n \"pt-8\",\r\n \"!text-[#000000D9]\",\r\n \"cursor-pointer\",\r\n \"text-3xl\",\r\n \"font-normal\"\r\n );\r\n cityItem.setAttribute(\"data-city-id\", city.Id);\r\n cityItem.setAttribute(\"data-city\", city.Name.toLowerCase());\r\n cityItem.setAttribute(\"data-region\", regionData.ContinentCode);\r\n cityItem.innerText = city.Name;\r\n\r\n cityList.appendChild(cityItem);\r\n cityButtons.push(cityItem);\r\n\r\n // add event listener to cityItem\r\n cityItem.addEventListener(\"click\", () => {\r\n const initButtonState = cityItem.classList.contains(\"global-world__active\");\r\n const parentSection = cityItem.closest(\".global-world__menu-section\");\r\n\r\n cityButtons.forEach((but) => {\r\n but.classList.remove(\"global-world__active\");\r\n });\r\n if (!initButtonState) {\r\n parentSection.setAttribute(\"data-city\", city);\r\n cityItem.classList.add(\"global-world__active\");\r\n } else {\r\n parentSection.setAttribute(\"data-city\", \"\");\r\n }\r\n handleLocationClick(city, regionData);\r\n });\r\n });\r\n\r\n regionSection.appendChild(regionTitle);\r\n regionSection.appendChild(cityList);\r\n dropdownContainer.appendChild(regionSection);\r\n });\r\n\r\n if (initialRegion) {\r\n toggleDropdown(initialRegion);\r\n }\r\n };\r\n\r\n initRegions(data.Continents);\r\n initLocationResults(data.Continents);\r\n\r\n const findRegionByName = (name) => {\r\n const regionCode = name === \"europe\" ? \"EU\" : \"AS\";\r\n return data.Continents.find((continent) => continent.ContinentCode === regionCode);\r\n };\r\n\r\n const findCityById = (region, id) => {\r\n return region.Cities.find((city) => city.Id === id);\r\n };\r\n \r\n imageCityButtons.forEach((button) => {\r\n let cityId = button.dataset.cityId;\r\n let regionName = button.dataset.region;\r\n let correspondingCityButton = globalWorld.querySelector(\r\n `.global-world__city[data-city-id=\"${cityId}\"]`\r\n );\r\n button.addEventListener(\"click\", () => {\r\n cityButtons.forEach((but) => {\r\n but.classList.remove(\"global-world__active\");\r\n });\r\n correspondingCityButton.classList.add(\"global-world__active\");\r\n\r\n const region = findRegionByName(regionName);\r\n if (!region) {\r\n console.error(`Region ${regionName} not found`);\r\n return;\r\n }\r\n\r\n const city = findCityById(region, cityId);\r\n if (!city) {\r\n console.error(`City ${cityId} not found in region ${regionName}`);\r\n return;\r\n }\r\n\r\n handleLocationClick(city, region);\r\n });\r\n });\r\n\r\n function handleLocationClick(city, region) {\r\n if (currentCity === city.Name) {\r\n currentCity = null;\r\n globeFilterCards(null, region); // Ensure region's cards are shown\r\n toggleMapView(false); // Hide the map\r\n toggleRegionImage(continentCodeToName(region.ContinentCode), true); // Show the region image\r\n } else {\r\n currentCity = city.Name;\r\n globeFilterCards(city, null);\r\n toggleMapView(true, city); // Show the map for the selected city\r\n toggleRegionImage(continentCodeToName(region.ContinentCode), false); // Hide the region image\r\n }\r\n }\r\n\r\n function toggleDropdown(region) {\r\n const europeTitle = globalWorld.querySelector(\r\n \".global-world__dd-title[data-region='EU']\"\r\n );\r\n const asiaTitle = globalWorld.querySelector(\r\n \".global-world__dd-title[data-region='AS']\"\r\n );\r\n const europeList = globalWorld.querySelector(\".list-one\");\r\n const asiaList = globalWorld.querySelector(\".list-two\");\r\n const europeCityButtons = europeList.querySelectorAll(\r\n \".global-world__city\"\r\n );\r\n const asiaCityButtons = asiaList.querySelectorAll(\".global-world__city\");\r\n\r\n if (region === \"EU\") {\r\n let activeCity = false;\r\n europeCityButtons.forEach((button) => {\r\n if (button.classList.contains(\"global-world__active\")) {\r\n activeCity = true;\r\n button.classList.remove(\"global-world__active\");\r\n }\r\n });\r\n asiaCityButtons.forEach((button) => {\r\n button.classList.remove(\"global-world__active\");\r\n });\r\n\r\n if (!activeCity) {\r\n europeTitle.classList.toggle(\"open\");\r\n europeList.classList.toggle(\"open\");\r\n asiaTitle.classList.remove(\"open\");\r\n asiaList.classList.remove(\"open\");\r\n }\r\n\r\n mapDiv.classList.remove(\"visible\");\r\n toggleRegionImage(\"asia\", false);\r\n toggleRegionImage(\"europe\", true);\r\n globeFilterCards(null, \"EU\");\r\n } else if (region === \"AS\") {\r\n let activeCity = false;\r\n asiaCityButtons.forEach((button) => {\r\n if (button.classList.contains(\"global-world__active\")) {\r\n activeCity = true;\r\n button.classList.remove(\"global-world__active\");\r\n }\r\n });\r\n europeCityButtons.forEach((button) => {\r\n button.classList.remove(\"global-world__active\");\r\n });\r\n if (!activeCity) {\r\n asiaTitle.classList.toggle(\"open\");\r\n asiaList.classList.toggle(\"open\");\r\n europeTitle.classList.remove(\"open\");\r\n europeList.classList.remove(\"open\");\r\n }\r\n mapDiv.classList.remove(\"visible\");\r\n toggleRegionImage(\"europe\", false);\r\n toggleRegionImage(\"asia\", true);\r\n globeFilterCards(null, \"AS\");\r\n }\r\n\r\n if (\r\n europeList.classList.contains(\"open\") ||\r\n asiaList.classList.contains(\"open\")\r\n ) {\r\n backgroundVideo.classList.add(\"globe-hidden\");\r\n } else {\r\n backgroundVideo.classList.remove(\"globe-hidden\");\r\n toggleRegionImage(\"europe\", false);\r\n toggleRegionImage(\"asia\", false);\r\n globeFilterCards(null, \"all\");\r\n }\r\n }\r\n\r\n function toggleRegionImage(region, show) {\r\n const regionImage = regionMaps.filter(i => i.getAttribute('data-format') === 'desktop' && i.getAttribute('data-continent') === region)[0];\r\n const regionMobileImage = regionMaps.filter(i => i.getAttribute('data-format') === 'mobile' && i.getAttribute('data-continent') === region)[0];\r\n if (regionImage) {\r\n if (show) {\r\n regionImage.classList.add(\"visible\");\r\n if (regionMobileImage) regionMobileImage.classList.add(\"visible\");\r\n } else {\r\n regionImage.classList.remove(\"visible\");\r\n if (regionMobileImage) regionMobileImage.classList.remove(\"visible\");\r\n }\r\n }\r\n }\r\n\r\n function toggleMapView(show, city = null) {\r\n if (show) {\r\n if (!mapInitialized) {\r\n initializeMap(city);\r\n mapInitialized = true;\r\n } else {\r\n updateMapCenter(city);\r\n }\r\n mapDiv.classList.add(\"visible\");\r\n if (currentMap) {\r\n currentMap.invalidateSize();\r\n }\r\n } else {\r\n mapDiv.classList.remove(\"visible\");\r\n }\r\n }\r\n\r\n let isMobile = window.innerWidth < 768;\r\n\r\n const getCityCenter = (city) => {\r\n return [parseFloat(city.Latitude), parseFloat(city.Longitude)];\r\n };\r\n\r\n function initializeMap(city) {\r\n const cityCoordinates = getCityCenter(city);\r\n const markers = getMarkersForCity(city);\r\n\r\n currentMap = L.map(\"map\", {\r\n center: cityCoordinates,\r\n zoom: markers[0].maxZoom || 12,\r\n zoomControl: false,\r\n scrollWheelZoom: false,\r\n dragging: isMobile ? true : false,\r\n doubleClickZoom: false,\r\n tap: false,\r\n });\r\n\r\n L.tileLayer(\r\n \"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png\",\r\n {\r\n attribution:\r\n '© OpenStreetMap contributors © CARTO',\r\n }\r\n ).addTo(currentMap);\r\n\r\n currentMap.whenReady(function () {\r\n currentMap.invalidateSize();\r\n\r\n addMarkersToMap(markers);\r\n \r\n const maxZoom = markers[0].maxZoom || 12;\r\n setTimeout(() => {\r\n fitMapToBounds(maxZoom);\r\n }, 0);\r\n });\r\n }\r\n\r\n function addMarkersToMap(markers) {\r\n markers.forEach((marker) => {\r\n switch (marker.markerPosition) {\r\n case 'Left':\r\n addLeftMarker(marker);\r\n break;\r\n case 'Right':\r\n addRightMarker(marker);\r\n break;\r\n case 'Down':\r\n addDownMarker(marker);\r\n break;\r\n default:\r\n addMarker(marker);\r\n break;\r\n }\r\n });\r\n }\r\n\r\n function fitMapToBounds(maxZoom) {\r\n if (currentMap) {\r\n const markerGroup = new L.featureGroup(currentMarkers);\r\n const padding = isMobile ? 20 : 0.5;\r\n //console.log('padding', padding);\r\n currentMap.fitBounds(markerGroup.getBounds().pad(padding), {\r\n maxZoom: maxZoom || 12\r\n });\r\n }\r\n }\r\n\r\n function addDownMarker(marker) {\r\n const customIcon = L.icon({\r\n iconUrl: markerDownIconUrl,\r\n iconAnchor: [10, 5],\r\n iconSize: [19, 96], // size of the icon\r\n });\r\n\r\n const mapMarker = L.marker(marker.position, { icon: customIcon })\r\n .addTo(currentMap)\r\n .bindTooltip(`
${marker.popupText}
`, {\r\n permanent: true,\r\n offset: [0, 50],\r\n direction: \"bottom\",\r\n interactive: true\r\n });\r\n\r\n mapMarker.on(\"click\", function () {\r\n smoothScroll(\"combined-cards\");\r\n });\r\n\r\n currentMarkers.push(mapMarker);\r\n }\r\n\r\n function addLeftMarker(marker) {\r\n const customIcon = L.icon({\r\n iconUrl: markerLeftIconUrl,\r\n iconAnchor: [40, 10],\r\n iconSize: [49, 19], // size of the icon\r\n });\r\n\r\n const mapMarker = L.marker(marker.position, { icon: customIcon })\r\n .addTo(currentMap)\r\n .bindTooltip(`
${marker.popupText}
`, {\r\n permanent: true,\r\n offset: [-25, 0],\r\n direction: \"left\",\r\n interactive: true\r\n });\r\n\r\n mapMarker.on(\"click\", function () {\r\n smoothScroll(\"combined-cards\");\r\n });\r\n\r\n currentMarkers.push(mapMarker);\r\n }\r\n\r\n function addRightMarker(marker) {\r\n const customIcon = L.icon({\r\n iconUrl: markerRightIconUrl,\r\n iconAnchor: [10, 10],\r\n iconSize: [45, 19], // size of the icon\r\n });\r\n\r\n const mapMarker = L.marker(marker.position, { icon: customIcon })\r\n .addTo(currentMap)\r\n .bindTooltip(`
${marker.popupText}
`, {\r\n permanent: true,\r\n offset: [20, 0],\r\n direction: \"right\",\r\n interactive: true\r\n });\r\n\r\n mapMarker.on(\"click\", function () {\r\n smoothScroll(\"combined-cards\");\r\n });\r\n\r\n currentMarkers.push(mapMarker);\r\n }\r\n\r\n function addMarker(marker) {\r\n const customIcon = L.icon({\r\n iconUrl: markerIconUrl,\r\n iconAnchor: [10, 105],\r\n iconSize: [19, 115], // size of the icon\r\n });\r\n\r\n const mapMarker = L.marker(marker.position, { icon: customIcon })\r\n .addTo(currentMap)\r\n .bindTooltip(`
${marker.popupText}
`, {\r\n permanent: true,\r\n offset: [0, -40],\r\n direction: \"top\",\r\n interactive: true\r\n });\r\n\r\n mapMarker.on(\"click\", function () {\r\n smoothScroll(\"combined-cards\");\r\n });\r\n\r\n currentMarkers.push(mapMarker);\r\n }\r\n\r\n function updateMapCenter(city) {\r\n if (currentMap) {\r\n\r\n // Remove existing markers\r\n currentMarkers.forEach((marker) => {\r\n currentMap.removeLayer(marker);\r\n });\r\n currentMarkers = [];\r\n\r\n // Add markers for the new city\r\n const markers = getMarkersForCity(city);\r\n addMarkersToMap(markers);\r\n\r\n const maxZoom = markers[0].maxZoom || 12;\r\n currentMap.invalidateSize();\r\n\r\n setTimeout(() => {\r\n fitMapToBounds(maxZoom);\r\n }, 0);\r\n }\r\n }\r\n\r\n function smoothScroll(targetId) {\r\n const targetElement = document.getElementById(targetId);\r\n if (targetElement) {\r\n const offset = 150; // Offset in pixels\r\n const elementPosition = targetElement.getBoundingClientRect().top;\r\n const offsetPosition = elementPosition + window.pageYOffset - offset;\r\n\r\n window.scrollTo({\r\n top: offsetPosition,\r\n behavior: \"smooth\",\r\n });\r\n }\r\n }\r\n\r\n function showAllCards() {\r\n const cards = document.querySelectorAll(\"[data-location]\");\r\n cards.forEach((card) => {\r\n card.classList.remove(\"globe-hidden\");\r\n });\r\n }\r\n\r\n function showCardsByRegion(region) {\r\n console.log(region);\r\n const cards = document.querySelectorAll(\"[data-location]\");\r\n cards.forEach((card) => {\r\n if (card.getAttribute(\"data-region\") === region) {\r\n card.classList.remove(\"globe-hidden\");\r\n } else {\r\n card.classList.add(\"globe-hidden\");\r\n }\r\n });\r\n }\r\n\r\n function showCardsByCity(city) {\r\n const cards = document.querySelectorAll(\"[data-location]\");\r\n cards.forEach((card) => {\r\n if (card.getAttribute(\"data-city\") === city) {\r\n card.classList.remove(\"globe-hidden\");\r\n } else {\r\n card.classList.add(\"globe-hidden\");\r\n }\r\n });\r\n }\r\n\r\n function globeFilterCards(city, region) {\r\n if (region === \"all\") {\r\n showAllCards();\r\n } else if (city) {\r\n showCardsByCity(city.Name.toLowerCase());\r\n } else {\r\n showCardsByRegion(region);\r\n }\r\n }\r\n\r\n function getMarkersForCity(cityDetails) {\r\n const locations = cityDetails.Locations;\r\n if (!locations || locations.length === 0) {\r\n return [];\r\n }\r\n\r\n // group the locations by latitude and longitude\r\n const groupedLocations = locations.reduce((acc, location) => {\r\n const key = `${location.Latitude}-${location.Longitude}`;\r\n if (!acc[key]) {\r\n acc[key] = [];\r\n }\r\n acc[key].push(location);\r\n return acc;\r\n }, {});\r\n\r\n const markers = Object.values(groupedLocations).map((locations) => {\r\n const firstlocation = locations[0];\r\n\r\n return {\r\n position: [parseFloat(firstlocation.Latitude), parseFloat(firstlocation.Longitude)],\r\n popupText: (firstlocation.MapLabel && locations.length > 1 ? firstlocation.MapLabel : firstlocation.LocationName) + (locations.length > 1 ? ` (${locations.length})` : ''),\r\n title: firstlocation.LocationName,\r\n maxZoom: cityDetails.MaxZoomLevel || 12,\r\n markerPosition: firstlocation.MarkerPosition,\r\n };\r\n });\r\n\r\n return markers;\r\n }\r\n\r\n function createCard(card, isSwiper = false) {\r\n const cardId = card.LocationName.toLowerCase().replace(' ', '-');\r\n const baseClass = isSwiper ? \"swiper-slide\" : \"bg-[#FBFEFD] flex flex-col justify-start items-start text-start h-auto\";\r\n\r\n const getFacilitiesHtml = (facilities) => {\r\n if (!facilities) {\r\n return '';\r\n }\r\n\r\n let html = '
';\r\n\r\n facilities.forEach((facility, index) => {\r\n html += `\r\n
\r\n \"${facility.ShortDescriptions}\"\r\n

${facility.ShortDescriptions}

\r\n
\r\n `;\r\n\r\n if (index < facilities.length - 1) {\r\n html += '
';\r\n }\r\n });\r\n\r\n html += '
';\r\n return html;\r\n };\r\n\r\n const htmlBlock = `\r\n
\r\n
\r\n \"${card.ImageAlt}\"\r\n
\r\n
\r\n

${card.LocationName}

\r\n

${card.ShortDescription}

\r\n ${getFacilitiesHtml(card.Facilities)}\r\n ${locationFindOutMore}\r\n
\r\n
`;\r\n\r\n return htmlBlock;\r\n }\r\n\r\n function renderCards(cards, containerId, isSwiper = false) {\r\n const container = document.getElementById(containerId);\r\n container.innerHTML = cards.map(card => createCard(card, isSwiper)).join('');\r\n }\r\n\r\n // Function to initialize Swiper only on mobile view\r\n function initializeSwiper() {\r\n if (window.innerWidth <= 768) {\r\n if (!document.querySelector('.swiper-container-initialized')) {\r\n const prevButton = document.querySelector('.swiper-button-prev');\r\n const nextButton = document.querySelector('.swiper-button-next');\r\n new Swiper('.swiper-container', {\r\n slidesPerView: 1.2,\r\n spaceBetween: 20,\r\n // centeredSlides: true,\r\n pagination: {\r\n el: '.swiper-pagination',\r\n clickable: true,\r\n },\r\n // Navigation arrows\r\n navigation: {\r\n nextEl: nextButton,\r\n prevEl: prevButton\r\n },\r\n });\r\n swiperContainer.classList.add('swiper-container-initialized');\r\n }\r\n } else {\r\n const swiper = document.querySelector('.swiper-container').swiper;\r\n if (swiper) {\r\n swiper.destroy(true, true);\r\n }\r\n swiperContainer.classList.remove('swiper-container-initialized');\r\n }\r\n }\r\n\r\n function getLocations(region) {\r\n // return a list of all locations in the region\r\n const locations = region.Cities.flatMap(city => city.Locations);\r\n return locations;\r\n }\r\n\r\n function getAllLocations() {\r\n // return a list of all locations in all regions\r\n const locations = data.Continents.flatMap(region => getLocations(region));\r\n return locations;\r\n }\r\n\r\n // Function to filter and render cards based on location\r\n function loadCards() {\r\n const filteredCards = getAllLocations();\r\n renderCards(filteredCards, 'grid-cards-container');\r\n renderCards(filteredCards, 'swiper-cards-container', true);\r\n if (initialRegion) {\r\n globeFilterCards(null, initialRegion);\r\n }\r\n initializeSwiper();\r\n }\r\n\r\n function initLocationResults() {\r\n // Initial render of all cards\r\n loadCards();\r\n\r\n window.addEventListener('resize', function () {\r\n initializeSwiper();\r\n isMobile = window.innerWidth < 768;\r\n });\r\n }\r\n})();\r\n"],"file":"global-world-min.js"}