searxng/searx/static/themes/simple/js/searxng.min.js.map
2025-01-26 13:34:52 +01:00

1 line
No EOL
108 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"searxng.min.js","sources":["../src/js/main/00_toolkit.js","../src/js/main/infinite_scroll.js","../src/js/main/keyboard.js","../src/js/main/mapresult.js","../src/js/main/preferences.js","../src/js/main/results.js","../src/js/main/search.js","../node_modules/autocomplete-js/dist/autocomplete.js","../node_modules/swiped-events/src/swiped-events.js"],"sourcesContent":["/**\n * @license\n * (C) Copyright Contributors to the SearXNG project.\n * (C) Copyright Contributors to the searx project (2014 - 2021).\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nwindow.searxng = (function (w, d) {\n\n 'use strict';\n\n // not invented here toolkit with bugs fixed elsewhere\n // purposes : be just good enough and as small as possible\n\n // from https://plainjs.com/javascript/events/live-binding-event-handlers-14/\n if (w.Element) {\n (function (ElementPrototype) {\n ElementPrototype.matches = ElementPrototype.matches ||\n ElementPrototype.matchesSelector ||\n ElementPrototype.webkitMatchesSelector ||\n ElementPrototype.msMatchesSelector ||\n function (selector) {\n var node = this, nodes = (node.parentNode || node.document).querySelectorAll(selector), i = -1;\n while (nodes[++i] && nodes[i] != node);\n return !!nodes[i];\n };\n })(Element.prototype);\n }\n\n function callbackSafe (callback, el, e) {\n try {\n callback.call(el, e);\n } catch (exception) {\n console.log(exception);\n }\n }\n\n var searxng = window.searxng || {};\n\n searxng.on = function (obj, eventType, callback, useCapture) {\n useCapture = useCapture || false;\n if (typeof obj !== 'string') {\n // obj HTMLElement, HTMLDocument\n obj.addEventListener(eventType, callback, useCapture);\n } else {\n // obj is a selector\n d.addEventListener(eventType, function (e) {\n var el = e.target || e.srcElement, found = false;\n while (el && el.matches && el !== d && !(found = el.matches(obj))) el = el.parentElement;\n if (found) callbackSafe(callback, el, e);\n }, useCapture);\n }\n };\n\n searxng.ready = function (callback) {\n if (document.readyState != 'loading') {\n callback.call(w);\n } else {\n w.addEventListener('DOMContentLoaded', callback.bind(w));\n }\n };\n\n searxng.http = function (method, url, data = null) {\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n req.open(method, url, true);\n req.timeout = 20000;\n\n // On load\n req.onload = function () {\n if (req.status == 200) {\n resolve(req.response, req.responseType);\n } else {\n reject(Error(req.statusText));\n }\n };\n\n // Handle network errors\n req.onerror = function () {\n reject(Error(\"Network Error\"));\n };\n\n req.onabort = function () {\n reject(Error(\"Transaction is aborted\"));\n };\n\n req.ontimeout = function () {\n reject(Error(\"Timeout\"));\n }\n\n // Make the request\n if (data) {\n req.send(data)\n } else {\n req.send();\n }\n } catch (ex) {\n reject(ex);\n }\n });\n };\n\n searxng.loadStyle = function (src) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"style_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('link');\n s.setAttribute('id', id);\n s.setAttribute('rel', 'stylesheet');\n s.setAttribute('type', 'text/css');\n s.setAttribute('href', path);\n d.body.appendChild(s);\n }\n };\n\n searxng.loadScript = function (src, callback) {\n var path = searxng.settings.theme_static_path + \"/\" + src,\n id = \"script_\" + src.replace('.', '_'),\n s = d.getElementById(id);\n if (s === null) {\n s = d.createElement('script');\n s.setAttribute('id', id);\n s.setAttribute('src', path);\n s.onload = callback;\n s.onerror = function () {\n s.setAttribute('error', '1');\n };\n d.body.appendChild(s);\n } else if (!s.hasAttribute('error')) {\n try {\n callback.apply(s, []);\n } catch (exception) {\n console.log(exception);\n }\n } else {\n console.log(\"callback not executed : script '\" + path + \"' not loaded.\");\n }\n };\n\n searxng.insertBefore = function (newNode, referenceNode) {\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n };\n\n searxng.insertAfter = function (newNode, referenceNode) {\n referenceNode.parentNode.insertAfter(newNode, referenceNode.nextSibling);\n };\n\n searxng.on('.close', 'click', function () {\n this.parentNode.classList.add('invisible');\n });\n\n function getEndpoint () {\n for (var className of d.getElementsByTagName('body')[0].classList.values()) {\n if (className.endsWith('_endpoint')) {\n return className.split('_')[0];\n }\n }\n return '';\n }\n\n searxng.endpoint = getEndpoint();\n\n return searxng;\n})(window, document);\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/* global searxng */\n\nsearxng.ready(function () {\n 'use strict';\n\n searxng.infinite_scroll_supported = (\n 'IntersectionObserver' in window &&\n 'IntersectionObserverEntry' in window &&\n 'intersectionRatio' in window.IntersectionObserverEntry.prototype);\n\n if (searxng.endpoint !== 'results') {\n return;\n }\n\n if (!searxng.infinite_scroll_supported) {\n console.log('IntersectionObserver not supported');\n return;\n }\n\n let d = document;\n var onlyImages = d.getElementById('results').classList.contains('only_template_images');\n\n function newLoadSpinner () {\n var loader = d.createElement('div');\n loader.classList.add('loader');\n return loader;\n }\n\n function replaceChildrenWith (element, children) {\n element.textContent = '';\n children.forEach(child => element.appendChild(child));\n }\n\n function loadNextPage (callback) {\n var form = d.querySelector('#pagination form.next_page');\n if (!form) {\n return\n }\n replaceChildrenWith(d.querySelector('#pagination'), [ newLoadSpinner() ]);\n var formData = new FormData(form);\n searxng.http('POST', d.querySelector('#search').getAttribute('action'), formData).then(\n function (response) {\n var nextPageDoc = new DOMParser().parseFromString(response, 'text/html');\n var articleList = nextPageDoc.querySelectorAll('#urls article');\n var paginationElement = nextPageDoc.querySelector('#pagination');\n d.querySelector('#pagination').remove();\n if (articleList.length > 0 && !onlyImages) {\n // do not add <hr> element when there are only images\n d.querySelector('#urls').appendChild(d.createElement('hr'));\n }\n articleList.forEach(articleElement => {\n d.querySelector('#urls').appendChild(articleElement);\n });\n if (paginationElement) {\n d.querySelector('#results').appendChild(paginationElement);\n callback();\n }\n }\n ).catch(\n function (err) {\n console.log(err);\n var e = d.createElement('div');\n e.textContent = searxng.settings.translations.error_loading_next_page;\n e.classList.add('dialog-error');\n e.setAttribute('role', 'alert');\n replaceChildrenWith(d.querySelector('#pagination'), [ e ]);\n }\n )\n }\n\n if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) {\n const intersectionObserveOptions = {\n rootMargin: \"20rem\",\n };\n const observedSelector = 'article.result:last-child';\n const observer = new IntersectionObserver(entries => {\n const paginationEntry = entries[0];\n if (paginationEntry.isIntersecting) {\n observer.unobserve(paginationEntry.target);\n loadNextPage(() => observer.observe(d.querySelector(observedSelector), intersectionObserveOptions));\n }\n });\n observer.observe(d.querySelector(observedSelector), intersectionObserveOptions);\n }\n\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global searxng */\n\nsearxng.ready(function () {\n\n function isElementInDetail (el) {\n while (el !== undefined) {\n if (el.classList.contains('detail')) {\n return true;\n }\n if (el.classList.contains('result')) {\n // we found a result, no need to go to the root of the document:\n // el is not inside a <div class=\"detail\"> 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 'c': {\n key: 'c',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\n cat: 'Results'\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 'y': {\n key: 'y',\n fun: copyURLToClipboard,\n des: 'copy url of the selected result to the clipboard',\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 = '<a href=\"#\" class=\"close\" aria-label=\"close\" title=\"close\">×</a>';\n html += '<h3>How to navigate SearXNG with hotkeys</h3>';\n html += '<table>';\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 += '<tr>';\n }\n html += '<td>';\n\n html += '<h4>' + cat[0].cat + '</h4>';\n html += '<ul class=\"list-unstyled\">';\n\n for (var cj in cat) {\n html += '<li><kbd>' + cat[cj].key + '</kbd> ' + cat[cj].des + '</li>';\n }\n\n html += '</ul>';\n html += '</td>'; // col-sm-*\n\n if (!first || lastCategory) {\n html += '</tr>'; // row\n }\n }\n\n html += '</table>';\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 // toggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n function copyURLToClipboard () {\n var currentUrlElement = document.querySelector('.result[data-vim-selected] h3 a');\n if (currentUrlElement === null) return;\n\n const url = currentUrlElement.getAttribute('href');\n navigator.clipboard.writeText(url);\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 © <a href=\"https://openstreetmap.org\">OpenStreetMap</a> 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 © <a href=\"https://openstreetmap.org\">OpenStreetMap contributors</a>';\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 occur 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 = ' (<i>' + searxng.settings.translations.Source + ':&nbsp;' + description[1] + '</i>)';\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 enableAllEngines = d.querySelectorAll(\".enable-all-engines\");\n const disableAllEngines = d.querySelectorAll(\".disable-all-engines\");\n const engineToggles = d.querySelectorAll('tbody input[type=checkbox][class~=checkbox-onoff]');\n const toggleEngines = (enable) => {\n for (const el of engineToggles) {\n // check if element visible, so that only engines of the current category are modified\n if (el.offsetParent !== null) el.checked = !enable;\n }\n };\n for (const el of enableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(true));\n }\n for (const el of disableAllEngines) {\n searxng.on(el, 'click', () => toggleEngines(false));\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').forEach(\n img =>\n img.addEventListener(\n 'error', () => {\n // console.log(\"ERROR can't load: \" + img.src);\n img.src = window.searxng.settings.theme_static_path + \"/img/img_load_error.svg\";\n },\n {once: true}\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 (gallery)\n // -----------------------------\n\n // setTimeout() ID, needed to cancel *last* loadImage\n let imgTimeoutID;\n\n // progress spinner, while an image is loading\n const imgLoaderSpinner = d.createElement('div');\n imgLoaderSpinner.classList.add('loader');\n\n // singleton image object, which is used for all loading processes of a\n // detailed image\n const imgLoader = new Image();\n\n const loadImage = (imgSrc, onSuccess) => {\n // if defered image load exists, stop defered task.\n if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n // defer load of the detail image for 1 sec\n imgTimeoutID = setTimeout(() => {\n imgLoader.src = imgSrc;\n }, 1000);\n\n // set handlers in the on-properties\n imgLoader.onload = () => {\n onSuccess();\n imgLoaderSpinner.remove();\n };\n imgLoader.onerror = () => {\n imgLoaderSpinner.remove();\n };\n };\n\n searxng.selectImage = (resultElement) => {\n\n // add a class that can be evaluated in the CSS and indicates that the\n // detail view is open\n d.getElementById('results').classList.add('image-detail-open');\n\n // add a hash to the browser history so that pressing back doesn't return\n // to the previous page this allows us to dismiss the image details on\n // pressing the back button on mobile devices\n window.location.hash = '#image-viewer';\n\n searxng.scrollPageToSelected();\n\n // if there is none element given by the caller, stop here\n if (!resultElement) return;\n\n // find <img> object in the element, if there is none, stop here.\n const img = resultElement.querySelector('.result-images-source img');\n if (!img) return;\n\n // <img src=\"\" data-src=\"http://example.org/image.jpg\">\n const src = img.getAttribute('data-src');\n\n // already loaded high-res image or no high-res image available\n if (!src) return;\n\n // use the image thumbnail until the image is fully loaded\n const thumbnail = resultElement.querySelector('.image_thumbnail');\n img.src = thumbnail.src;\n\n // show a progress spinner\n const detailElement = resultElement.querySelector('.detail');\n detailElement.appendChild(imgLoaderSpinner);\n\n // load full size image in background\n loadImage(src, () => {\n // after the singelton loadImage has loaded the detail image into the\n // cache, it can be used in the origin <img> as src property.\n img.src = src;\n img.removeAttribute('data-src');\n });\n };\n\n searxng.closeDetail = function () {\n d.getElementById('results').classList.remove('image-detail-open');\n // remove #image-viewer hash from url by navigating back\n if (window.location.hash == '#image-viewer') window.history.back();\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 // listen for the back button to be pressed and dismiss the image details when called\n window.addEventListener('hashchange', () => {\n if (window.location.hash != '#image-viewer') searxng.closeDetail();\n });\n\n d.querySelectorAll('.swipe-horizontal').forEach(\n obj => {\n obj.addEventListener('swiped-left', function () {\n searxng.selectNext(false);\n });\n obj.addEventListener('swiped-right', function () {\n searxng.selectPrevious(false);\n });\n }\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('input', 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) {\n searxng.autocomplete = AutoComplete.call(w, {\n Url: \"./autocompleter\",\n EmptyMessage: searxng.settings.translations.no_item_found,\n HttpMethod: searxng.settings.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 const categoryButtons = d.querySelectorAll(\"button.category_button\");\n for (let button of categoryButtons) {\n searxng.on(button, 'click', (event) => {\n if (event.shiftKey) {\n event.preventDefault();\n button.classList.toggle(\"selected\");\n return;\n }\n\n // manually deselect the old selection when a new category is selected\n const selectedCategories = d.querySelectorAll(\"button.category_button.selected\");\n for (let categoryButton of selectedCategories) {\n categoryButton.classList.remove(\"selected\");\n }\n button.classList.add(\"selected\");\n })\n }\n\n // override form submit action to update the actually selected categories\n const form = d.querySelector(\"#search\");\n if (form != null) {\n searxng.on(form, 'submit', (event) => {\n event.preventDefault();\n const categoryValuesInput = d.querySelector(\"#selected-categories\");\n if (categoryValuesInput) {\n let categoryValues = [];\n for (let categoryButton of categoryButtons) {\n if (categoryButton.classList.contains(\"selected\")) {\n categoryValues.push(categoryButton.name.replace(\"category_\", \"\"));\n }\n }\n categoryValuesInput.value = categoryValues.join(\",\");\n }\n form.submit();\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<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n * @license MIT\n *\n * Autocomplete.js v2.7.1\n * Developed by Baptiste Donaux\n * http://autocomplete-js.com\n *\n * (c) 2017, Baptiste Donaux\n */\n\"use strict\";\nvar ConditionOperator;\n(function (ConditionOperator) {\n ConditionOperator[ConditionOperator[\"AND\"] = 0] = \"AND\";\n ConditionOperator[ConditionOperator[\"OR\"] = 1] = \"OR\";\n})(ConditionOperator || (ConditionOperator = {}));\nvar EventType;\n(function (EventType) {\n EventType[EventType[\"KEYDOWN\"] = 0] = \"KEYDOWN\";\n EventType[EventType[\"KEYUP\"] = 1] = \"KEYUP\";\n})(EventType || (EventType = {}));\n/**\n * Core\n *\n * @class\n * @author Baptiste Donaux <baptiste.donaux@gmail.com> @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 \"<strong>\" + value + \"</strong>\";\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","/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n(function (window, document) {\n\n 'use strict';\n\n // patch CustomEvent to allow constructor creation (IE/Chrome)\n if (typeof window.CustomEvent !== 'function') {\n\n window.CustomEvent = function (event, params) {\n\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n window.CustomEvent.prototype = window.Event.prototype;\n }\n\n document.addEventListener('touchstart', handleTouchStart, false);\n document.addEventListener('touchmove', handleTouchMove, false);\n document.addEventListener('touchend', handleTouchEnd, false);\n\n var xDown = null;\n var yDown = null;\n var xDiff = null;\n var yDiff = null;\n var timeDown = null;\n var startEl = null;\n var touchCount = 0;\n\n /**\n * Fires swiped event if swipe detected on touchend\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchEnd(e) {\n\n // if the user released on a different target, cancel!\n if (startEl !== e.target) return;\n\n var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10); // default 500ms\n var timeDiff = Date.now() - timeDown;\n var eventType = '';\n var changedTouches = e.changedTouches || e.touches || [];\n\n if (swipeUnit === 'vh') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n }\n if (swipeUnit === 'vw') {\n swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n }\n\n if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (xDiff > 0) {\n eventType = 'swiped-left';\n }\n else {\n eventType = 'swiped-right';\n }\n }\n }\n else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n if (yDiff > 0) {\n eventType = 'swiped-up';\n }\n else {\n eventType = 'swiped-down';\n }\n }\n\n if (eventType !== '') {\n\n var eventData = {\n dir: eventType.replace(/swiped-/, ''),\n touchType: (changedTouches[0] || {}).touchType || 'direct',\n fingers: touchCount, // Number of fingers used\n xStart: parseInt(xDown, 10),\n xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n yStart: parseInt(yDown, 10),\n yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n };\n\n // fire `swiped` event event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n // fire `swiped-dir` event on the element that started the swipe\n startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n }\n\n // reset values\n xDown = null;\n yDown = null;\n timeDown = null;\n }\n /**\n * Records current location on touchstart event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchStart(e) {\n\n // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n startEl = e.target;\n\n timeDown = Date.now();\n xDown = e.touches[0].clientX;\n yDown = e.touches[0].clientY;\n xDiff = 0;\n yDiff = 0;\n touchCount = e.touches.length;\n }\n\n /**\n * Records location diff in px on touchmove event\n * @param {object} e - browser event object\n * @returns {void}\n */\n function handleTouchMove(e) {\n\n if (!xDown || !yDown) return;\n\n var xUp = e.touches[0].clientX;\n var yUp = e.touches[0].clientY;\n\n xDiff = xDown - xUp;\n yDiff = yDown - yUp;\n }\n\n /**\n * Gets attribute off HTML element or nearest parent\n * @param {object} el - HTML element to retrieve attribute from\n * @param {string} attributeName - name of the attribute\n * @param {any} defaultValue - default value to return if no match found\n * @returns {any} attribute value or defaultValue\n */\n function getNearestAttribute(el, attributeName, defaultValue) {\n\n // walk up the dom tree looking for attributeName\n while (el && el !== document.documentElement) {\n\n var attributeValue = el.getAttribute(attributeName);\n\n if (attributeValue) {\n return attributeValue;\n }\n\n el = el.parentNode;\n }\n\n return defaultValue;\n }\n\n}(window, document));\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","c","copyURLToClipboard","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","y","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","currentUrlElement","navigator","clipboard","writeText","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","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","offsetParent","checked","enable","copyHashButton","hash","innerText","copiedText","img","once","style","display","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","Image","loadImage","imgSrc","onSuccess","clearTimeout","thumbnail","detailElement","history","back","qinput_id","qinput","isMobile","matchMedia","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","ev","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","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","Request","abort","encodeURIComponent","_QueryArg","_Pre","search_on_category_select","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues","name","join","exports","module","define","amd","global","self","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","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","CustomEvent","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","Date","changedTouches","touches","round","eventData","dir","touchType","fingers","xStart","xEnd","clientX","yStart","yEnd","clientY","dispatchEvent","xUp","yUp","attributeName","defaultValue","attributeValue"],"mappings":"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"}