1import { locales } from "./locales.js"; 2 3export function prepareStoreSearchAndOpen(data) { 4 if (!document.getElementById("storesearch")) { 5 let nodeMap = document.createElement("div"); 6 nodeMap.id = "storesearch"; 7 document.body.appendChild(nodeMap); 8 9 if (!data.searchFieldStandalone) { 10 let nodeDialog = document.createElement("div"); 11 nodeDialog.classList.add("store-search__dialog"); 12 13 let nodeWrapper = document.createElement("div"); 14 nodeWrapper.classList.add("store-search__wrapper"); 15 16 let nodeLoader = document.createElement("div"); 17 nodeLoader.className = "store-search__loader"; 18 nodeWrapper.appendChild(nodeLoader); 19 nodeDialog.appendChild(nodeWrapper); 20 document.body.appendChild(nodeDialog); 21 } 22 23 //fallback - remove loading dialog after 30sec 24 setTimeout(function loadingNotSuccessful() { 25 const element = document.querySelector(".store-search__dialog"); 26 if (element) { 27 element.remove(); 28 } 29 }, 30000); 30 31 loadJsIfNeeded(data); 32 loadCssIfNeeded(); 33 } else { 34 openStoreSearch(data); 35 } 36} 37 38function openStoreSearch(data) { 39 window.storeSearchReady = undefined; 40 const event = new CustomEvent("storesearch:open", { detail: data }); 41 window.dispatchEvent(event); 42} 43 44function loadJsIfNeeded(data) { 45 //TODO check if js already loaded independent from version number 46 if ( 47 !document.querySelector( 48 'script[src*="/s/storesearch-frontend/26_19_4/entry/index.js"]', 49 ) 50 ) { 51 //Register global ready Callback 52 window.storeSearchReady = () => { 53 openStoreSearch(data); 54 }; 55 let script = document.createElement("script"); 56 script.src = 57 "/s/storesearch-frontend/26_19_4/entry/index.js"; 58 script.async = false; 59 script.type = "module"; 60 script.defer = true; 61 document.head.append(script); 62 } else { 63 openStoreSearch(data); 64 } 65} 66 67function loadCssIfNeeded() { 68 //TODO check if css already loaded independent from version number 69 if ( 70 !document.querySelector( 71 'link[href*="/s/storesearch-frontend/26_19_4/css/index.css"]', 72 ) 73 ) { 74 let style = document.createElement("link"); 75 style.href = "/s/storesearch-frontend/26_19_4/css/index.css"; 76 style.rel = "stylesheet"; 77 style.type = "text/css"; 78 document.head.append(style); 79 } 80} 81 82/** 83 * Loads store-search-pop-up.js 84 */ 85export function loadPopUpScript() { 86 const scriptPath = 87 "/s/storesearch-frontend/26_19_4/store-search-pop-up.js"; 88 89 if (document.querySelector(`script[src="${scriptPath}"]`)) { 90 return Promise.resolve(); 91 } 92 return new Promise((resolve, reject) => { 93 const script = document.createElement("script"); 94 script.src = scriptPath; 95 script.type = "module"; 96 script.async = true; 97 98 script.onload = () => { 99 resolve(); 100 }; 101 102 script.onerror = (error) => { 103 console.error("Error loading pop-up script.", error); 104 reject(error); 105 }; 106 107 document.head.appendChild(script); 108 }); 109} 110 111export function selectAppCountry(windowCountry, windowLocale) { 112 if (windowCountry) { 113 return windowCountry; 114 } 115 116 const locale = selectAppLocale(windowLocale); 117 if (locale && locale.includes("-")) { 118 return locale.split("-")[1]; 119 } 120 121 return ""; 122} 123 124export function selectAppLocale(windowLocale) { 125 if (windowLocale) { 126 return windowLocale; 127 } 128 console.warn( 129 "locale and/or country from mindShiftNav is not available ... trying browser fallbacks", 130 ); 131 132 if (typeof navigator !== "undefined" && navigator.languages?.length > 0) { 133 for (const lang of navigator.languages) { 134 const locale = resolveLocale(lang); 135 if (locale) { 136 console.info("Uses browser fallback from navigator.languages", locale); 137 return locale; 138 } 139 } 140 } 141 142 console.error("Browser fallback can't be used"); 143 return undefined; 144} 145 146function resolveLocale(locale) { 147 if (!locale && !locales) { 148 return undefined; 149 } 150 151 const normalizedLocales = locale.replace("_", "-"); 152 const supportedLocales = locales; 153 154 const matchedLocale = supportedLocales.find( 155 (loc) => loc.toLowerCase() === normalizedLocales.toLowerCase(), 156 ); 157 if (matchedLocale) { 158 return matchedLocale; 159 } 160 161 return undefined; 162}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.