1// COUNTRIES MOCKS 2const countries = { 3 BG: { 4 countryCode: 'BG', 5 englishName: 'Bulgaria', 6 defaultLanguage: 'BG', 7 languageVersions: { 8 BG: { 9 countryName: 'ÐÑлгаÑиÑ', 10 languageName: 'бÑлгаÑÑки език', 11 storeURL: '/bg/bg/', 12 notification: 'ÐоÑÑÑкиÑе Ñе бÑÐ´Ð°Ñ Ð¸Ð·Ð¿Ñлнени в ÐÑлгаÑиÑ.', 13 goToStore: 'ÐлезÑе в онлайн магазина', 14 logoSubheader: 'Ðие Ñме в 19 ÑÑÑани', 15 contentInfo: 'Ðа да пÑодÑлжиÑе, ÑÑÑбва да избеÑеÑе ÑÑÑанаÑа на доÑÑавка' 16 } 17 } 18 }, 19 BA: { 20 countryCode: 'BA', 21 englishName: 'Bosnia and Herzegovina', 22 defaultLanguage: 'BA', 23 languageVersions: { 24 BA: { 25 countryName: 'Bosna i Hercegovina', 26 languageName: 'b/h/s jezik', 27 storeURL: '/ba/bs/', 28 notification: 'Narudžba Äe biti zavrÅ¡ena za Bosne i Hercegovine.', 29 goToStore: 'Idi u prodavnicu', 30 logoSubheader: 'Nalazimo se u 19 zemalja', 31 contentInfo: 'Da biste nastavili, morate izabrati zemlju dostave' 32 } 33 } 34 }, 35 CZ: { 36 countryCode: 'CZ', 37 englishName: 'Czech Republic', 38 defaultLanguage: 'CZ', 39 languageVersions: { 40 CZ: { 41 countryName: 'Äeská republika', 42 languageName: 'Äeský jazyk', 43 storeURL: '/cz/cz/', 44 notification: 'Objednávky budou vyÅÃzeny v Äeské republice.', 45 goToStore: 'PÅejÃt do obchodu', 46 logoSubheader: 'Jsme v 19 zemÃch', 47 contentInfo: 'Chcete-li pokraÄovat, musÃte vybrat zemi doruÄenÃ' 48 } 49 } 50 }, 51 DE: { 52 countryCode: 'DE', 53 englishName: 'Germany', 54 defaultLanguage: 'DE', 55 languageVersions: { 56 DE: { 57 countryName: 'Deutschland', 58 languageName: 'Deutsche Sprache', 59 storeURL: '/de/de/', 60 notification: 'Die Bestellungen werden in Deutschland ausgeführt.', 61 goToStore: 'Shop ansehen', 62 logoSubheader: 'Wir liefern in 19 Länder', 63 contentInfo: 'Um fortzufahren, wähle bitte das Zielland aus' 64 } 65 } 66 }, 67 EE: { 68 countryCode: 'EE', 69 englishName: 'Estonia', 70 defaultLanguage: 'EE', 71 languageVersions: { 72 EE: { 73 countryName: 'Eesti', 74 languageName: 'Eesti keel', 75 storeURL: '/ee/et/', 76 notification: 'Tellimused täidetakse Eestis.', 77 goToStore: 'Külasta kauplust', 78 logoSubheader: 'Tegutseme 19 riigis', 79 contentInfo: 'Jätkamiseks vali riik' 80 } 81 } 82 }, 83 GR: { 84 countryCode: 'GR', 85 englishName: 'Greece', 86 defaultLanguage: 'GR', 87 languageVersions: { 88 GR: { 89 countryName: 'Îλλάδα', 90 languageName: 'Îλληνική γλÏÏÏα', 91 storeURL: '/gr/el/', 92 notification: 'Îι ÏαÏÎ±Î³Î³ÎµÎ»Î¯ÎµÏ Î¸Î± ÏÏαγμαÏοÏοιηθοÏν ÏÏο Îλλάδα.', 93 goToStore: 'Πήγαινε ÏÏο καÏάÏÏημα', 94 logoSubheader: 'ÎÏιÏκÏμαÏÏε Ïε 19 ÏÏÏεÏ', 95 contentInfo: 'Îια να ÏÏ Î½ÎµÏίÏεÏε ÏÏÎÏει να εÏιλÎξεÏε Ïη ÏÏÏα αÏοÏÏολήÏ' 96 } 97 } 98 }, 99 HR: { 100 countryCode: 'HR', 101 englishName: 'Croatia', 102 defaultLanguage: 'HR', 103 languageVersions: { 104 HR: { 105 countryName: 'Hrvatska', 106 languageName: 'Hrvatski jezik', 107 storeURL: '/hr/hr/', 108 notification: 'Narudžbe Äe biti isporuÄene u Hrvatskoj.', 109 goToStore: 'Odi u trgovinu', 110 logoSubheader: 'Mi smo u 19 zemalja', 111 contentInfo: 'Ako želite nastaviti, odaberite zemlju dostave' 112 } 113 } 114 }, 115 IT: { 116 countryCode: 'IT', 117 englishName: 'Italy', 118 defaultLanguage: 'IT', 119 languageVersions: { 120 IT: { 121 countryName: 'Italia', 122 languageName: 'Lingua italiana', 123 storeURL: '/it/it/', 124 notification: 'Gli ordini saranno evasi in Italia.', 125 goToStore: 'Vai al negozio', 126 logoSubheader: 'Siamo in 19 paesi', 127 contentInfo: 'Per continuare, seleziona il Paese di consegna' 128 } 129 } 130 }, 131 LV: { 132 countryCode: 'LV', 133 englishName: 'Latvia', 134 defaultLanguage: 'LV', 135 languageVersions: { 136 LV: { 137 countryName: 'Latvija', 138 languageName: 'LatvieÅ¡u valoda', 139 storeURL: '/lv/lv/', 140 notification: 'PasÅ«tÄ«jumi tiks izpildÄ«ti LatvijÄ.', 141 goToStore: 'Iet uz veikalu', 142 logoSubheader: 'MÄs atrodamies 19 valstÄ«s', 143 contentInfo: 'Lai turpinÄtu, jÄizvÄlas piegÄdes valsts' 144 } 145 } 146 }, 147 LT: { 148 countryCode: 'LT', 149 englishName: 'Lithuania', 150 defaultLanguage: 'LT', 151 languageVersions: { 152 LT: { 153 countryName: 'Lietuva', 154 languageName: 'lietuvių kalba', 155 storeURL: '/lt/lt/', 156 notification: 'Užsakymai bus įvykdyti Lietuvoje.', 157 goToStore: 'Užsukite į parduotuvÄ', 158 logoSubheader: 'Esame 19 Å¡alių', 159 contentInfo: 'NorÄdami tÄsti, turite pasirinkti pristatymo Å¡alį' 160 } 161 } 162 }, 163 HU: { 164 countryCode: 'HU', 165 englishName: 'Hungary', 166 defaultLanguage: 'HU', 167 languageVersions: { 168 HU: { 169 countryName: 'Magyarország', 170 languageName: 'magyar nyelv', 171 storeURL: '/hu/hu/', 172 notification: 'A megrendeléseket Magyarországon teljesÃtik.', 173 goToStore: 'Vissza az üzletbe', 174 logoSubheader: '19 országban vagyunk jelen', 175 contentInfo: 'A folytatáshoz ki kell választanod a szállÃtási országot' 176 } 177 } 178 }, 179 PL: { 180 countryCode: 'PL', 181 englishName: 'Poland', 182 defaultLanguage: 'PL', 183 languageVersions: { 184 PL: { 185 countryName: 'Polska', 186 languageName: 'jÄzyk polski', 187 storeURL: '/pl/pl/', 188 notification: 'Zamówienia bÄdÄ realizowane na terenie Polski.', 189 goToStore: 'Idź do sklepu', 190 logoSubheader: 'JesteÅmy w 19 krajach', 191 contentInfo: 'Aby kontynuowaÄ musisz wybraÄ kraj dostawy' 192 } 193 } 194 }, 195 RO: { 196 countryCode: 'RO', 197 englishName: 'Romania', 198 defaultLanguage: 'RO', 199 languageVersions: { 200 RO: { 201 countryName: 'România', 202 languageName: 'Limba românÄ', 203 storeURL: '/ro/ro/', 204 notification: 'Comenzile vor fi onorate în România.', 205 goToStore: 'Mergi la magazin', 206 logoSubheader: 'Suntem în 19 ÈÄri', 207 contentInfo: 'Pentru a continua trebuie sÄ selectaÈi Èara de livrare' 208 } 209 } 210 }, 211 MK: { 212 countryCode: 'MK', 213 englishName: 'North Macedonia', 214 defaultLanguage: 'MK', 215 languageVersions: { 216 MK: { 217 countryName: 'СевеÑна ÐакедониÑа', 218 languageName: 'македонÑки Ñазик', 219 storeURL: '/mk/mk/', 220 notification: 'ÐаÑаÑкиÑе Ñе Ð±Ð¸Ð´Ð°Ñ Ð¸ÑполнеÑи во СевеÑна ÐакедониÑа.', 221 goToStore: 'ÐдеÑе ÐºÐ°Ñ Ð¿ÑодавниÑа', 222 logoSubheader: 'Ðе има во 19 земÑи', 223 contentInfo: 'Ðа да пÑодолжиÑе, моÑаÑе да Ñа ÑелекÑиÑаÑе земÑаÑа на иÑпоÑака' 224 } 225 } 226 }, 227 SI: { 228 countryCode: 'SI', 229 englishName: 'Slovenia', 230 defaultLanguage: 'SI', 231 languageVersions: { 232 SI: { 233 countryName: 'Slovenija', 234 languageName: 'slovenski jezik', 235 storeURL: '/si/sl/',
236 notification: 'Dostava je možna le na naslove v Sloveniji.', 237 goToStore: 'Pojdi v trgovino', 238 logoSubheader: 'Smo v 19 državah', 239 contentInfo: 'Za nadaljevanje morate izbrati državo dostave' 240 } 241 } 242 }, 243 SK: { 244 countryCode: 'SK', 245 englishName: 'Slovakia', 246 defaultLanguage: 'SK', 247 languageVersions: { 248 SK: { 249 countryName: 'Slovensko', 250 languageName: 'slovenský jazyk', 251 storeURL: '/sk/sk/', 252 notification: 'Objednávky budú vybavené v Slovensku.', 253 goToStore: 'PrejsÅ¥ do obchodu', 254 logoSubheader: 'Sme v 19 krajinách', 255 contentInfo: 'Ak chcete pokraÄovaÅ¥, musÃte vybraÅ¥ krajinu doruÄenia' 256 } 257 } 258 }, 259 RS: { 260 countryCode: 'RS', 261 englishName: 'Serbia', 262 defaultLanguage: 'RS', 263 languageVersions: { 264 RS: { 265 countryName: 'Srbija', 266 languageName: 'Srpski jezik', 267 storeURL: '/rs/sr/', 268 notification: 'Porudžbina Äe biti zavrÅ¡ena u Srbiji.', 269 goToStore: 'Idi na prodavnicu', 270 logoSubheader: 'Nalazimo se u 19 zemalja', 271 contentInfo: 'Da biste nastavili, morate izabrati zemlju dostave' 272 } 273 } 274 }, 275 UA: { 276 countryCode: 'UA', 277 englishName: 'Ukraine', 278 defaultLanguage: 'UA', 279 languageVersions: { 280 UA: { 281 countryName: 'УкÑаÑна', 282 languageName: 'ÑкÑаÑнÑÑка мова', 283 storeURL: '/ua/uk/', 284 notification: 'ÐÐ°Ð¼Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±Ñде виконано ÑеÑез УкÑаÑнÑ.', 285 goToStore: 'Ðо магазинÑ', 286 logoSubheader: 'Ðи вÑдкÑиÑÑ Ñ 19 кÑаÑÐ½Ð°Ñ ÑвÑÑÑ', 287 contentInfo: 'Щоб пÑодовжиÑи, Ð½ÐµÐ¾Ð±Ñ Ñдно вибÑаÑи кÑаÑÐ½Ñ Ð´Ð¾ÑÑавки' 288 } 289 } 290 }, 291 ZZ: { 292 countryCode: 'ZZ', 293 englishName: 'Global store', 294 defaultLanguage: 'EN', 295 languageVersions: { 296 EN: { 297 countryName: 'Global store', 298 languageName: 'english', 299 storeURL: '/sq/en/', 300 notification: 'In this store, you will only be able to explore our brand collections.', 301 goToStore: 'Go to store', 302 logoSubheader: 'We are in 19 countries', 303 contentInfo: 'To continue you must select the delivery country' 304 } 305 }, 306 }, 307 SELECT: { 308 countryCode: 'select', 309 englishName: 'Select', 310 defaultLanguage: 'select', 311 languageVersions: { 312 select: { 313 countryName: 'Select', 314 languageName: '', 315 storeURL: '', 316 notification: '', 317 goToStore: 'Go to store', 318 logoSubheader: 'We are in 19 countries', 319 contentInfo: 'To continue you must select the delivery country' 320 } 321 } 322 } 323} 324 325// CONSTANTS 326const browserLang = (window.navigator.language).slice(0,2).toUpperCase(); 327const cookieLang = 'Lang'; 328const isStoreSelectorBannerShown = 'isStoreSelectorBannerShown'; 329const isStoreSelectorBannerShownValue = 'true'; 330const defaultCountryName = 'Global store'; 331const defaultCountryCode = 'ZZ'; 332const globalStoreCountryCode = 'SQ'; 333const selectCountryName = 'Select'; 334const selectCountryCode = 'SELECT'; 335 336// HTML ELEMENTS 337const storeSelectorLogoSubheader = document.querySelector('.store-selector-logo-subheader'); 338const storeSelectorContentInfo = document.querySelector('.store-selector-content-info'); 339const storeSelectorValueContainer = document.querySelector('.store-selector-value-container'); 340const storeSelectorIconFlagContainer = document.querySelector('.store-selector-icon-flag-container'); 341const storeSelectorIconValue = document.querySelector('.store-selector-icon-value'); 342const storeSelectorValue = document.querySelector('.store-selector-value'); 343const storeSelectorIconChevron = document.querySelector('.store-selector-chevron'); 344const storeSelectorList = document.querySelector('.store-selector-list'); 345const storeSelectorSeoList = document.querySelector('.store-selector-seo-list'); 346const storeSelectorItemAnchors = document.querySelectorAll('.store-selector-item-anchor'); 347const storeSelectorNotification = document.querySelector('.store-selector-notification'); 348const storeSelectorChipsContainer = document.querySelector('.store-selector-chips'); 349const storeSelectorButton = document.querySelector('.store-selector-button'); 350 351 352// EVENTS 353document.addEventListener('DOMContentLoaded', () => { 354 355 // CREATE BASIC VALUE 356 getDefaultValue(); 357 358 // CREATE COUNTRIES LIST 359 addCountriesList(countries); 360 361 // REMOVE SEO LIST FROM DOM 362 storeSelectorSeoList.remove(); 363 364 // REMOVE REDIRECTS
365 storeSelectorItemAnchors.forEach(anchor => { 366 anchor.addEventListener('click', (event) => { 367 event.preventDefault(); 368 }); 369 }); 370 371 // OUTSIDE LIST CLICK 372 window.addEventListener('click', (event) => { 373 if (!/value|icon|list|item/.exec(event.target.classList.value)) { 374 storeSelectorList.classList.remove('store-selector-visible'); 375 storeSelectorIconChevron.classList.remove('store-selector-chevron-rotate'); 376 storeSelectorValueContainer.classList.remove('store-selector-value-container-active'); 377 } 378 }); 379 380 // INSIDE INPUT LIST CLICK 381 storeSelectorValueContainer.addEventListener('click', () => { 382 const storeSelectorItems = document.querySelectorAll('.store-selector-item'); 383 384 storeSelectorItems.forEach(item => { 385 if (storeSelectorValue.textContent.includes(item.textContent)) { 386 item.classList.add('store-selector-item-active'); 387 } else { 388 item.classList.remove('store-selector-item-active'); 389 } 390 }); 391 392 storeSelectorValueContainer.classList.toggle('store-selector-value-container-active'); 393 storeSelectorList.classList.toggle('store-selector-visible'); 394 storeSelectorIconChevron.classList.toggle('store-selector-chevron-rotate'); 395 }); 396}) 397 398// METHODS 399const getDefaultValue = () => { 400 const langCookie = getCookieValue(cookieLang); 401 const cookieLangCountryCode = langCookie.length ? 402 langCookie.split('/').slice(1,2)[0].toUpperCase() === defaultCountryCode ? globalStoreCountryCode : 403 langCookie.split('/').slice(1,2)[0].toUpperCase() : ''; 404 const defaultCountry = langCookie && langCookie.length ? 405 countries[cookieLangCountryCode] : countries[countryCode.toUpperCase()] || countries[selectCountryCode]; 406 407 if (defaultCountry.englishName === selectCountryName) { 408 storeSelectorValue.classList.add('store-selector-value-select'); 409 } else { 410 storeSelectorValue.classList.remove('store-selector-value-select'); 411 } 412 413 handleCountry(defaultCountry) 414} 415 416const addCountriesList = (countriesObj) => { 417 const countries = Object.assign({}, countriesObj) 418 delete countries['SELECT']; 419 420 const countriesList = Object.values(countries); 421 422 countriesList.forEach((country) => { 423 let selectedLanguage = browserLang !== country.defaultLanguage ? 424 Object.keys(country.languageVersions).includes(browserLang) ? 425 country.languageVersions[browserLang] : country.languageVersions[country.defaultLanguage] : 426 country.languageVersions[country.defaultLanguage]; 427 428 let countryItem = document.createElement('li'); 429 let iconContainer = document.createElement('div'); 430 let icon = document.createElement('div'); 431 let anchor = document.createElement('a'); 432 433 icon.classList.add('store-selector-icon'); 434 icon.classList.add(`store-selector-icon-flag-${country.countryCode.toUpperCase()}`); 435 436 iconContainer.classList.add('store-selector-icon-container'); 437 iconContainer.appendChild(icon); 438 439 anchor.classList.add('store-selector-item-anchor'); 440 441 anchor.href = selectedLanguage.storeURL; 442 443 anchor.innerText = handleItemValue(country.englishName, selectedLanguage.countryName) 444 445 anchor.addEventListener('click', (event) => { 446 event.preventDefault(); 447 }); 448 449 countryItem.classList.add('store-selector-item'); 450 countryItem.setAttribute('data-name', selectedLanguage.countryName); 451 452 countryItem.setAttribute('data-lang', selectedLanguage.storeURL); 453 454 countryItem.appendChild(iconContainer); 455 countryItem.appendChild(anchor); 456 457 if (storeSelectorValue.textContent.includes(countryItem.textContent)) { 458 countryItem.classList.add('store-selector-item-active'); 459 } else { 460 countryItem.classList.remove('store-selector-item-active'); 461 } 462 463 countryItem.addEventListener('click', () => handleItemClick(country)); 464 465 storeSelectorList.appendChild(countryItem); 466 }) 467} 468 469const handleLogoSubheader = (selectedLanguage) => { 470 const { logoSubheader } = selectedLanguage; 471 472 storeSelectorLogoSubheader.textContent = logoSubheader; 473} 474 475const handleContentInfo = (selectedLanguage) => { 476 const { contentInfo } = selectedLanguage; 477 478 storeSelectorContentInfo.textContent = contentInfo; 479} 480 481const handleIconFlag = (countryCode) => { 482 let iconClass; 483 const isFlagVisible = countryCode !== 'select'; 484 485 if (storeSelectorIconValue.classList.length > 0) { 486 storeSelectorIconValue.classList.forEach((item) => { 487 if (item && item.includes('store-selector-icon-flag-')) { 488 iconClass = item; 489 } 490 }); 491 } 492 493 if (iconClass && iconClass.length) { 494 storeSelectorIconValue.classList.replace(iconClass, `store-selector-icon-flag-${countryCode}`); 495 } else { 496 storeSelectorIconValue.classList.add(`store-selector-icon-flag-${countryCode}`); 497 } 498 499 if (isFlagVisible) { 500 storeSelectorIconFlagContainer.classList.add('store-selector-visible'); 501 } 502} 503 504const handleNotification = (selectedLanguage) => { 505 const { notification } = selectedLanguage; 506 507 if (notification.length > 0) { 508 storeSelectorNotification.classList.add('store-selector-visible'); 509 storeSelectorNotification.textContent = notification; 510 } else { 511 storeSelectorNotification.classList.remove('store-selector-visible'); 512 storeSelectorNotification.textContent = ''; 513 } 514} 515 516const addChips = (name, chips, selectedIdx) => { 517 chips.forEach((chip, idx) => { 518 if (chip.languageName.length) { 519 let item = document.createElement('div'); 520 521 item.classList.add('store-selector-chip'); 522 523 if (selectedIdx === idx) { 524 item.classList.add('selected-chip'); 525 } 526 527 item.setAttribute('data-name', name); 528 item.setAttribute('data-lang', chip.storeURL); 529 item.innerText = chip.languageName; 530 item.addEventListener('click', () => handleChipClick(chip, idx)); 531 532 storeSelectorChipsContainer.appendChild(item); 533 } 534 }) 535}; 536 537const removeChips = () => { 538 if (storeSelectorChipsContainer.children.length > 0) { 539 while (storeSelectorChipsContainer.firstChild) { 540 storeSelectorChipsContainer.firstChild.remove() 541 } 542 } 543} 544 545const handleItemValue = (englishName, countryName) => { 546 const singleCountryNames = [defaultCountryName, selectCountryName]; 547 return !singleCountryNames.includes(countryName) ? `${countryName} (${englishName})` : `${countryName}`; 548} 549 550const handleButton = (selectedChip) => { 551 const { goToStore, storeURL, countryName } = selectedChip; 552 553 const url = `${window.location.origin}${selectedChip.storeURL}`; 554 const isPointerEventsActive = countryName !== 'Select'; 555 556 storeSelectorButton.setAttribute('href', url); 557 storeSelectorButton.setAttribute('data-lang', storeURL); 558 559 storeSelectorButton.style.pointerEvents = isPointerEventsActive ? 'auto' : 'none'; 560 561 562 if (isPointerEventsActive) { 563 storeSelectorButton.classList.add('store-selector-button-active'); 564 } 565 566 storeSelectorButton.textContent = goToStore; 567} 568 569const handleCountry = (selectedCountry) => { 570 const { englishName, countryCode, defaultLanguage, languageVersions } = selectedCountry; 571 const languageValues = Object.values(languageVersions); 572 const languageKeys = Object.keys(languageVersions); 573 const browserLang = (window.navigator.language).toUpperCase(); 574 575 const langCookie = getCookieValue(cookieLang); 576 const cookieLangLanguageCode = languageKeys.find(key => languageVersions[key].storeURL === langCookie); 577 578 const selectedIdx = langCookie.length && languageKeys.includes(cookieLangLanguageCode) ? 579 languageKeys.indexOf(cookieLangLanguageCode) : languageKeys.includes(browserLang) ? 580 languageKeys.indexOf(browserLang) : languageKeys.indexOf(defaultLanguage); 581 582 const selectedLanguage = Object.values(languageVersions)[selectedIdx]; 583 584 // CREATE SELECTED VALUE 585 storeSelectorValue.innerText = handleItemValue(englishName, selectedLanguage.countryName) 586 587 // CREATE LOGO SUBHEADER 588 handleLogoSubheader(selectedLanguage); 589 590 // CREATE CONTENT INFO 591 handleContentInfo(selectedLanguage); 592 593 // CREATE FLAG 594 handleIconFlag(countryCode); 595 596 // CREATE NOTIFICATION 597 handleNotification(selectedLanguage); 598 599 // REMOVE CHIPS IF CHIPS EXIST 600 removeChips(); 601 602 // CREATE CHIPS LIST 603 addChips(englishName, languageValues, selectedIdx); 604 605 // CREATE BUTTON 606 handleButton(selectedLanguage); 607 608 if (selectedLanguage.notification.length || selectedLanguage.languageName.length) { 609 storeSelectorValueContainer.classList.add('store-selector-value-container-margin-bottom'); 610 } else { 611 storeSelectorValueContainer.classList.remove('store-selector-value-container-margin-bottom'); 612 } 613 614 if (languageVersions.length) { 615 storeSelectorChipsContainer.classList.add('store-selector-chips-padding'); 616 } else { 617 storeSelectorChipsContainer.classList.remove('store-selector-chips-padding'); 618 } 619} 620 621// HANDLERS
622const handleItemClick = (country) => { 623 // CREATE COUNTRY 624 handleCountry(country); 625 626 storeSelectorList.classList.remove('store-selector-visible'); 627 628 if (country.englishName !== selectCountryName) { 629 storeSelectorValue.classList.remove('store-selector-value-select'); 630 } 631 632 storeSelectorIconChevron.classList.remove('store-selector-chevron-rotate'); 633 storeSelectorValueContainer.classList.remove('store-selector-value-container-active'); 634} 635 636const handleChipClick = (chip, idx) => { 637 const chips = document.querySelectorAll('.store-selector-chip'); 638 639 chips.forEach((chip) => { 640 chip.classList.remove('selected-chip'); 641 }) 642 chips[idx].classList.add('selected-chip'); 643 644 handleButton(chip); 645}; 646 647const handleButtonClick = () => { 648 if (storeSelectorButton.getAttribute('data-lang').length) { 649 localStorage.setItem(isStoreSelectorBannerShown, isStoreSelectorBannerShownValue); 650 setCookieValue(cookieLang, storeSelectorButton.getAttribute('data-lang'), 365); 651 } 652} 653 654// COOKIE METHODS 655const setCookieValue = (key, value, exDays) => { 656 const day = new Date(); 657 658 day.setTime(day.getTime() + (exDays * 30 * 24 * 60 * 60 * 1000)); 659 660 const expires = 'expires=' + day.toUTCString(); 661 662 document.cookie = key + '=' + value + '; ' + expires + '; path=/'; 663} 664 665const getCookieValue = (cookie) => { 666 const name = cookie + "="; 667 const decodedCookie = decodeURIComponent(document.cookie); 668 const ca = decodedCookie.split(';'); 669 670 for (let i = 0; i <ca.length; i++) { 671 let c = ca[i]; 672 673 while (c.charAt(0) === ' ') { 674 c = c.substring(1); 675 } 676 677 if (c.indexOf(name) === 0) { 678 return c.substring(name.length, c.length); 679 } 680 } 681 return ''; 682}
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.