{"version":3,"file":"searxng.min.js","sources":["../../../../../client/simple/src/js/main/00_toolkit.js","../../../../../client/simple/src/js/main/infinite_scroll.js","../../../../../client/simple/src/js/main/keyboard.js","../../../../../client/simple/src/js/main/mapresult.js","../../../../../client/simple/src/js/main/preferences.js","../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.js","../../../../../client/simple/node_modules/autocomplete-js/dist/autocomplete.js","../../../../../client/simple/src/js/main/search.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","/*!\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","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\n\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","(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","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* exported AutoComplete */\n\nimport AutoComplete from  \"../../../node_modules/autocomplete-js/dist/autocomplete.js\";\n\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"],"names":["w","ElementPrototype","selector","node","nodes","i","callbackSafe","callback","el","e","exception","searxng","obj","eventType","useCapture","found","method","url","data","resolve","reject","req","ex","src","path","id","s","newNode","referenceNode","getEndpoint","className","d","onlyImages","newLoadSpinner","loader","replaceChildrenWith","element","children","child","loadNextPage","form","formData","response","nextPageDoc","articleList","paginationElement","articleElement","err","intersectionObserveOptions","observedSelector","observer","entries","paginationEntry","isElementInDetail","getResultElement","isImageResult","resultElement","highlightResult","baseKeyBinding","removeFocus","copyURLToClipboard","toggleHelp","searchInputFocus","GoToNextPage","openResult","GoToPreviousPage","reloadPage","keyBindingLayouts","scrollPage","scrollPageTo","keyBindings","tagName","which","noScroll","keepFocus","current","effectiveWhich","next","results","top","bot","etop","ebot","link","scrollPageToSelected","pageButtonClick","css_selector","button","sel","wtop","wheight","offset","wbot","amount","position","nav","q","len","newTab","initHelpContent","divElement","categories","k","key","sorted","a","b","html","cat","lastCategory","first","cj","helpPanel","body","currentUrlElement","event","leaflet_target","map_lon","map_lat","map_zoom","map_boundingbox","map_geojson","map_bounds","southWest","northEast","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","baseLayers","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","enableAllEngines","disableAllEngines","engineToggles","toggleEngines","enable","copyHashButton","window","document","params","evt","handleTouchStart","handleTouchMove","handleTouchEnd","xDown","yDown","xDiff","yDiff","timeDown","startEl","touchCount","swipeThreshold","getNearestAttribute","swipeUnit","swipeTimeout","timeDiff","changedTouches","eventData","xUp","yUp","attributeName","defaultValue","attributeValue","img","btnLabelCollapsed","btnLabelNotCollapsed","target","targetElement","iframe_load","srctest","imgTimeoutID","imgLoaderSpinner","imgLoader","loadImage","imgSrc","onSuccess","thumbnail","scrollTop","f","module","r","n","t","o","c","require","u","p","exports","ConditionOperator","EventType","AutoComplete","input","specificParams","type","mappings","eventIdentifier","condition","match","mapping","name","callbackErr","propertyHttpHeaders","request","queryParams","queryParamsStringify","timeout","merge","tmp","value","liActive","last","active","currentIndex","lisCount","oldValue","currentValue","emptyMessage","limit","minchars","label","now","li","ul","item","returnResponse","json","qinput_id","qinput","isMobile","submitIfQuery","search","createClearButton","cs","updateClearButton","ev","categoryButtons","selectedCategories","categoryButton","categoryValuesInput","categoryValues"],"mappings":"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","x_google_ignoreList":[5,7]}