element\n return false;\n }\n el = el.parentNode;\n }\n return false;\n }\n\n function getResultElement (el) {\n while (el !== undefined) {\n if (el.classList.contains('result')) {\n return el;\n }\n el = el.parentNode;\n }\n return undefined;\n }\n\n function isImageResult (resultElement) {\n return resultElement && resultElement.classList.contains('result-images');\n }\n\n searxng.on('.result', 'click', function (e) {\n if (!isElementInDetail(e.target)) {\n highlightResult(this)(true, true);\n let resultElement = getResultElement(e.target);\n if (isImageResult(resultElement)) {\n e.preventDefault();\n searxng.selectImage(resultElement);\n }\n }\n });\n\n searxng.on('.result a', 'focus', function (e) {\n if (!isElementInDetail(e.target)) {\n let resultElement = getResultElement(e.target);\n if (resultElement && resultElement.getAttribute(\"data-vim-selected\") === null) {\n highlightResult(resultElement)(true);\n }\n if (isImageResult(resultElement)) {\n searxng.selectImage(resultElement);\n }\n }\n }, true);\n\n /* common base for layouts */\n var baseKeyBinding = {\n 'Escape': {\n key: 'ESC',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 'h': {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n },\n 'i': {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 'n': {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 'o': {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 'p': {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 'r': {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 't': {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n };\n var keyBindingLayouts = {\n\n \"default\": Object.assign(\n { /* SearXNG layout */\n 'ArrowLeft': {\n key: '←',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'ArrowRight': {\n key: '→',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding),\n\n 'vim': Object.assign(\n { /* Vim-like Key Layout. */\n 'b': {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 'f': {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 'u': {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 'd': {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 'g': {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 'v': {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 'k': {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 'j': {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n }, baseKeyBinding)\n }\n\n var keyBindings = keyBindingLayouts[searxng.settings.hotkeys] || keyBindingLayouts.default;\n\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (\n Object.prototype.hasOwnProperty.call(keyBindings, e.key)\n && !e.ctrlKey && !e.altKey\n && !e.shiftKey && !e.metaKey\n ) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.key === 'Escape') {\n keyBindings[e.key].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n keyBindings[e.key].fun();\n }\n }\n }\n });\n\n function highlightResult (which) {\n return function (noScroll, keepFocus) {\n var current = document.querySelector('.result[data-vim-selected]'),\n effectiveWhich = which;\n if (current === null) {\n // no selection : choose the first one\n current = document.querySelector('.result');\n if (current === null) {\n // no first one : there are no results\n return;\n }\n // replace up/down actions by selecting first one\n if (which === \"down\" || which === \"up\") {\n effectiveWhich = current;\n }\n }\n\n var next, results = document.querySelectorAll('.result');\n results = Array.from(results); // convert NodeList to Array for further use\n\n if (typeof effectiveWhich !== 'string') {\n next = effectiveWhich;\n } else {\n switch (effectiveWhich) {\n case 'visible':\n var top = document.documentElement.scrollTop || document.body.scrollTop;\n var bot = top + document.documentElement.clientHeight;\n\n for (var i = 0; i < results.length; i++) {\n next = results[i];\n var etop = next.offsetTop;\n var ebot = etop + next.clientHeight;\n\n if ((ebot <= bot) && (etop > top)) {\n break;\n }\n }\n break;\n case 'down':\n next = results[results.indexOf(current) + 1] || current;\n break;\n case 'up':\n next = results[results.indexOf(current) - 1] || current;\n break;\n case 'bottom':\n next = results[results.length - 1];\n break;\n case 'top':\n /* falls through */\n default:\n next = results[0];\n }\n }\n\n if (next) {\n current.removeAttribute('data-vim-selected');\n next.setAttribute('data-vim-selected', 'true');\n if (!keepFocus) {\n var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\n }\n }\n if (!noScroll) {\n scrollPageToSelected();\n }\n }\n };\n }\n\n function reloadPage () {\n document.location.reload(true);\n }\n\n function removeFocus (e) {\n const tagName = e.target.tagName.toLowerCase();\n if (document.activeElement && (tagName === 'input' || tagName === 'select' || tagName === 'textarea')) {\n document.activeElement.blur();\n } else {\n searxng.closeDetail();\n }\n }\n\n function pageButtonClick (css_selector) {\n return function () {\n var button = document.querySelector(css_selector);\n if (button) {\n button.click();\n }\n };\n }\n\n function GoToNextPage () {\n return pageButtonClick('nav#pagination .next_page button[type=\"submit\"]');\n }\n\n function GoToPreviousPage () {\n return pageButtonClick('nav#pagination .previous_page button[type=\"submit\"]');\n }\n\n function scrollPageToSelected () {\n var sel = document.querySelector('.result[data-vim-selected]');\n if (sel === null) {\n return;\n }\n var wtop = document.documentElement.scrollTop || document.body.scrollTop,\n wheight = document.documentElement.clientHeight,\n etop = sel.offsetTop,\n ebot = etop + sel.clientHeight,\n offset = 120;\n // first element ?\n if ((sel.previousElementSibling === null) && (ebot < wheight)) {\n // set to the top of page if the first element\n // is fully included in the viewport\n window.scroll(window.scrollX, 0);\n return;\n }\n if (wtop > (etop - offset)) {\n window.scroll(window.scrollX, etop - offset);\n } else {\n var wbot = wtop + wheight;\n if (wbot < (ebot + offset)) {\n window.scroll(window.scrollX, ebot - wheight + offset);\n }\n }\n }\n\n function scrollPage (amount) {\n return function () {\n window.scrollBy(0, amount);\n highlightResult('visible')();\n };\n }\n\n function scrollPageTo (position, nav) {\n return function () {\n window.scrollTo(0, position);\n highlightResult(nav)();\n };\n }\n\n function searchInputFocus () {\n window.scrollTo(0, 0);\n var q = document.querySelector('#q');\n q.focus();\n if (q.setSelectionRange) {\n var len = q.value.length;\n q.setSelectionRange(len, len);\n }\n }\n\n function openResult (newTab) {\n return function () {\n var link = document.querySelector('.result[data-vim-selected] h3 a');\n if (link === null) {\n link = document.querySelector('.result[data-vim-selected] > a');\n }\n if (link !== null) {\n var url = link.getAttribute('href');\n if (newTab) {\n window.open(url);\n } else {\n window.location.href = url;\n }\n }\n };\n }\n\n function initHelpContent (divElement) {\n var categories = {};\n\n for (var k in keyBindings) {\n var key = keyBindings[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '
×';\n html += '
How to navigate SearXNG with hotkeys
';\n html += '
';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += '';\n\n html += '' + cat[0].cat + '';\n html += '';\n\n for (var cj in cat) {\n html += '- ' + cat[cj].key + ' ' + cat[cj].des + '
';\n }\n\n html += ' ';\n html += ' | '; // col-sm-*\n\n if (!first || lastCategory) {\n html += '
'; // row\n }\n }\n\n html += '
';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp () {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className = 'dialog-modal';\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // togggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data ©
OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data ©
OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occour only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (
' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n\n const copyHashButton = d.querySelector(\"#copy-hash\");\n searxng.on(copyHashButton, 'click', (e) => {\n e.preventDefault();\n navigator.clipboard.writeText(copyHashButton.dataset.hash);\n copyHashButton.innerText = copyHashButton.dataset.copiedText;\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n searxng.ready(function () {\n d.querySelectorAll('#urls img.image').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n img.style.display = 'none';\n img.error = null;\n }\n ));\n\n if (d.querySelector('#search_url button#copy_url')) {\n d.querySelector('#search_url button#copy_url').style.display = \"block\";\n }\n\n searxng.on('.btn-collapse', 'click', function () {\n var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');\n var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');\n var target = this.getAttribute('data-target');\n var targetElement = d.querySelector(target);\n var html = this.innerHTML;\n if (this.classList.contains('collapsed')) {\n html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);\n } else {\n html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);\n }\n this.innerHTML = html;\n this.classList.toggle('collapsed');\n targetElement.classList.toggle('invisible');\n });\n\n searxng.on('.media-loader', 'click', function () {\n var target = this.getAttribute('data-target');\n var iframe_load = d.querySelector(target + ' > iframe');\n var srctest = iframe_load.getAttribute('src');\n if (srctest === null || srctest === undefined || srctest === false) {\n iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));\n }\n });\n\n searxng.on('#copy_url', 'click', function () {\n var target = this.parentElement.querySelector('pre');\n navigator.clipboard.writeText(target.innerText);\n this.innerText = this.dataset.copiedText;\n });\n\n searxng.selectImage = function (resultElement) {\n /* eslint no-unused-vars: 0 */\n if (resultElement) {\n // load full size image in background\n const imgElement = resultElement.querySelector('.result-images-source img');\n const thumbnailElement = resultElement.querySelector('.image_thumbnail');\n const detailElement = resultElement.querySelector('.detail');\n if (imgElement) {\n const imgSrc = imgElement.getAttribute('data-src');\n if (imgSrc) {\n const loader = d.createElement('div');\n const imgLoader = new Image();\n\n loader.classList.add('loader');\n detailElement.appendChild(loader);\n\n imgLoader.onload = e => {\n imgElement.src = imgSrc;\n loader.remove();\n };\n imgLoader.onerror = e => {\n loader.remove();\n };\n imgLoader.src = imgSrc;\n imgElement.src = thumbnailElement.src;\n imgElement.removeAttribute('data-src');\n }\n }\n }\n d.getElementById('results').classList.add('image-detail-open');\n searxng.scrollPageToSelected();\n }\n\n searxng.closeDetail = function (e) {\n d.getElementById('results').classList.remove('image-detail-open');\n searxng.scrollPageToSelected();\n }\n searxng.on('.result-detail-close', 'click', e => {\n e.preventDefault();\n searxng.closeDetail();\n });\n searxng.on('.result-detail-previous', 'click', e => {\n e.preventDefault();\n searxng.selectPrevious(false)\n });\n searxng.on('.result-detail-next', 'click', e => {\n e.preventDefault();\n searxng.selectNext(false);\n });\n\n w.addEventListener('scroll', function () {\n var e = d.getElementById('backToTop'),\n scrollTop = document.documentElement.scrollTop || document.body.scrollTop,\n results = d.getElementById('results');\n if (e !== null) {\n if (scrollTop >= 100) {\n results.classList.add('scrolling');\n } else {\n results.classList.remove('scrolling');\n }\n }\n }, true);\n\n });\n\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global AutoComplete */\n(function (w, d, searxng) {\n 'use strict';\n\n var qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('keyup', updateClearButton, false);\n }\n\n searxng.ready(function () {\n qinput = d.getElementById(qinput_id);\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.settings.autocomplete_provider) {\n searxng.autocomplete = AutoComplete.call(w, {\n Url: \"./autocompleter\",\n EmptyMessage: searxng.settings.translations.no_item_found,\n HttpMethod: searxng.settings.http_method,\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n MinChars: searxng.settings.autocomplete_min,\n Delay: 300,\n _Position: function () {},\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onmousedown = function () {\n params._Select(li);\n };\n }\n });\n },\n _Select: function (item) {\n AutoComplete.defaults._Select.call(this, item);\n var form = item.closest('form');\n if (form) {\n form.submit();\n }\n },\n _MinChars: function () {\n if (this.Input.value.indexOf('!') > -1) {\n return 0;\n } else {\n return AutoComplete.defaults._MinChars.call(this);\n }\n },\n KeyboardMappings: Object.assign({}, AutoComplete.defaults.KeyboardMappings, {\n \"KeyUpAndDown_up\": Object.assign({}, AutoComplete.defaults.KeyboardMappings.KeyUpAndDown_up, {\n Callback: function (event) {\n AutoComplete.defaults.KeyboardMappings.KeyUpAndDown_up.Callback.call(this, event);\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive) {\n AutoComplete.defaults._Select.call(this, liActive);\n }\n },\n }),\n \"Tab\": Object.assign({}, AutoComplete.defaults.KeyboardMappings.Enter, {\n Conditions: [{\n Is: 9,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n AutoComplete.defaults._Select.call(this, liActive);\n event.preventDefault();\n }\n }\n },\n })\n }),\n }, \"#\" + qinput_id);\n }\n\n /*\n Monkey patch autocomplete.js to fix a bug\n With the POST method, the values are not URL encoded: query like \"1 + 1\" are sent as \"1 1\" since space are URL encoded as plus.\n See HTML specifications:\n * HTML5: https://url.spec.whatwg.org/#concept-urlencoded-serializer\n * HTML4: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n\n autocomplete.js does not URL encode the name and values:\n https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/src/autocomplete.ts#L665\n\n The monkey patch overrides the compiled version of the ajax function.\n See https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/dist/autocomplete.js#L143-L158\n The patch changes only the line 156 from\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n to\n params.Request.send(encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(params._Pre()));\n\n Related to:\n * https://github.com/autocompletejs/autocomplete.js/issues/78\n * https://github.com/searxng/searxng/issues/1695\n */\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n } else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(params._Pre()));\n }\n };\n\n if (!isMobile && document.querySelector('.index_endpoint')) {\n qinput.focus();\n }\n }\n\n // Additionally to searching when selecting a new category, we also\n // automatically start a new search request when the user changes a search\n // filter (safesearch, time range or language) (this requires JavaScript\n // though)\n if (\n qinput !== null\n && searxng.settings.search_on_category_select\n // If .search_filters is undefined (invisible) we are on the homepage and\n // hence don't have to set any listeners\n && d.querySelector(\".search_filters\") != null\n ) {\n searxng.on(d.getElementById('safesearch'), 'change', submitIfQuery);\n searxng.on(d.getElementById('time_range'), 'change', submitIfQuery);\n searxng.on(d.getElementById('language'), 'change', submitIfQuery);\n }\n\n // most common browsers at the time of writing this support :has, except for Firefox\n // can be removed when Firefox / Firefox ESL starts supporting it as well\n try {\n // this fails when the browser does not support :has\n d.querySelector(\"html:has(body)\");\n } catch (_) {\n // manually deselect the old selection when a new category is selected\n for (let button of d.querySelectorAll(\"button.category_button\")) {\n searxng.on(button, 'click', () => {\n const selected = d.querySelector(\"button.category_button.selected\");\n console.log(selected);\n selected.classList.remove(\"selected\");\n })\n }\n }\n });\n\n})(window, document, window.searxng);\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i
@baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n // Constructor\n function AutoComplete(params, selector) {\n if (params === void 0) { params = {}; }\n if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n if (Array.isArray(selector)) {\n selector.forEach(function (s) {\n new AutoComplete(params, s);\n });\n }\n else if (typeof selector == \"string\") {\n var elements = document.querySelectorAll(selector);\n Array.prototype.forEach.call(elements, function (input) {\n new AutoComplete(params, input);\n });\n }\n else {\n var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n DOMResults: document.createElement(\"div\")\n });\n AutoComplete.prototype.create(specificParams, selector);\n return specificParams;\n }\n }\n AutoComplete.prototype.create = function (params, element) {\n params.Input = element;\n if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n params.Input.setAttribute(\"autocomplete\", \"off\");\n params._Position(params);\n params.Input.parentNode.appendChild(params.DOMResults);\n params.$Listeners = {\n blur: params._Blur.bind(params),\n destroy: AutoComplete.prototype.destroy.bind(null, params),\n focus: params._Focus.bind(params),\n keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n position: params._Position.bind(params)\n };\n for (var event in params.$Listeners) {\n params.Input.addEventListener(event, params.$Listeners[event]);\n }\n }\n };\n AutoComplete.prototype.getEventsByType = function (params, type) {\n var mappings = {};\n for (var key in params.KeyboardMappings) {\n var event = EventType.KEYUP;\n if (params.KeyboardMappings[key].Event !== undefined) {\n event = params.KeyboardMappings[key].Event;\n }\n if (event == type) {\n mappings[key] = params.KeyboardMappings[key];\n }\n }\n return mappings;\n };\n AutoComplete.prototype.event = function (params, type, event) {\n var eventIdentifier = function (condition) {\n if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n condition = AutoComplete.merge({\n Not: false\n }, condition);\n if (condition.hasOwnProperty(\"Is\")) {\n if (condition.Is == event.keyCode) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n }\n };\n for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n var mapping = AutoComplete.merge({\n Operator: ConditionOperator.AND\n }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n mapping.Conditions.forEach(eventIdentifier);\n if (match === true) {\n mapping.Callback.call(params, event);\n }\n }\n };\n AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n if (method.match(/^GET$/i)) {\n if (url.indexOf(\"?\") !== -1) {\n url += \"&\" + queryParamsStringify;\n }\n else {\n url += \"?\" + queryParamsStringify;\n }\n }\n request.open(method, url, true);\n for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4 && request.status == 200) {\n params.$Cache[queryParams] = request.response;\n callback(request.response);\n }\n else if (request.status >= 400) {\n callbackErr();\n }\n };\n return request;\n };\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n }\n else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n }\n };\n AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n var response = params._Cache(params._Pre());\n if (response === undefined) {\n var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n AutoComplete.prototype.ajax(params, request);\n }\n else {\n callback(response);\n }\n };\n AutoComplete.prototype.destroy = function (params) {\n for (var event in params.$Listeners) {\n params.Input.removeEventListener(event, params.$Listeners[event]);\n }\n params.DOMResults.parentNode.removeChild(params.DOMResults);\n };\n AutoComplete.merge = function () {\n var merge = {}, tmp;\n for (var i = 0; i < arguments.length; i++) {\n for (tmp in arguments[i]) {\n merge[tmp] = arguments[i][tmp];\n }\n }\n return merge;\n };\n AutoComplete.defaults = {\n Delay: 150,\n EmptyMessage: \"No result here\",\n Highlight: {\n getRegex: function (value) {\n return new RegExp(value, \"ig\");\n },\n transform: function (value) {\n return \"\" + value + \"\";\n }\n },\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\"\n },\n Limit: 0,\n MinChars: 0,\n HttpMethod: \"GET\",\n QueryArg: \"q\",\n Url: null,\n KeyboardMappings: {\n \"Enter\": {\n Conditions: [{\n Is: 13,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n event.preventDefault();\n this._Select(liActive);\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n }\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_down\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_up\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n if (active) {\n var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n if (position < 0) {\n position = lisCount - 1;\n }\n else if (position >= lisCount) {\n position = 0;\n }\n active.classList.remove(\"active\");\n active.parentElement.children.item(position).classList.add(\"active\");\n }\n else if (last && event.keyCode == 38) {\n last.classList.add(\"active\");\n }\n else if (first) {\n first.classList.add(\"active\");\n }\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYUP\n },\n \"AlphaNum\": {\n Conditions: [{\n Is: 13,\n Not: true\n }, {\n From: 35,\n To: 40,\n Not: true\n }],\n Callback: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n if (!oldValue || currentValue != oldValue) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n AutoComplete.prototype.cache(this, function (response) {\n this._Render(this._Post(response));\n this._Open();\n }.bind(this), this._Error);\n }\n else {\n this._Close();\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYUP\n }\n },\n DOMResults: null,\n Request: null,\n Input: null,\n /**\n * Return the message when no result returns\n */\n _EmptyMessage: function () {\n var emptyMessage = \"\";\n if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n }\n else if (this.EmptyMessage !== false) {\n emptyMessage = this.EmptyMessage;\n }\n else {\n emptyMessage = \"\";\n }\n return emptyMessage;\n },\n /**\n * Returns the maximum number of results\n */\n _Limit: function () {\n var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n if (isNaN(limit) || limit === null) {\n return this.Limit;\n }\n return parseInt(limit, 10);\n },\n /**\n * Returns the minimum number of characters entered before firing ajax\n */\n _MinChars: function () {\n var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n if (isNaN(minchars) || minchars === null) {\n return this.MinChars;\n }\n return parseInt(minchars, 10);\n },\n /**\n * Apply transformation on labels response\n */\n _Highlight: function (label) {\n return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n },\n /**\n * Returns the HHTP method to use\n */\n _HttpMethod: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n return this.Input.getAttribute(\"data-autocomplete-method\");\n }\n return this.HttpMethod;\n },\n /**\n * Returns the query param to use\n */\n _QueryArg: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n return this.Input.getAttribute(\"data-autocomplete-param-name\");\n }\n return this.QueryArg;\n },\n /**\n * Returns the URL to use for AJAX request\n */\n _Url: function () {\n if (this.Input.hasAttribute(\"data-autocomplete\")) {\n return this.Input.getAttribute(\"data-autocomplete\");\n }\n return this.Url;\n },\n /**\n * Manage the close\n */\n _Blur: function (now) {\n if (now === void 0) { now = false; }\n if (now) {\n this._Close();\n }\n else {\n var params = this;\n setTimeout(function () {\n params._Blur(true);\n }, 150);\n }\n },\n /**\n * Manage the cache\n */\n _Cache: function (value) {\n return this.$Cache[value];\n },\n /**\n * Manage the open\n */\n _Focus: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n },\n /**\n * Bind all results item if one result is opened\n */\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onclick = function () {\n params._Select(li);\n };\n }\n });\n },\n _Close: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n },\n /**\n * Position the results HTML element\n */\n _Position: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n },\n /**\n * Execute the render of results DOM element\n */\n _Render: function (response) {\n var ul;\n if (typeof response == \"string\") {\n ul = this._RenderRaw(response);\n }\n else {\n ul = this._RenderResponseItems(response);\n }\n if (this.DOMResults.hasChildNodes()) {\n this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n }\n this.DOMResults.appendChild(ul);\n },\n /**\n * ResponseItems[] rendering\n */\n _RenderResponseItems: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n // Order\n if (limit < 0) {\n response = response.reverse();\n }\n else if (limit === 0) {\n limit = response.length;\n }\n for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n li.innerHTML = response[item].Label;\n li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n ul.appendChild(li);\n li = document.createElement(\"li\");\n }\n return ul;\n },\n /**\n * string response rendering (RAW HTML)\n */\n _RenderRaw: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n if (response.length > 0) {\n this.DOMResults.innerHTML = response;\n }\n else {\n var emptyMessage = this._EmptyMessage();\n if (emptyMessage !== \"\") {\n li.innerHTML = emptyMessage;\n li.setAttribute(\"class\", \"locked\");\n ul.appendChild(li);\n }\n }\n return ul;\n },\n /**\n * Deal with request response\n */\n _Post: function (response) {\n try {\n var returnResponse = [];\n //JSON return\n var json = JSON.parse(response);\n if (Object.keys(json).length === 0) {\n return \"\";\n }\n if (Array.isArray(json)) {\n for (var i = 0; i < Object.keys(json).length; i++) {\n returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n }\n }\n else {\n for (var value in json) {\n returnResponse.push({\n \"Value\": value,\n \"Label\": this._Highlight(json[value])\n });\n }\n }\n return returnResponse;\n }\n catch (event) {\n //HTML return\n return response;\n }\n },\n /**\n * Return the autocomplete value to send (before request)\n */\n _Pre: function () {\n return this.Input.value;\n },\n /**\n * Choice one result item\n */\n _Select: function (item) {\n if (item.hasAttribute(\"data-autocomplete-value\")) {\n this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n }\n else {\n this.Input.value = item.innerHTML;\n }\n this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n },\n /**\n * Handle HTTP error on the request\n */\n _Error: function () {\n },\n $AjaxTimer: null,\n $Cache: {},\n $Listeners: {}\n };\n return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n"],"names":["window","searxng","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","data","Promise","resolve","reject","req","XMLHttpRequest","open","timeout","onload","status","response","responseType","Error","statusText","onerror","onabort","ontimeout","send","ex","loadStyle","src","path","settings","theme_static_path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","insertAfter","nextSibling","classList","add","getEndpoint","className","getElementsByTagName","values","endsWith","split","endpoint","infinite_scroll_supported","IntersectionObserverEntry","let","onlyImages","contains","newLoadSpinner","loader","replaceChildrenWith","element","children","textContent","forEach","child","loadNextPage","form","querySelector","formData","FormData","getAttribute","then","nextPageDoc","DOMParser","parseFromString","articleList","paginationElement","remove","length","articleElement","catch","err","translations","error_loading_next_page","infinite_scroll","intersectionObserveOptions","rootMargin","observedSelector","observer","IntersectionObserver","entries","paginationEntry","isIntersecting","unobserve","observe","isElementInDetail","undefined","getResultElement","isImageResult","resultElement","highlightResult","preventDefault","selectImage","baseKeyBinding","Escape","key","fun","removeFocus","des","cat","h","toggleHelp","searchInputFocus","n","GoToNextPage","o","openResult","p","GoToPreviousPage","r","reloadPage","t","keyBindingLayouts","default","Object","assign","ArrowLeft","ArrowRight","vim","b","scrollPage","innerHeight","f","u","g","scrollPageTo","scrollHeight","v","k","j","keyBindings","hotkeys","hasOwnProperty","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","keepFocus","current","effectiveWhich","next","results","Array","from","top","documentElement","scrollTop","bot","clientHeight","etop","offsetTop","ebot","indexOf","removeAttribute","link","focus","scrollPageToSelected","location","reload","activeElement","blur","closeDetail","pageButtonClick","css_selector","button","click","sel","wtop","wheight","offset","previousElementSibling","scroll","scrollX","wbot","amount","scrollBy","position","nav","scrollTo","q","setSelectionRange","len","value","newTab","href","initHelpContent","divElement","categories","push","sorted","keys","sort","a","html","lastCategory","first","cj","innerHTML","helpPanel","toggle","selectNext","selectPrevious","event","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","JSON","parse","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","setTimeout","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","OSM Wikimedia","control","layers","addTo","geoJson","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","Source","copyHashButton","navigator","clipboard","writeText","hash","innerText","copiedText","img","style","display","error","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","imgLoader","Image","qinput_id","qinput","isMobile","matchMedia","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","ev","autocomplete_provider","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","http_method","HttpHeaders","Content-type","X-Requested-With","MinChars","autocomplete_min","Delay","_Position","_Open","params","DOMResults","li","onmousedown","_Select","item","defaults","closest","_MinChars","Input","KeyboardMappings","KeyUpAndDown_up","Callback","liActive","Tab","Enter","Conditions","Is","Not","ajax","request","$AjaxTimer","clearTimeout","Request","abort","encodeURIComponent","_QueryArg","_Pre","search_on_category_select","_","selected","exports","module","define","amd","global","self","c","require","code","1","ConditionOperator","EventType","isArray","input","specificParams","merge","create","nodeName","match","$Listeners","_Blur","destroy","_Focus","keyup","KEYUP","keydown","KEYDOWN","getEventsByType","type","mappings","Event","eventIdentifier","condition","mapping","Operator","AND","OR","keyCode","From","To","name","makeRequest","callbackErr","propertyHttpHeaders","getOwnPropertyNames","_HttpMethod","_Url","queryParams","queryParamsStringify","setRequestHeader","onreadystatechange","$Cache","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","KeyUpAndDown_down","last","active","currentIndex","lisCount","AlphaNum","oldValue","currentValue","_Render","_Post","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","onclick","offsetHeight","offsetLeft","clientWidth","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","Label","Value","returnResponse","json"],"mappings":"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"}
\ No newline at end of file