From dd3663bdff933b8d7db520db6bc64b1d94e58f53 Mon Sep 17 00:00:00 2001 From: Sergiotarxz Date: Fri, 10 Jan 2025 02:22:04 +0100 Subject: [PATCH] Avoiding use a route so used by bots. --- js-src/index.js | 4 ++-- lib/BurguillosInfo.pm | 2 +- lib/BurguillosInfo/Controller/Sitemap.pm | 2 +- public/js/bundle.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/js-src/index.js b/js-src/index.js index 3008af1..246e418 100644 --- a/js-src/index.js +++ b/js-src/index.js @@ -356,7 +356,7 @@ function onSearchChange() { + "//" + window.location.hostname + port - + '/search'); + + '/search.html'); url.searchParams.set('q', query); url.searchParams.set('e', 1); fetch(url).then(async (res) => { @@ -364,7 +364,7 @@ function onSearchChange() { + "//" + window.location.hostname + port - + '/search'); + + '/search.html'); url.searchParams.set('q', query); history.pushState({}, '', url); searchResults.innerHTML = await res.text(); diff --git a/lib/BurguillosInfo.pm b/lib/BurguillosInfo.pm index c0c7cda..8b48b75 100644 --- a/lib/BurguillosInfo.pm +++ b/lib/BurguillosInfo.pm @@ -57,7 +57,7 @@ sub startup ($self) { $r->get('/product/:slug')->to('Product#direct_buy'); $r->get('/producto/:slug')->to('Product#direct_buy'); $r->get('/search.json')->to('Search#search'); - $r->get('/search')->to('Search#search_user'); + $r->get('/search.html')->to('Search#search_user'); $r->get('/farmacia-guardia.json')->to('FarmaciaGuardia#current'); $r->get('/<:category>.rss')->to('Page#category_rss'); $r->get('/:category_slug/atributo/<:attribute_slug>-preview.png')->to('Attribute#get_attribute_preview'); diff --git a/lib/BurguillosInfo/Controller/Sitemap.pm b/lib/BurguillosInfo/Controller/Sitemap.pm index 00cf80f..06413af 100644 --- a/lib/BurguillosInfo/Controller/Sitemap.pm +++ b/lib/BurguillosInfo/Controller/Sitemap.pm @@ -99,7 +99,7 @@ sub _append_attributes_category_sitemap( $self, $dom, $category_key, sub _generate_url_for_search ( $self, $query ) { my $url_tag = Mojo::DOM->new_tag('url'); my $base_url = $self->config('base_url'); - my $url_resource = Mojo::URL->new("$base_url/search"); + my $url_resource = Mojo::URL->new("$base_url/search.html"); $url_resource->query( q => $query ); my $location_tag = Mojo::DOM->new_tag( loc => $url_resource ); $url_tag->child_nodes->first->append_content($location_tag); diff --git a/public/js/bundle.js b/public/js/bundle.js index 5e15a68..b83f59b 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -16,7 +16,7 @@ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var tablesort__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tablesort */ \"./node_modules/tablesort/src/tablesort.js\");\n/* harmony import */ var tablesort__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tablesort__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _burguillosinfo_carousel_ad__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @burguillosinfo/carousel-ad */ \"./js-src/carousel-ad.ts\");\n\n\n\n\nwindow.Tablesort = __webpack_require__(/*! tablesort */ \"./node_modules/tablesort/src/tablesort.js\");\n__webpack_require__(/*! tablesort/src/sorts/tablesort.number */ \"./node_modules/tablesort/src/sorts/tablesort.number.js\");\nlet fakeSearchInput;\nlet searchMobile;\nconst cookies = document.cookie.split(\"; \").map(cookie => {\n let [key, value] = cookie.split(\"=\");\n return {\n key: key,\n value: value\n };\n}).reduce((acc, cookie) => {\n acc[cookie.key] = cookie.value;\n return acc;\n}, {});\nfunction startSuggestions() {\n const searchInputs = document.querySelectorAll('div.fake-text-box input');\n const port = _port();\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/search/suggestions.json');\n fetch(url).then(async res => {\n let suggestions = await res.json();\n let selectedSuggestion;\n let currentLength = 0;\n let waitCounter;\n const last3SearchSuggestions = [];\n window.setInterval(() => {\n if (--waitCounter > 0) {\n return;\n }\n if (!selectedSuggestion || currentLength > selectedSuggestion.length) {\n selectedSuggestion = suggestions[Math.floor(Math.random() * suggestions.length)];\n currentLength = 0;\n while (last3SearchSuggestions.includes(selectedSuggestion)) {\n selectedSuggestion = suggestions[Math.floor(Math.random() * suggestions.length)];\n currentLength = 0;\n }\n last3SearchSuggestions.push(selectedSuggestion);\n if (last3SearchSuggestions.length > 2) {\n last3SearchSuggestions.shift();\n }\n waitCounter = 5;\n return;\n }\n currentLength++;\n for (const input of searchInputs) {\n input.setAttribute('placeholder', selectedSuggestion.substring(0, currentLength));\n }\n }, 100);\n });\n}\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n window.addEventListener('popstate', event => {\n console.log('refreshing');\n window.location.reload();\n });\n startSuggestions();\n let focusSearch = document.body.querySelector('nav.mobile-shortcuts div.search input');\n if (focusSearch === null) {\n focusSearch = document.body.querySelector('div.search input');\n }\n if (focusSearch !== null) {\n focusSearch.focus();\n }\n const menu_expand = document.querySelector('a.menu-expand');\n const mobile_foldable = document.querySelector('nav.mobile-foldable');\n const transparentFullscreenHide = document.querySelector('div.transparent-fullscreen-hide');\n const contentsWithoutMenu = document.querySelector('div.contents-without-menu');\n const tables = document.querySelectorAll('table');\n const searchTooltips = document.querySelectorAll('div.tooltip-search-promo');\n for (const searchTooltip of searchTooltips) {\n const cookie_name = 'seen-tooltip-this-week';\n if (cookies[cookie_name]) {\n searchTooltip.classList.add('hidden');\n }\n searchTooltip.addEventListener('click', () => {\n let time = 86400 * 7;\n document.cookie = `${cookie_name}=1; max-age=${time}; path=/;`;\n for (const searchTooltip of searchTooltips) {\n searchTooltip.classList.add('hidden');\n }\n });\n }\n fillFarmaciaGuardia();\n // new CarouselAd().run()\n addEasterEggAnimation();\n if (menu_expand !== null && mobile_foldable !== null && transparentFullscreenHide !== null && contentsWithoutMenu !== null) {\n mobile_foldable.toggleAttribute('aria-hidden');\n if (mobile_foldable.getAttribute('aria-hidden') !== null) {\n mobile_foldable.setAttribute('aria-hidden', true);\n }\n transparentFullscreenHide.addEventListener('click', () => {\n mobile_foldable.classList.remove('show');\n transparentFullscreenHide.classList.remove('show');\n menu_expand.classList.remove('active');\n contentsWithoutMenu.removeAttribute('aria-hidden');\n mobile_foldable.setAttribute('aria-hidden', true);\n });\n menu_expand.addEventListener('click', () => {\n menu_expand.classList.toggle('active');\n mobile_foldable.classList.toggle('show');\n transparentFullscreenHide.classList.toggle('show');\n contentsWithoutMenu.toggleAttribute('aria-hidden');\n if (contentsWithoutMenu.getAttribute('aria-hidden') !== null) {\n contentsWithoutMenu.setAttribute('aria-hidden', true);\n }\n mobile_foldable.toggleAttribute('aria-hidden');\n if (mobile_foldable.getAttribute('aria-hidden') !== null) {\n mobile_foldable.setAttribute('aria-hidden', true);\n }\n });\n }\n for (const table of tables) {\n const header = table.querySelector('tr');\n if (header !== null) {\n header.setAttribute('data-sort-method', 'none');\n for (const th of header.querySelectorAll('th')) {\n if (th.getAttribute('data-sort-method') == null) {\n th.setAttribute('data-sort-method', 'thead');\n }\n }\n }\n new (tablesort__WEBPACK_IMPORTED_MODULE_0___default())(table);\n }\n if (window !== undefined && window.Android !== undefined) {\n executeAndroidExclusiveCode(Android);\n }\n searchMobile = document.querySelector('nav.mobile-shortcuts div.search');\n if (searchMobile !== null) {\n fakeSearchInput = searchMobile.querySelector('input');\n addListenersSearch();\n }\n addListenersSearchOverlay();\n if (!cookies['search-tutorial-seen']) {\n startSearchTutorial();\n }\n}, false);\nfunction startSearchTutorial() {\n console.log('Showing how to use search');\n const tutorialOverlay = document.querySelector('.tutorial-overlay-step-1');\n if (tutorialOverlay === null) {\n console.error('tutorialOverlay missing');\n return;\n }\n // tutorialOverlay.classList.remove('hidden');\n}\n\nfunction markSearchTutorialAsSeen() {\n console.log('Tutorial ended');\n document.cookie = 'search-tutorial-seen=1; SameSite=Lax;';\n}\nfunction fillFarmaciaGuardia() {\n const farmaciaName = document.querySelector('#farmacia-name');\n const farmaciaAddress = document.querySelector('#farmacia-address');\n if (farmaciaName !== null || farmaciaAddress !== null) {\n const port = _port();\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/farmacia-guardia.json');\n fetch(url).then(async res => {\n const farmacia = await res.json();\n if (farmaciaName !== null) {\n farmaciaName.innerText = farmacia.name;\n farmaciaAddress.innerText = farmacia.address;\n }\n });\n }\n}\nfunction addListenersSearch() {\n const searchInPage = document.querySelector('div.search-in-page');\n if (searchMobile !== null) {\n const searchIcon = searchMobile.querySelector('a.search-icon');\n searchIcon.addEventListener('click', e => {\n const searchOverlay = document.querySelector('div.search-overlay');\n const searchInput = searchOverlay.querySelector('div.search input');\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n 'event': 'fakesearch_term',\n 'term': fakeSearchInput.value\n });\n searchInput.value = fakeSearchInput.value;\n onSearchChange(e);\n onFakeSearchClick(e);\n return true;\n });\n fakeSearchInput.addEventListener('keyup', e => {\n if (searchInPage === null) {\n return;\n }\n if (fakeSearchInput.value === \"\") {\n searchInPage.classList.remove('active');\n } else {\n searchInPage.classList.add('active');\n }\n if (e.keyCode !== 13) {\n return false;\n }\n const searchOverlay = document.querySelector('div.search-overlay');\n const searchInput = searchOverlay.querySelector('div.search input');\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n 'event': 'fakesearch_term_keyup',\n 'term': fakeSearchInput.value\n });\n searchInput.value = fakeSearchInput.value;\n onSearchChange(e);\n onFakeSearchClick(e);\n return true;\n });\n }\n const nextResult = searchInPage.querySelector('a.down');\n const prevResult = searchInPage.querySelector('a.up');\n window.addEventListener(\"keydown\", e => {\n if (e.key.toLowerCase() === \"f\" && e.ctrlKey) {\n openAllDetails();\n }\n });\n window.addEventListener(\"blur\", e => {\n openAllDetails();\n });\n if (nextResult !== null && prevResult !== null) {\n nextResult.addEventListener('click', () => {\n searchInWebsite(fakeSearchInput.value, true);\n });\n prevResult.addEventListener('click', () => {\n searchInWebsite(fakeSearchInput.value, false);\n });\n }\n const exitSearch = document.querySelector('a.exit-search');\n const searchOverlay = document.querySelector('div.search-overlay');\n const searchInput = searchOverlay.querySelector('div.search input');\n fakeSearchInput.value = searchInput.value;\n if (exitSearch !== null) {\n exitSearch.addEventListener('click', onExitSearch);\n }\n const searchIconDesktop = document.querySelector('nav.desktop a.search-icon');\n if (searchIconDesktop !== null) {\n searchIconDesktop.addEventListener('click', e => {\n onFakeSearchClick(e);\n });\n }\n}\nfunction addListenersSearchOverlay() {\n const search = document.querySelector('div.search-overlay div.search input');\n if (search !== null) {\n search.addEventListener('change', onSearchChange);\n }\n}\nfunction searchInWebsite(value, isToBottom) {\n window.find(value, false, !isToBottom, true);\n const selection = window.getSelection();\n openAllDetails();\n if (selection.anchorNode === null) {\n const pageContents = document.querySelector('div.page-contents');\n pageContents.focus();\n searchInWebsite(value, isToBottom);\n }\n const anchorNode = selection.anchorNode.parentNode;\n if (anchorNode.tagName !== null && anchorNode.tagName === \"INPUT\") {\n const pageContents = document.querySelector('div.page-contents');\n pageContents.focus();\n searchInWebsite(value, isToBottom);\n }\n if (anchorNode !== null) {\n const pageContents = document.querySelector('div.page-contents');\n const offsetTop = _getOffsetTopWithNParent(anchorNode, pageContents);\n pageContents.scroll(0, offsetTop - 150);\n }\n}\nfunction openAllDetails() {\n for (const detail of document.querySelectorAll('details')) {\n detail.open = true;\n }\n}\nfunction _getOffsetTopWithNParent(element, nParent, _carry = 0) {\n if (element === null) {\n return null;\n }\n if (element === nParent) {\n return _carry;\n }\n _carry += element.offsetTop;\n return _getOffsetTopWithNParent(element.offsetParent, nParent, _carry);\n}\nfunction _port() {\n let port = window.location.port;\n if (port !== '') {\n port = ':' + port;\n }\n return port;\n}\nfunction onSearchChange() {\n const search = document.querySelector('div.search-overlay div.search input');\n const searchResults = document.querySelector('div.search-overlay div.search-results');\n if (search === null || searchResults === null) {\n return;\n }\n const query = search.value;\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n 'event': 'realsearch_term_keyup',\n 'term': search.value\n });\n if (fakeSearchInput !== undefined && fakeSearchInput !== null) {\n fakeSearchInput.value = search.value;\n }\n let found = search.value.match(/^#(\\S+?)(?:\\:(\\S+?))?$/);\n const port = _port();\n if (found) {\n let attributeUrlPart = found[2];\n console.log(attributeUrlPart);\n if (attributeUrlPart === undefined) {\n attributeUrlPart = '';\n }\n console.log(attributeUrlPart);\n if (attributeUrlPart !== '') {\n attributeUrlPart = '/atributo/' + attributeUrlPart;\n }\n console.log(attributeUrlPart);\n const checkHashstagUrl = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/' + found[1] + attributeUrlPart);\n fetch(checkHashstagUrl).then(res => {\n if (res.status === 200) {\n window.location = checkHashstagUrl;\n }\n });\n return;\n }\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/search');\n url.searchParams.set('q', query);\n url.searchParams.set('e', 1);\n fetch(url).then(async res => {\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/search');\n url.searchParams.set('q', query);\n history.pushState({}, '', url);\n searchResults.innerHTML = await res.text();\n searchResults.scrollTo(0, 0);\n });\n search.focus();\n}\nfunction showResults(searchResults, searchObjects) {\n searchResults.innerHTML = \"\";\n for (let searchObject of searchObjects) {\n const searchResultContainer = document.createElement('div');\n searchResultContainer.classList.add('search-result');\n const rowTitleUrlImageDiv = document.createElement('div');\n rowTitleUrlImageDiv.classList.add('row-title-url-image');\n const columnTitleUrl = document.createElement('div');\n columnTitleUrl.classList.add('column-title-url');\n const img = document.createElement('img');\n const title = document.createElement('b');\n const url = document.createElement('a');\n const content = document.createElement('p');\n title.innerText = searchObject.title;\n let port = window.location.port;\n if (port !== '') {\n port = ':' + port;\n }\n if (searchObject.url.match(/^\\//)) {\n searchObject.url = window.location.protocol + \"//\" + window.location.hostname + port + searchObject.url;\n }\n let urlImage = searchObject.urlImage;\n if (urlImage !== null && urlImage.match(/^\\//)) {\n urlImage = window.location.protocol + \"//\" + window.location.hostname + port + urlImage;\n }\n if (urlImage !== null) {\n img.alt = \"\";\n img.src = urlImage;\n }\n url.href = searchObject.url;\n url.innerText = searchObject.url;\n content.innerText = searchObject.content;\n if (urlImage !== null) {\n rowTitleUrlImageDiv.appendChild(img);\n }\n columnTitleUrl.appendChild(title);\n let vendor = searchObject.vendor;\n let hasVendor;\n if (vendor !== null) {\n const vendorP = document.createElement('p');\n vendorP.classList.add('product-vendor');\n vendorP.innerText = `Enlace promocionado de ${vendor}`;\n columnTitleUrl.appendChild(vendorP);\n hasVendor = true;\n }\n columnTitleUrl.appendChild(url);\n if (hasVendor) {\n const callToAction = document.createElement('a');\n callToAction.classList.add('search-button-buy-now');\n callToAction.innerText = `Compralo ahora en ${vendor}`;\n callToAction.href = searchObject.url;\n columnTitleUrl.appendChild(callToAction);\n }\n rowTitleUrlImageDiv.appendChild(columnTitleUrl);\n searchResultContainer.appendChild(rowTitleUrlImageDiv);\n content.classList.add('search-result-content');\n searchResultContainer.appendChild(content);\n searchResults.appendChild(searchResultContainer);\n }\n}\nfunction noResults(searchResults) {\n searchResults.innerHTML = \"\";\n const p = document.createElement('p');\n p.innerText = 'No se han encontrado resultados, todavía, vamos a trabajar para encontrar resultados a esta busqueda, repitela en unos días.';\n searchResults.appendChild(p);\n}\nfunction onExitSearch() {\n const searchOverlay = document.querySelector('div.search-overlay');\n if (searchOverlay !== null) {\n searchOverlay.classList.toggle('active');\n }\n}\nfunction onFakeSearchClick(e) {\n e.preventDefault();\n const searchOverlay = document.querySelector('div.search-overlay');\n if (searchOverlay === null) {\n return;\n }\n searchOverlay.classList.toggle('active');\n const search = searchOverlay.querySelector('div.search input');\n if (search !== null) {\n search.focus();\n }\n return false;\n}\nfunction absoluteToHost(imageUrl) {\n if (imageUrl.match(/^\\//)) {\n imageUrl = window.location.protocol + \"//\" + window.location.host + imageUrl;\n }\n return imageUrl.replace(/\\?.*$/, '');\n}\nfunction addListenerOpenInBrowserButton(android) {\n const openInBrowserLink = document.querySelector('a.open-in-browser');\n if (openInBrowserLink === null) {\n return;\n }\n openInBrowserLink.addEventListener('click', () => {\n android.openInBrowser(window.location.href);\n });\n}\nfunction executeAndroidExclusiveCode(android) {\n document.querySelectorAll('*.android').forEach(element => {\n element.classList.remove('android');\n });\n document.querySelectorAll('*.no-android-app').forEach(element => {\n element.style.display = 'none';\n });\n addListenerOpenInBrowserButton(android);\n const pinToHomeUrl = document.querySelector('a.pin-to-home');\n if (pinToHomeUrl === null) {\n return;\n }\n pinToHomeUrl.addEventListener('click', () => {\n const url = new URL(window.location.href);\n const pathandQuery = url.pathname + url.search;\n const label = url.pathname.replace(/^.*\\//g, '').replace(/(?:^|-)\\w/g, function (character) {\n return character.toUpperCase();\n }).replace(/-/g, ' ') + ' - Burguillos.info';\n const firstImg = document.querySelector('div.description img');\n let iconUrl;\n if (firstImg !== null) {\n if (!firstImg.src.match(/\\.svg(?:\\?|$)/)) {\n iconUrl = absoluteToHost(firstImg.src);\n }\n }\n if (iconUrl === undefined) {\n const imagePreview = document.querySelector('meta[name=\"image\"]');\n iconUrl = absoluteToHost(imagePreview.content);\n }\n android.pinPage(pathandQuery, label, iconUrl);\n });\n}\nfunction addEasterEggAnimation() {\n const logoContainer = document.querySelector('div.burguillos-logo-container');\n if (logoContainer === null) {\n return;\n }\n logoContainer.addEventListener('click', () => {\n logoContainer.classList.toggle('active');\n });\n}\n\n//# sourceURL=webpack://BurguillosInfo/./js-src/index.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var tablesort__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! tablesort */ \"./node_modules/tablesort/src/tablesort.js\");\n/* harmony import */ var tablesort__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(tablesort__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _burguillosinfo_carousel_ad__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @burguillosinfo/carousel-ad */ \"./js-src/carousel-ad.ts\");\n\n\n\n\nwindow.Tablesort = __webpack_require__(/*! tablesort */ \"./node_modules/tablesort/src/tablesort.js\");\n__webpack_require__(/*! tablesort/src/sorts/tablesort.number */ \"./node_modules/tablesort/src/sorts/tablesort.number.js\");\nlet fakeSearchInput;\nlet searchMobile;\nconst cookies = document.cookie.split(\"; \").map(cookie => {\n let [key, value] = cookie.split(\"=\");\n return {\n key: key,\n value: value\n };\n}).reduce((acc, cookie) => {\n acc[cookie.key] = cookie.value;\n return acc;\n}, {});\nfunction startSuggestions() {\n const searchInputs = document.querySelectorAll('div.fake-text-box input');\n const port = _port();\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/search/suggestions.json');\n fetch(url).then(async res => {\n let suggestions = await res.json();\n let selectedSuggestion;\n let currentLength = 0;\n let waitCounter;\n const last3SearchSuggestions = [];\n window.setInterval(() => {\n if (--waitCounter > 0) {\n return;\n }\n if (!selectedSuggestion || currentLength > selectedSuggestion.length) {\n selectedSuggestion = suggestions[Math.floor(Math.random() * suggestions.length)];\n currentLength = 0;\n while (last3SearchSuggestions.includes(selectedSuggestion)) {\n selectedSuggestion = suggestions[Math.floor(Math.random() * suggestions.length)];\n currentLength = 0;\n }\n last3SearchSuggestions.push(selectedSuggestion);\n if (last3SearchSuggestions.length > 2) {\n last3SearchSuggestions.shift();\n }\n waitCounter = 5;\n return;\n }\n currentLength++;\n for (const input of searchInputs) {\n input.setAttribute('placeholder', selectedSuggestion.substring(0, currentLength));\n }\n }, 100);\n });\n}\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n window.addEventListener('popstate', event => {\n console.log('refreshing');\n window.location.reload();\n });\n startSuggestions();\n let focusSearch = document.body.querySelector('nav.mobile-shortcuts div.search input');\n if (focusSearch === null) {\n focusSearch = document.body.querySelector('div.search input');\n }\n if (focusSearch !== null) {\n focusSearch.focus();\n }\n const menu_expand = document.querySelector('a.menu-expand');\n const mobile_foldable = document.querySelector('nav.mobile-foldable');\n const transparentFullscreenHide = document.querySelector('div.transparent-fullscreen-hide');\n const contentsWithoutMenu = document.querySelector('div.contents-without-menu');\n const tables = document.querySelectorAll('table');\n const searchTooltips = document.querySelectorAll('div.tooltip-search-promo');\n for (const searchTooltip of searchTooltips) {\n const cookie_name = 'seen-tooltip-this-week';\n if (cookies[cookie_name]) {\n searchTooltip.classList.add('hidden');\n }\n searchTooltip.addEventListener('click', () => {\n let time = 86400 * 7;\n document.cookie = `${cookie_name}=1; max-age=${time}; path=/;`;\n for (const searchTooltip of searchTooltips) {\n searchTooltip.classList.add('hidden');\n }\n });\n }\n fillFarmaciaGuardia();\n // new CarouselAd().run()\n addEasterEggAnimation();\n if (menu_expand !== null && mobile_foldable !== null && transparentFullscreenHide !== null && contentsWithoutMenu !== null) {\n mobile_foldable.toggleAttribute('aria-hidden');\n if (mobile_foldable.getAttribute('aria-hidden') !== null) {\n mobile_foldable.setAttribute('aria-hidden', true);\n }\n transparentFullscreenHide.addEventListener('click', () => {\n mobile_foldable.classList.remove('show');\n transparentFullscreenHide.classList.remove('show');\n menu_expand.classList.remove('active');\n contentsWithoutMenu.removeAttribute('aria-hidden');\n mobile_foldable.setAttribute('aria-hidden', true);\n });\n menu_expand.addEventListener('click', () => {\n menu_expand.classList.toggle('active');\n mobile_foldable.classList.toggle('show');\n transparentFullscreenHide.classList.toggle('show');\n contentsWithoutMenu.toggleAttribute('aria-hidden');\n if (contentsWithoutMenu.getAttribute('aria-hidden') !== null) {\n contentsWithoutMenu.setAttribute('aria-hidden', true);\n }\n mobile_foldable.toggleAttribute('aria-hidden');\n if (mobile_foldable.getAttribute('aria-hidden') !== null) {\n mobile_foldable.setAttribute('aria-hidden', true);\n }\n });\n }\n for (const table of tables) {\n const header = table.querySelector('tr');\n if (header !== null) {\n header.setAttribute('data-sort-method', 'none');\n for (const th of header.querySelectorAll('th')) {\n if (th.getAttribute('data-sort-method') == null) {\n th.setAttribute('data-sort-method', 'thead');\n }\n }\n }\n new (tablesort__WEBPACK_IMPORTED_MODULE_0___default())(table);\n }\n if (window !== undefined && window.Android !== undefined) {\n executeAndroidExclusiveCode(Android);\n }\n searchMobile = document.querySelector('nav.mobile-shortcuts div.search');\n if (searchMobile !== null) {\n fakeSearchInput = searchMobile.querySelector('input');\n addListenersSearch();\n }\n addListenersSearchOverlay();\n if (!cookies['search-tutorial-seen']) {\n startSearchTutorial();\n }\n}, false);\nfunction startSearchTutorial() {\n console.log('Showing how to use search');\n const tutorialOverlay = document.querySelector('.tutorial-overlay-step-1');\n if (tutorialOverlay === null) {\n console.error('tutorialOverlay missing');\n return;\n }\n // tutorialOverlay.classList.remove('hidden');\n}\n\nfunction markSearchTutorialAsSeen() {\n console.log('Tutorial ended');\n document.cookie = 'search-tutorial-seen=1; SameSite=Lax;';\n}\nfunction fillFarmaciaGuardia() {\n const farmaciaName = document.querySelector('#farmacia-name');\n const farmaciaAddress = document.querySelector('#farmacia-address');\n if (farmaciaName !== null || farmaciaAddress !== null) {\n const port = _port();\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/farmacia-guardia.json');\n fetch(url).then(async res => {\n const farmacia = await res.json();\n if (farmaciaName !== null) {\n farmaciaName.innerText = farmacia.name;\n farmaciaAddress.innerText = farmacia.address;\n }\n });\n }\n}\nfunction addListenersSearch() {\n const searchInPage = document.querySelector('div.search-in-page');\n if (searchMobile !== null) {\n const searchIcon = searchMobile.querySelector('a.search-icon');\n searchIcon.addEventListener('click', e => {\n const searchOverlay = document.querySelector('div.search-overlay');\n const searchInput = searchOverlay.querySelector('div.search input');\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n 'event': 'fakesearch_term',\n 'term': fakeSearchInput.value\n });\n searchInput.value = fakeSearchInput.value;\n onSearchChange(e);\n onFakeSearchClick(e);\n return true;\n });\n fakeSearchInput.addEventListener('keyup', e => {\n if (searchInPage === null) {\n return;\n }\n if (fakeSearchInput.value === \"\") {\n searchInPage.classList.remove('active');\n } else {\n searchInPage.classList.add('active');\n }\n if (e.keyCode !== 13) {\n return false;\n }\n const searchOverlay = document.querySelector('div.search-overlay');\n const searchInput = searchOverlay.querySelector('div.search input');\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n 'event': 'fakesearch_term_keyup',\n 'term': fakeSearchInput.value\n });\n searchInput.value = fakeSearchInput.value;\n onSearchChange(e);\n onFakeSearchClick(e);\n return true;\n });\n }\n const nextResult = searchInPage.querySelector('a.down');\n const prevResult = searchInPage.querySelector('a.up');\n window.addEventListener(\"keydown\", e => {\n if (e.key.toLowerCase() === \"f\" && e.ctrlKey) {\n openAllDetails();\n }\n });\n window.addEventListener(\"blur\", e => {\n openAllDetails();\n });\n if (nextResult !== null && prevResult !== null) {\n nextResult.addEventListener('click', () => {\n searchInWebsite(fakeSearchInput.value, true);\n });\n prevResult.addEventListener('click', () => {\n searchInWebsite(fakeSearchInput.value, false);\n });\n }\n const exitSearch = document.querySelector('a.exit-search');\n const searchOverlay = document.querySelector('div.search-overlay');\n const searchInput = searchOverlay.querySelector('div.search input');\n fakeSearchInput.value = searchInput.value;\n if (exitSearch !== null) {\n exitSearch.addEventListener('click', onExitSearch);\n }\n const searchIconDesktop = document.querySelector('nav.desktop a.search-icon');\n if (searchIconDesktop !== null) {\n searchIconDesktop.addEventListener('click', e => {\n onFakeSearchClick(e);\n });\n }\n}\nfunction addListenersSearchOverlay() {\n const search = document.querySelector('div.search-overlay div.search input');\n if (search !== null) {\n search.addEventListener('change', onSearchChange);\n }\n}\nfunction searchInWebsite(value, isToBottom) {\n window.find(value, false, !isToBottom, true);\n const selection = window.getSelection();\n openAllDetails();\n if (selection.anchorNode === null) {\n const pageContents = document.querySelector('div.page-contents');\n pageContents.focus();\n searchInWebsite(value, isToBottom);\n }\n const anchorNode = selection.anchorNode.parentNode;\n if (anchorNode.tagName !== null && anchorNode.tagName === \"INPUT\") {\n const pageContents = document.querySelector('div.page-contents');\n pageContents.focus();\n searchInWebsite(value, isToBottom);\n }\n if (anchorNode !== null) {\n const pageContents = document.querySelector('div.page-contents');\n const offsetTop = _getOffsetTopWithNParent(anchorNode, pageContents);\n pageContents.scroll(0, offsetTop - 150);\n }\n}\nfunction openAllDetails() {\n for (const detail of document.querySelectorAll('details')) {\n detail.open = true;\n }\n}\nfunction _getOffsetTopWithNParent(element, nParent, _carry = 0) {\n if (element === null) {\n return null;\n }\n if (element === nParent) {\n return _carry;\n }\n _carry += element.offsetTop;\n return _getOffsetTopWithNParent(element.offsetParent, nParent, _carry);\n}\nfunction _port() {\n let port = window.location.port;\n if (port !== '') {\n port = ':' + port;\n }\n return port;\n}\nfunction onSearchChange() {\n const search = document.querySelector('div.search-overlay div.search input');\n const searchResults = document.querySelector('div.search-overlay div.search-results');\n if (search === null || searchResults === null) {\n return;\n }\n const query = search.value;\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n 'event': 'realsearch_term_keyup',\n 'term': search.value\n });\n if (fakeSearchInput !== undefined && fakeSearchInput !== null) {\n fakeSearchInput.value = search.value;\n }\n let found = search.value.match(/^#(\\S+?)(?:\\:(\\S+?))?$/);\n const port = _port();\n if (found) {\n let attributeUrlPart = found[2];\n console.log(attributeUrlPart);\n if (attributeUrlPart === undefined) {\n attributeUrlPart = '';\n }\n console.log(attributeUrlPart);\n if (attributeUrlPart !== '') {\n attributeUrlPart = '/atributo/' + attributeUrlPart;\n }\n console.log(attributeUrlPart);\n const checkHashstagUrl = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/' + found[1] + attributeUrlPart);\n fetch(checkHashstagUrl).then(res => {\n if (res.status === 200) {\n window.location = checkHashstagUrl;\n }\n });\n return;\n }\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/search.html');\n url.searchParams.set('q', query);\n url.searchParams.set('e', 1);\n fetch(url).then(async res => {\n const url = new URL(window.location.protocol + \"//\" + window.location.hostname + port + '/search.html');\n url.searchParams.set('q', query);\n history.pushState({}, '', url);\n searchResults.innerHTML = await res.text();\n searchResults.scrollTo(0, 0);\n });\n search.focus();\n}\nfunction showResults(searchResults, searchObjects) {\n searchResults.innerHTML = \"\";\n for (let searchObject of searchObjects) {\n const searchResultContainer = document.createElement('div');\n searchResultContainer.classList.add('search-result');\n const rowTitleUrlImageDiv = document.createElement('div');\n rowTitleUrlImageDiv.classList.add('row-title-url-image');\n const columnTitleUrl = document.createElement('div');\n columnTitleUrl.classList.add('column-title-url');\n const img = document.createElement('img');\n const title = document.createElement('b');\n const url = document.createElement('a');\n const content = document.createElement('p');\n title.innerText = searchObject.title;\n let port = window.location.port;\n if (port !== '') {\n port = ':' + port;\n }\n if (searchObject.url.match(/^\\//)) {\n searchObject.url = window.location.protocol + \"//\" + window.location.hostname + port + searchObject.url;\n }\n let urlImage = searchObject.urlImage;\n if (urlImage !== null && urlImage.match(/^\\//)) {\n urlImage = window.location.protocol + \"//\" + window.location.hostname + port + urlImage;\n }\n if (urlImage !== null) {\n img.alt = \"\";\n img.src = urlImage;\n }\n url.href = searchObject.url;\n url.innerText = searchObject.url;\n content.innerText = searchObject.content;\n if (urlImage !== null) {\n rowTitleUrlImageDiv.appendChild(img);\n }\n columnTitleUrl.appendChild(title);\n let vendor = searchObject.vendor;\n let hasVendor;\n if (vendor !== null) {\n const vendorP = document.createElement('p');\n vendorP.classList.add('product-vendor');\n vendorP.innerText = `Enlace promocionado de ${vendor}`;\n columnTitleUrl.appendChild(vendorP);\n hasVendor = true;\n }\n columnTitleUrl.appendChild(url);\n if (hasVendor) {\n const callToAction = document.createElement('a');\n callToAction.classList.add('search-button-buy-now');\n callToAction.innerText = `Compralo ahora en ${vendor}`;\n callToAction.href = searchObject.url;\n columnTitleUrl.appendChild(callToAction);\n }\n rowTitleUrlImageDiv.appendChild(columnTitleUrl);\n searchResultContainer.appendChild(rowTitleUrlImageDiv);\n content.classList.add('search-result-content');\n searchResultContainer.appendChild(content);\n searchResults.appendChild(searchResultContainer);\n }\n}\nfunction noResults(searchResults) {\n searchResults.innerHTML = \"\";\n const p = document.createElement('p');\n p.innerText = 'No se han encontrado resultados, todavía, vamos a trabajar para encontrar resultados a esta busqueda, repitela en unos días.';\n searchResults.appendChild(p);\n}\nfunction onExitSearch() {\n const searchOverlay = document.querySelector('div.search-overlay');\n if (searchOverlay !== null) {\n searchOverlay.classList.toggle('active');\n }\n}\nfunction onFakeSearchClick(e) {\n e.preventDefault();\n const searchOverlay = document.querySelector('div.search-overlay');\n if (searchOverlay === null) {\n return;\n }\n searchOverlay.classList.toggle('active');\n const search = searchOverlay.querySelector('div.search input');\n if (search !== null) {\n search.focus();\n }\n return false;\n}\nfunction absoluteToHost(imageUrl) {\n if (imageUrl.match(/^\\//)) {\n imageUrl = window.location.protocol + \"//\" + window.location.host + imageUrl;\n }\n return imageUrl.replace(/\\?.*$/, '');\n}\nfunction addListenerOpenInBrowserButton(android) {\n const openInBrowserLink = document.querySelector('a.open-in-browser');\n if (openInBrowserLink === null) {\n return;\n }\n openInBrowserLink.addEventListener('click', () => {\n android.openInBrowser(window.location.href);\n });\n}\nfunction executeAndroidExclusiveCode(android) {\n document.querySelectorAll('*.android').forEach(element => {\n element.classList.remove('android');\n });\n document.querySelectorAll('*.no-android-app').forEach(element => {\n element.style.display = 'none';\n });\n addListenerOpenInBrowserButton(android);\n const pinToHomeUrl = document.querySelector('a.pin-to-home');\n if (pinToHomeUrl === null) {\n return;\n }\n pinToHomeUrl.addEventListener('click', () => {\n const url = new URL(window.location.href);\n const pathandQuery = url.pathname + url.search;\n const label = url.pathname.replace(/^.*\\//g, '').replace(/(?:^|-)\\w/g, function (character) {\n return character.toUpperCase();\n }).replace(/-/g, ' ') + ' - Burguillos.info';\n const firstImg = document.querySelector('div.description img');\n let iconUrl;\n if (firstImg !== null) {\n if (!firstImg.src.match(/\\.svg(?:\\?|$)/)) {\n iconUrl = absoluteToHost(firstImg.src);\n }\n }\n if (iconUrl === undefined) {\n const imagePreview = document.querySelector('meta[name=\"image\"]');\n iconUrl = absoluteToHost(imagePreview.content);\n }\n android.pinPage(pathandQuery, label, iconUrl);\n });\n}\nfunction addEasterEggAnimation() {\n const logoContainer = document.querySelector('div.burguillos-logo-container');\n if (logoContainer === null) {\n return;\n }\n logoContainer.addEventListener('click', () => {\n logoContainer.classList.toggle('active');\n });\n}\n\n//# sourceURL=webpack://BurguillosInfo/./js-src/index.js?"); /***/ }),