summaryrefslogtreecommitdiff
path: root/searx/static/themes/simple/js/searxng.min.js.map
blob: f40a03a7044c44c68a8c3ba939c52e1fa0404f2c (plain)
1
{"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"],"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 tookit 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      // togggle 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 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 = ' (<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.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('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_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<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"],"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","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","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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"}