PageSourceSearch

https://www.lidl.de/s/storesearch-frontend/26_19_4/store-search-utils.js

js lidl.de collected 2026-09-24 09:06:23 UTC 4,216 bytes, 162 lines download raw bytes

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.