From ed2a4c80879d2d3741514ea1117ab672b8f55d54 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Wed, 13 Apr 2022 17:08:19 +0200 Subject: [PATCH 1/3] [mod] client_settings: pass settings from server to JS client Signed-off-by: Markus Heiser --- .../themes/simple/src/js/head/00_init.js | 23 +++---------- .../themes/simple/src/js/main/00_toolkit.js | 4 +-- .../simple/src/js/main/infinite_scroll.js | 4 +-- .../themes/simple/src/js/main/keyboard.js | 2 +- .../themes/simple/src/js/main/preferences.js | 2 +- .../themes/simple/src/js/main/search.js | 8 ++--- searx/templates/simple/base.html | 9 +---- searx/webapp.py | 34 ++++++++++++++++--- 8 files changed, 45 insertions(+), 41 deletions(-) diff --git a/searx/static/themes/simple/src/js/head/00_init.js b/searx/static/themes/simple/src/js/head/00_init.js index acd437f39..4aeece8c2 100644 --- a/searx/static/themes/simple/src/js/head/00_init.js +++ b/searx/static/themes/simple/src/js/head/00_init.js @@ -1,9 +1,4 @@ -/** - * @license - * (C) Copyright Contributors to the SearXNG project. - * (C) Copyright Contributors to the searx project (2014 - 2021). - * SPDX-License-Identifier: AGPL-3.0-or-later - */ +/* SPDX-License-Identifier: AGPL-3.0-or-later */ (function (w, d) { 'use strict'; @@ -13,23 +8,13 @@ return scripts[scripts.length - 1]; })(); - // try to detect touch screen w.searxng = { - method: script.getAttribute('data-method'), - autocompleter: script.getAttribute('data-autocompleter') === 'true', - search_on_category_select: script.getAttribute('data-search-on-category-select') === 'true', - infinite_scroll: script.getAttribute('data-infinite-scroll') === 'true', - hotkeys: script.getAttribute('data-hotkeys') === 'true', - static_path: script.getAttribute('data-static-path'), - translations: JSON.parse(script.getAttribute('data-translations')), - theme: { - // image that is displayed if load of failed - img_load_error: 'img/img_load_error.svg' - } + settings: JSON.parse(atob(script.getAttribute('client_settings'))) }; // update the css var hmtlElement = d.getElementsByTagName("html")[0]; hmtlElement.classList.remove('no-js'); hmtlElement.classList.add('js'); -})(window, document); \ No newline at end of file + +})(window, document); diff --git a/searx/static/themes/simple/src/js/main/00_toolkit.js b/searx/static/themes/simple/src/js/main/00_toolkit.js index f53842d72..699731ee4 100644 --- a/searx/static/themes/simple/src/js/main/00_toolkit.js +++ b/searx/static/themes/simple/src/js/main/00_toolkit.js @@ -101,7 +101,7 @@ window.searxng = (function (w, d) { }; searxng.loadStyle = function (src) { - var path = searxng.static_path + src, + var path = searxng.settings.theme_static_path + src, id = "style_" + src.replace('.', '_'), s = d.getElementById(id); if (s === null) { @@ -115,7 +115,7 @@ window.searxng = (function (w, d) { }; searxng.loadScript = function (src, callback) { - var path = searxng.static_path + src, + var path = searxng.settings.theme_static_path + src, id = "script_" + src.replace('.', '_'), s = d.getElementById(id); if (s === null) { diff --git a/searx/static/themes/simple/src/js/main/infinite_scroll.js b/searx/static/themes/simple/src/js/main/infinite_scroll.js index b900e66e2..07db3305a 100644 --- a/searx/static/themes/simple/src/js/main/infinite_scroll.js +++ b/searx/static/themes/simple/src/js/main/infinite_scroll.js @@ -62,7 +62,7 @@ searxng.ready(function () { function (err) { console.log(err); var e = d.createElement('div'); - e.textContent = searxng.translations.error_loading_next_page; + e.textContent = searxng.settings.translations.error_loading_next_page; e.classList.add('dialog-error'); e.setAttribute('role', 'alert'); replaceChildrenWith(d.querySelector('#pagination'), [ e ]); @@ -70,7 +70,7 @@ searxng.ready(function () { ) } - if (searxng.infinite_scroll && searxng.infinite_scroll_supported) { + if (searxng.settings.infinite_scroll && searxng.infinite_scroll_supported) { const intersectionObserveOptions = { rootMargin: "20rem", }; diff --git a/searx/static/themes/simple/src/js/main/keyboard.js b/searx/static/themes/simple/src/js/main/keyboard.js index a8ab7222f..f29ed86f4 100644 --- a/searx/static/themes/simple/src/js/main/keyboard.js +++ b/searx/static/themes/simple/src/js/main/keyboard.js @@ -154,7 +154,7 @@ searxng.ready(function () { } }; - if (searxng.hotkeys) { + if (searxng.settings.hotkeys) { searxng.on(document, "keydown", function (e) { // check for modifiers so we don't break browser's hotkeys if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) { diff --git a/searx/static/themes/simple/src/js/main/preferences.js b/searx/static/themes/simple/src/js/main/preferences.js index 09f9cdde4..1e3ae5981 100644 --- a/searx/static/themes/simple/src/js/main/preferences.js +++ b/searx/static/themes/simple/src/js/main/preferences.js @@ -15,7 +15,7 @@ for (const [engine_name, description] of Object.entries(engine_descriptions)) { let elements = d.querySelectorAll('[data-engine-name="' + engine_name + '"] .engine-description'); for (const element of elements) { - let source = ' (' + searxng.translations['Source'] + ': ' + description[1] + ')'; + let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')'; element.innerHTML = description[0] + source; } } diff --git a/searx/static/themes/simple/src/js/main/search.js b/searx/static/themes/simple/src/js/main/search.js index 798c9b2d3..edd68d259 100644 --- a/searx/static/themes/simple/src/js/main/search.js +++ b/searx/static/themes/simple/src/js/main/search.js @@ -59,11 +59,11 @@ createClearButton(qinput); // autocompleter - if (searxng.autocompleter) { + if (searxng.settings.autocomplete_provider) { searxng.autocomplete = AutoComplete.call(w, { Url: "./autocompleter", - EmptyMessage: searxng.translations.no_item_found, - HttpMethod: searxng.method, + EmptyMessage: searxng.settings.translations.no_item_found, + HttpMethod: searxng.settings.http_method, HttpHeaders: { "Content-type": "application/x-www-form-urlencoded", "X-Requested-With": "XMLHttpRequest" @@ -92,7 +92,7 @@ } // vanilla js version of search_on_category_select.js - if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) { + if (qinput !== null && d.querySelector('.help') != null && searxng.settings.search_on_category_select) { d.querySelector('.help').className = 'invisible'; searxng.on('#categories input', 'change', function () { diff --git a/searx/templates/simple/base.html b/searx/templates/simple/base.html index a82c26a61..d8eaaa02b 100644 --- a/searx/templates/simple/base.html +++ b/searx/templates/simple/base.html @@ -19,14 +19,7 @@ {% endif %} {% block styles %}{% endblock %} - + {% block head %} diff --git a/searx/webapp.py b/searx/webapp.py index 3d3f736a5..b91e96df1 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -10,6 +10,7 @@ import hmac import json import os import sys +import base64 from datetime import datetime, timedelta from timeit import default_timer @@ -444,7 +445,36 @@ def get_pretty_url(parsed_url: urllib.parse.ParseResult): return [parsed_url.scheme + "://" + parsed_url.netloc, path] +def get_client_settings(): + req_pref = request.preferences + return { + 'autocomplete_provider': req_pref.get_value('autocomplete'), + 'http_method': req_pref.get_value('method'), + 'infinite_scroll': req_pref.get_value('infinite_scroll'), + 'translations': get_translations(), + 'search_on_category_select': req_pref.plugins.choices['searx.plugins.search_on_category_select'], + 'hotkeys': req_pref.plugins.choices['searx.plugins.vim_hotkeys'], + 'theme_static_path': custom_url_for('static', filename='themes/simple'), + } + + def render(template_name: str, override_theme: str = None, **kwargs): + + kwargs['client_settings'] = str( + base64.b64encode( + bytes( + json.dumps(get_client_settings()), + encoding='utf-8', + ) + ), encoding='utf-8', + ) + + # obsolete, only needed by oscar + kwargs['autocomplete'] = request.preferences.get_value('autocomplete') + kwargs['method'] = request.preferences.get_value('method') + kwargs['infinite_scroll'] = request.preferences.get_value('infinite_scroll') + kwargs['translations'] = json.dumps(get_translations(), separators=(',', ':')) + # values from the HTTP requests kwargs['endpoint'] = 'results' if 'q' in kwargs else request.endpoint kwargs['cookies'] = request.cookies @@ -452,9 +482,6 @@ def render(template_name: str, override_theme: str = None, **kwargs): # values from the preferences kwargs['preferences'] = request.preferences - kwargs['method'] = request.preferences.get_value('method') - kwargs['autocomplete'] = request.preferences.get_value('autocomplete') - kwargs['infinite_scroll'] = request.preferences.get_value('infinite_scroll') kwargs['results_on_new_tab'] = request.preferences.get_value('results_on_new_tab') kwargs['advanced_search'] = request.preferences.get_value('advanced_search') kwargs['query_in_title'] = request.preferences.get_value('query_in_title') @@ -466,7 +493,6 @@ def render(template_name: str, override_theme: str = None, **kwargs): # i18n kwargs['language_codes'] = [l for l in languages if l[0] in settings['search']['languages']] - kwargs['translations'] = json.dumps(get_translations(), separators=(',', ':')) locale = request.preferences.get_value('locale') kwargs['locale_rfc5646'] = _get_locale_rfc5646(locale) From 444b1e70dbcfd258482b5ee258895593a0a2e42c Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Fri, 22 Apr 2022 13:47:54 +0200 Subject: [PATCH 2/3] [mod] add setting: search.autocomplete_min Minimun characters to type before autocompleter starts. Signed-off-by: Markus Heiser --- searx/settings.yml | 2 ++ searx/settings_defaults.py | 1 + searx/static/themes/simple/src/js/main/search.js | 2 +- searx/webapp.py | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/searx/settings.yml b/searx/settings.yml index 6e5556d0c..5aaf154df 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -18,6 +18,8 @@ search: # "seznam", "startpage", "swisscows", "qwant", "wikipedia" - leave blank to turn it off # by default. autocomplete: "" + # minimun characters to type before autocompleter starts + autocomplete_min: 4 # Default search language - leave blank to detect from browser information or # use codes from 'languages.py' default_lang: "" diff --git a/searx/settings_defaults.py b/searx/settings_defaults.py index 7110fce93..938b9714d 100644 --- a/searx/settings_defaults.py +++ b/searx/settings_defaults.py @@ -153,6 +153,7 @@ SCHEMA = { 'search': { 'safe_search': SettingsValue((0, 1, 2), 0), 'autocomplete': SettingsValue(str, ''), + 'autocomplete_min': SettingsValue(int, 4), 'default_lang': SettingsValue(tuple(LANGUAGE_CODES + ['']), ''), 'languages': SettingSublistValue(LANGUAGE_CODES, LANGUAGE_CODES), 'ban_time_on_fail': SettingsValue(numbers.Real, 5), diff --git a/searx/static/themes/simple/src/js/main/search.js b/searx/static/themes/simple/src/js/main/search.js index edd68d259..20e58e0fe 100644 --- a/searx/static/themes/simple/src/js/main/search.js +++ b/searx/static/themes/simple/src/js/main/search.js @@ -68,7 +68,7 @@ "Content-type": "application/x-www-form-urlencoded", "X-Requested-With": "XMLHttpRequest" }, - MinChars: 4, + MinChars: searxng.settings.autocomplete_min, Delay: 300, _Position: function () {}, _Open: function () { diff --git a/searx/webapp.py b/searx/webapp.py index b91e96df1..178500df6 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -449,6 +449,7 @@ def get_client_settings(): req_pref = request.preferences return { 'autocomplete_provider': req_pref.get_value('autocomplete'), + 'autocomplete_min' : get_setting('search.autocomplete_min'), 'http_method': req_pref.get_value('method'), 'infinite_scroll': req_pref.get_value('infinite_scroll'), 'translations': get_translations(), From 8175290867f6425226d87377512d2ce20fd72a26 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Sat, 7 May 2022 17:58:53 +0200 Subject: [PATCH 3/3] [build] /static --- searx/static/themes/simple/js/searxng.head.min.js | 8 +------- searx/static/themes/simple/js/searxng.head.min.js.map | 2 +- searx/static/themes/simple/js/searxng.min.js | 4 ++-- searx/static/themes/simple/js/searxng.min.js.map | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/searx/static/themes/simple/js/searxng.head.min.js b/searx/static/themes/simple/js/searxng.head.min.js index 2885a301c..18ddcfd15 100644 --- a/searx/static/themes/simple/js/searxng.head.min.js +++ b/searx/static/themes/simple/js/searxng.head.min.js @@ -1,8 +1,2 @@ -/** - * @license - * (C) Copyright Contributors to the SearXNG project. - * (C) Copyright Contributors to the searx project (2014 - 2021). - * SPDX-License-Identifier: AGPL-3.0-or-later - */ -(function(t,e){"use strict";var a=e.currentScript||function(){var t=e.getElementsByTagName("script");return t[t.length-1]}();t.searxng={method:a.getAttribute("data-method"),autocompleter:a.getAttribute("data-autocompleter")==="true",search_on_category_select:a.getAttribute("data-search-on-category-select")==="true",infinite_scroll:a.getAttribute("data-infinite-scroll")==="true",hotkeys:a.getAttribute("data-hotkeys")==="true",static_path:a.getAttribute("data-static-path"),translations:JSON.parse(a.getAttribute("data-translations")),theme:{img_load_error:"img/img_load_error.svg"}};var r=e.getElementsByTagName("html")[0];r.classList.remove("no-js");r.classList.add("js")})(window,document); +(function(t,e){"use strict";var s=e.currentScript||function(){var t=e.getElementsByTagName("script");return t[t.length-1]}();t.searxng={settings:JSON.parse(atob(s.getAttribute("client_settings")))};var n=e.getElementsByTagName("html")[0];n.classList.remove("no-js");n.classList.add("js")})(window,document); //# sourceMappingURL=searxng.head.min.js.map \ No newline at end of file diff --git a/searx/static/themes/simple/js/searxng.head.min.js.map b/searx/static/themes/simple/js/searxng.head.min.js.map index 9fee90adb..7ebfb58f1 100644 --- a/searx/static/themes/simple/js/searxng.head.min.js.map +++ b/searx/static/themes/simple/js/searxng.head.min.js.map @@ -1 +1 @@ -{"version":3,"file":"searxng.head.min.js","sources":["../src/js/head/00_init.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 */\n(function (w, d) {\n 'use strict';\n\n // add data- properties\n var script = d.currentScript || (function () {\n var scripts = d.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n\n // try to detect touch screen\n w.searxng = {\n method: script.getAttribute('data-method'),\n autocompleter: script.getAttribute('data-autocompleter') === 'true',\n search_on_category_select: script.getAttribute('data-search-on-category-select') === 'true',\n infinite_scroll: script.getAttribute('data-infinite-scroll') === 'true',\n hotkeys: script.getAttribute('data-hotkeys') === 'true',\n static_path: script.getAttribute('data-static-path'),\n translations: JSON.parse(script.getAttribute('data-translations')),\n theme: {\n // image that is displayed if load of failed\n img_load_error: 'img/img_load_error.svg'\n }\n };\n\n // update the css\n var hmtlElement = d.getElementsByTagName(\"html\")[0];\n hmtlElement.classList.remove('no-js');\n hmtlElement.classList.add('js');\n})(window, document);"],"names":["w","d","script","currentScript","scripts","getElementsByTagName","length","searxng","method","getAttribute","autocompleter","search_on_category_select","infinite_scroll","hotkeys","static_path","translations","JSON","parse","theme","img_load_error","hmtlElement","classList","remove","add","window","document"],"mappings":";;;;;;CAMA,SAAWA,EAAGC,gBAIZ,IAAIC,EAASD,EAAEE,eAAkB,WAC/B,IAAIC,EAAUH,EAAEI,qBAAqB,UACrC,OAAOD,EAAQA,EAAQE,OAAS,GAFD,GAMjCN,EAAEO,QAAU,CACVC,OAAQN,EAAOO,aAAa,eAC5BC,cAAeR,EAAOO,aAAa,wBAA0B,OAC7DE,0BAA2BT,EAAOO,aAAa,oCAAsC,OACrFG,gBAAiBV,EAAOO,aAAa,0BAA4B,OACjEI,QAASX,EAAOO,aAAa,kBAAoB,OACjDK,YAAaZ,EAAOO,aAAa,oBACjCM,aAAcC,KAAKC,MAAMf,EAAOO,aAAa,sBAC7CS,MAAO,CAELC,eAAgB,2BAKpB,IAAIC,EAAcnB,EAAEI,qBAAqB,QAAQ,GACjDe,EAAYC,UAAUC,OAAO,SAC7BF,EAAYC,UAAUE,IAAI,OA3B5B,CA4BGC,OAAQC"} \ No newline at end of file +{"version":3,"file":"searxng.head.min.js","sources":["../src/js/head/00_init.js"],"sourcesContent":["/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d) {\n 'use strict';\n\n // add data- properties\n var script = d.currentScript || (function () {\n var scripts = d.getElementsByTagName('script');\n return scripts[scripts.length - 1];\n })();\n\n w.searxng = {\n settings: JSON.parse(atob(script.getAttribute('client_settings')))\n };\n\n // update the css\n var hmtlElement = d.getElementsByTagName(\"html\")[0];\n hmtlElement.classList.remove('no-js');\n hmtlElement.classList.add('js');\n\n})(window, document);\n"],"names":["w","d","script","currentScript","scripts","getElementsByTagName","length","searxng","settings","JSON","parse","atob","getAttribute","hmtlElement","classList","remove","add","window","document"],"mappings":"CACA,SAAWA,EAAGC,gBAIZ,IAAIC,EAASD,EAAEE,eAAkB,WAC/B,IAAIC,EAAUH,EAAEI,qBAAqB,UACrC,OAAOD,EAAQA,EAAQE,OAAS,GAFD,GAKjCN,EAAEO,QAAU,CACVC,SAAUC,KAAKC,MAAMC,KAAKT,EAAOU,aAAa,sBAIhD,IAAIC,EAAcZ,EAAEI,qBAAqB,QAAQ,GACjDQ,EAAYC,UAAUC,OAAO,SAC7BF,EAAYC,UAAUE,IAAI,OAhB5B,CAkBGC,OAAQC"} \ No newline at end of file diff --git a/searx/static/themes/simple/js/searxng.min.js b/searx/static/themes/simple/js/searxng.min.js index a889e680b..b0cbe2918 100644 --- a/searx/static/themes/simple/js/searxng.min.js +++ b/searx/static/themes/simple/js/searxng.min.js @@ -4,7 +4,7 @@ * (C) Copyright Contributors to the searx project (2014 - 2021). * SPDX-License-Identifier: AGPL-3.0-or-later */ -window.searxng=function(t,i){"use strict";if(t.Element){(function(e){e.matches=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.msMatchesSelector||function(e){var t=this,n=(t.parentNode||t.document).querySelectorAll(e),r=-1;while(n[++r]&&n[r]!=t);return!!n[r]}})(Element.prototype)}function s(e,t,n){try{e.call(t,n)}catch(e){console.log(e)}}var a=window.searxng||{};a.on=function(r,e,o,t){t=t||false;if(typeof r!=="string"){r.addEventListener(e,o,t)}else{i.addEventListener(e,function(e){var t=e.target||e.srcElement,n=false;while(t&&t.matches&&t!==i&&!(n=t.matches(r)))t=t.parentElement;if(n)s(o,t,e)},t)}};a.ready=function(e){if(document.readyState!="loading"){e.call(t)}else{t.addEventListener("DOMContentLoaded",e.bind(t))}};a.http=function(r,o,i=null){return new Promise(function(e,t){try{var n=new XMLHttpRequest;n.open(r,o,true);n.timeout=2e4;n.onload=function(){if(n.status==200){e(n.response,n.responseType)}else{t(Error(n.statusText))}};n.onerror=function(){t(Error("Network Error"))};n.onabort=function(){t(Error("Transaction is aborted"))};n.ontimeout=function(){t(Error("Timeout"))};if(i){n.send(i)}else{n.send()}}catch(e){t(e)}})};a.loadStyle=function(e){var t=a.static_path+e,n="style_"+e.replace(".","_"),r=i.getElementById(n);if(r===null){r=i.createElement("link");r.setAttribute("id",n);r.setAttribute("rel","stylesheet");r.setAttribute("type","text/css");r.setAttribute("href",t);i.body.appendChild(r)}};a.loadScript=function(e,t){var n=a.static_path+e,r="script_"+e.replace(".","_"),o=i.getElementById(r);if(o===null){o=i.createElement("script");o.setAttribute("id",r);o.setAttribute("src",n);o.onload=t;o.onerror=function(){o.setAttribute("error","1")};i.body.appendChild(o)}else if(!o.hasAttribute("error")){try{t.apply(o,[])}catch(e){console.log(e)}}else{console.log("callback not executed : script '"+n+"' not loaded.")}};a.insertBefore=function(e,t){t.parentNode.insertBefore(e,t)};a.insertAfter=function(e,t){t.parentNode.insertAfter(e,t.nextSibling)};a.on(".close","click",function(){this.parentNode.classList.add("invisible")});function e(){for(var e of i.getElementsByTagName("body")[0].classList.values()){if(e.endsWith("_endpoint")){return e.split("_")[0]}}return""}a.endpoint=e();return a}(window,document);searxng.ready(function(){"use strict";searxng.infinite_scroll_supported="IntersectionObserver"in window&&"IntersectionObserverEntry"in window&&"intersectionRatio"in window.IntersectionObserverEntry.prototype;if(searxng.endpoint!=="results"){return}if(!searxng.infinite_scroll_supported){console.log("IntersectionObserver not supported");return}let i=document;var s=i.getElementById("results").classList.contains("only_template_images");function n(){var e=i.createElement("div");e.classList.add("loader");return e}function r(t,e){t.textContent="";e.forEach(e=>t.appendChild(e))}function o(o){var e=i.querySelector("#pagination form.next_page");if(!e){return}r(i.querySelector("#pagination"),[n()]);var t=new FormData(e);searxng.http("POST",i.querySelector("#search").getAttribute("action"),t).then(function(e){var t=(new DOMParser).parseFromString(e,"text/html");var n=t.querySelectorAll("#urls article");var r=t.querySelector("#pagination");i.querySelector("#pagination").remove();if(n.length>0&&!s){i.querySelector("#urls").appendChild(i.createElement("hr"))}n.forEach(e=>{i.querySelector("#urls").appendChild(e)});if(r){i.querySelector("#results").appendChild(r);o()}}).catch(function(e){console.log(e);var t=i.createElement("div");t.textContent=searxng.translations.error_loading_next_page;t.classList.add("dialog-error");t.setAttribute("role","alert");r(i.querySelector("#pagination"),[t])})}if(searxng.infinite_scroll&&searxng.infinite_scroll_supported){const a={rootMargin:"20rem"};const l="article.result:last-child";const u=new IntersectionObserver(e=>{const t=e[0];if(t.isIntersecting){u.unobserve(t.target);o(()=>u.observe(i.querySelector(l),a))}});u.observe(i.querySelector(l),a)}});searxng.ready(function(){function e(e){while(e!==undefined){if(e.classList.contains("detail")){return true}if(e.classList.contains("result")){return false}e=e.parentNode}return false}function n(e){while(e!==undefined){if(e.classList.contains("result")){return e}e=e.parentNode}return undefined}function r(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(t){if(!e(t.target)){o(this)(true);let e=n(t.target);if(r(e)){t.preventDefault();searxng.selectImage(e)}}});searxng.on(".result a","focus",function(t){if(!e(t.target)){let e=n(t.target);if(e&&e.getAttribute("data-vim-selected")===null){o(e)(true)}if(r(e)){searxng.selectImage(e)}}},true);var d={27:{key:"Escape",fun:i,des:"remove focus from the focused input",cat:"Control"},73:{key:"i",fun:p,des:"focus on the search input",cat:"Control"},66:{key:"b",fun:u(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},70:{key:"f",fun:u(window.innerHeight),des:"scroll one page down",cat:"Navigation"},85:{key:"u",fun:u(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},68:{key:"d",fun:u(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},71:{key:"g",fun:c(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},86:{key:"v",fun:c(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},75:{key:"k",fun:o("up"),des:"select previous search result",cat:"Results"},74:{key:"j",fun:o("down"),des:"select next search result",cat:"Results"},80:{key:"p",fun:l(),des:"go to previous page",cat:"Results"},78:{key:"n",fun:a(),des:"go to next page",cat:"Results"},79:{key:"o",fun:h(false),des:"open search result",cat:"Results"},84:{key:"t",fun:h(true),des:"open the result in a new tab",cat:"Results"},82:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},72:{key:"h",fun:g,des:"toggle help window",cat:"Other"}};if(searxng.hotkeys){searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(d,e.keyCode)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var t=e.target.tagName.toLowerCase();if(e.keyCode===27){d[e.keyCode].fun(e)}else{if(e.target===document.body||t==="a"||t==="button"){e.preventDefault();d[e.keyCode].fun()}}}})}function o(d){return function(e){var t=document.querySelector(".result[data-vim-selected]"),n=d;if(t===null){t=document.querySelector(".result");if(t===null){return}if(d==="down"||d==="up"){n=t}}var r,o=document.querySelectorAll(".result");if(typeof n!=="string"){r=n}else{switch(n){case"visible":var i=document.documentElement.scrollTop||document.body.scrollTop;var s=i+document.documentElement.clientHeight;for(var a=0;ai){break}}break;case"down":r=t.nextElementSibling;if(r===null){r=o[0]}break;case"up":r=t.previousElementSibling;if(r===null){r=o[o.length-1]}break;case"bottom":r=o[o.length-1];break;case"top":default:r=o[0]}}if(r){t.removeAttribute("data-vim-selected");r.setAttribute("data-vim-selected","true");var c=r.querySelector("h3 a")||r.querySelector("a");if(c!==null){c.focus()}if(!e){f()}}}}function t(){document.location.reload(true)}function i(e){const t=e.target.tagName.toLowerCase();if(document.activeElement&&(t==="input"||t==="select"||t==="textarea")){document.activeElement.blur()}else{searxng.closeDetail()}}function s(t){return function(){var e=document.querySelector(t);if(e){e.click()}}}function a(){return s('nav#pagination .next_page button[type="submit"]')}function l(){return s('nav#pagination .previous_page button[type="submit"]')}function f(){var e=document.querySelector(".result[data-vim-selected]");if(e===null){return}var t=document.documentElement.scrollTop||document.body.scrollTop,n=document.documentElement.clientHeight,r=e.offsetTop,o=r+e.clientHeight,i=120;if(e.previousElementSibling===null&&or-i){window.scroll(window.scrollX,r-i)}else{var s=t+n;if(s a")}if(e!==null){var t=e.getAttribute("href");if(n){window.open(t)}else{window.location.href=t}}}}function m(e){var n={};for(var t in d){var r=d[t];n[r.cat]=n[r.cat]||[];n[r.cat].push(r)}var o=Object.keys(n).sort(function(e,t){return n[t].length-n[e].length});if(o.length===0){return}var i='×';i+="

How to navigate searx with Vim-like hotkeys

";i+="";for(var s=0;s"}i+="";if(!u||l){i+=""}}i+="
";i+="

"+a[0].cat+"

";i+='
    ';for(var c in a){i+="
  • "+a[c].key+" "+a[c].des+"
  • "}i+="
";i+="
";e.innerHTML=i}function g(){var e=document.querySelector("#vim-hotkeys-help");if(e===undefined||e===null){e=document.createElement("div");e.id="vim-hotkeys-help";e.className="dialog-modal";m(e);m(e);m(e);var t=document.getElementsByTagName("body")[0];t.appendChild(e)}else{e.classList.toggle("invisible");return}}searxng.scrollPageToSelected=f;searxng.selectNext=o("down");searxng.selectPrevious=o("up")});(function(e,t,n){"use strict";n.ready(function(){n.on(".searxng_init_map","click",function(e){this.classList.remove("searxng_init_map");var d=this.dataset.leafletTarget;var f=parseFloat(this.dataset.mapLon);var p=parseFloat(this.dataset.mapLat);var h=parseFloat(this.dataset.mapZoom);var m=JSON.parse(this.dataset.mapBoundingbox);var g=JSON.parse(this.dataset.mapGeojson);n.loadStyle("css/leaflet.css");n.loadScript("js/leaflet.js",function(){var e=null;if(m){var t=L.latLng(m[0],m[2]);var n=L.latLng(m[1],m[3]);e=L.latLngBounds(t,n)}var r=L.map(d);var o="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";var i='Map data © OpenStreetMap contributors';var s=new L.TileLayer(o,{minZoom:1,maxZoom:19,attribution:i});var a="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";var l='Wikimedia maps | Maps data © OpenStreetMap contributors';var u=new L.TileLayer(a,{minZoom:1,maxZoom:19,attribution:l});if(e){setTimeout(function(){r.fitBounds(e,{maxZoom:17})},0)}else if(f&&p){if(h){r.setView(new L.latLng(p,f),h)}else{r.setView(new L.latLng(p,f),8)}}r.addLayer(s);var c={"OSM Mapnik":s,"OSM Wikimedia":u};L.control.layers(c).addTo(r);if(g){L.geoJson(g).addTo(r)}});e.preventDefault()})})})(window,document,window.searxng);(function(e,i,s){"use strict";if(s.endpoint!=="preferences"){return}s.ready(function(){let o=null;function e(){if(o==null){s.http("GET","engine_descriptions.json").then(function(e){o=JSON.parse(e);for(const[t,n]of Object.entries(o)){let e=i.querySelectorAll('[data-engine-name="'+t+'"] .engine-description');for(const r of e){let e=" ("+s.translations["Source"]+": "+n[1]+")";r.innerHTML=n[0]+e}}})}}for(const t of i.querySelectorAll("[data-engine-name]")){s.on(t,"mouseenter",e)}})})(window,document,window.searxng);(function(e,a,l){"use strict";if(l.endpoint!=="results"){return}l.ready(function(){a.querySelectorAll("#urls img.image").forEach(e=>e.addEventListener("error",()=>{e.style.display="none";e.error=null}));l.on(".btn-collapse","click",function(){var e=this.getAttribute("data-btn-text-collapsed");var t=this.getAttribute("data-btn-text-not-collapsed");var n=this.getAttribute("data-target");var r=a.querySelector(n);var o=this.innerHTML;if(this.classList.contains("collapsed")){o=o.replace(e,t)}else{o=o.replace(t,e)}this.innerHTML=o;this.classList.toggle("collapsed");r.classList.toggle("invisible")});l.on(".media-loader","click",function(){var e=this.getAttribute("data-target");var t=a.querySelector(e+" > iframe");var n=t.getAttribute("src");if(n===null||n===undefined||n===false){t.setAttribute("src",t.getAttribute("data-src"))}});l.selectImage=function(e){if(e){const t=e.querySelector(".result-images-source img");const n=e.querySelector(".image_thumbnail");const r=e.querySelector(".detail");if(t){const o=t.getAttribute("data-src");if(o){const i=a.createElement("div");const s=new Image;i.classList.add("loader");r.appendChild(i);s.onload=e=>{t.src=o;i.remove()};s.onerror=e=>{i.remove()};s.src=o;t.src=n.src;t.removeAttribute("data-src")}}}a.getElementById("results").classList.add("image-detail-open");l.scrollPageToSelected()};l.closeDetail=function(e){a.getElementById("results").classList.remove("image-detail-open");l.scrollPageToSelected()};l.on(".result-detail-close","click",e=>{e.preventDefault();l.closeDetail()});l.on(".result-detail-previous","click",e=>l.selectPrevious(false));l.on(".result-detail-next","click",e=>l.selectNext(false));e.addEventListener("scroll",function(){var e=a.getElementById("backToTop"),t=document.documentElement.scrollTop||document.body.scrollTop,n=a.getElementById("results");if(e!==null){if(t>=100){n.classList.add("scrolling")}else{n.classList.remove("scrolling")}}},true)})})(window,document,window.searxng);(function(t,n,r){"use strict";var o=true,i="q",s;const a=window.matchMedia("only screen and (max-width: 50em)").matches;function l(e){if(e.setSelectionRange){var t=e.value.length;e.setSelectionRange(t,t)}}function u(){if(s.value.length>0){var e=document.getElementById("search");setTimeout(e.submit.bind(e),0)}}function c(t){var e=document.getElementById("clear_search");var n=function(){if(t.value.length===0){e.classList.add("empty")}else{e.classList.remove("empty")}};n();e.addEventListener("click",function(e){t.value="";t.focus();n();e.preventDefault()});t.addEventListener("keyup",n,false)}r.ready(function(){s=n.getElementById(i);function e(){if(o){l(s);o=false}else{}}if(s!==null){c(s);if(r.autocompleter){r.autocomplete=AutoComplete.call(t,{Url:"./autocompleter",EmptyMessage:r.translations.no_item_found,HttpMethod:r.method,HttpHeaders:{"Content-type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},MinChars:4,Delay:300,_Position:function(){},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(e){if(e.getAttribute("class")!="locked"){e.onmousedown=function(){t._Select(e)}}})}},"#"+i)}s.addEventListener("focus",e,false);if(!a){s.focus()}}if(s!==null&&n.querySelector(".help")!=null&&r.search_on_category_select){n.querySelector(".help").className="invisible";r.on("#categories input","change",function(){var e,t=n.querySelectorAll('#categories input[type="checkbox"]');for(e=0;et.appendChild(e))}function i(i){var e=o.querySelector("#pagination form.next_page");if(!e){return}r(o.querySelector("#pagination"),[n()]);var t=new FormData(e);searxng.http("POST",o.querySelector("#search").getAttribute("action"),t).then(function(e){var t=(new DOMParser).parseFromString(e,"text/html");var n=t.querySelectorAll("#urls article");var r=t.querySelector("#pagination");o.querySelector("#pagination").remove();if(n.length>0&&!s){o.querySelector("#urls").appendChild(o.createElement("hr"))}n.forEach(e=>{o.querySelector("#urls").appendChild(e)});if(r){o.querySelector("#results").appendChild(r);i()}}).catch(function(e){console.log(e);var t=o.createElement("div");t.textContent=searxng.settings.translations.error_loading_next_page;t.classList.add("dialog-error");t.setAttribute("role","alert");r(o.querySelector("#pagination"),[t])})}if(searxng.settings.infinite_scroll&&searxng.infinite_scroll_supported){const a={rootMargin:"20rem"};const l="article.result:last-child";const u=new IntersectionObserver(e=>{const t=e[0];if(t.isIntersecting){u.unobserve(t.target);i(()=>u.observe(o.querySelector(l),a))}});u.observe(o.querySelector(l),a)}});searxng.ready(function(){function e(e){while(e!==undefined){if(e.classList.contains("detail")){return true}if(e.classList.contains("result")){return false}e=e.parentNode}return false}function n(e){while(e!==undefined){if(e.classList.contains("result")){return e}e=e.parentNode}return undefined}function r(e){return e&&e.classList.contains("result-images")}searxng.on(".result","click",function(t){if(!e(t.target)){i(this)(true);let e=n(t.target);if(r(e)){t.preventDefault();searxng.selectImage(e)}}});searxng.on(".result a","focus",function(t){if(!e(t.target)){let e=n(t.target);if(e&&e.getAttribute("data-vim-selected")===null){i(e)(true)}if(r(e)){searxng.selectImage(e)}}},true);var d={27:{key:"Escape",fun:o,des:"remove focus from the focused input",cat:"Control"},73:{key:"i",fun:p,des:"focus on the search input",cat:"Control"},66:{key:"b",fun:u(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},70:{key:"f",fun:u(window.innerHeight),des:"scroll one page down",cat:"Navigation"},85:{key:"u",fun:u(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},68:{key:"d",fun:u(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},71:{key:"g",fun:c(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},86:{key:"v",fun:c(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},75:{key:"k",fun:i("up"),des:"select previous search result",cat:"Results"},74:{key:"j",fun:i("down"),des:"select next search result",cat:"Results"},80:{key:"p",fun:l(),des:"go to previous page",cat:"Results"},78:{key:"n",fun:a(),des:"go to next page",cat:"Results"},79:{key:"o",fun:h(false),des:"open search result",cat:"Results"},84:{key:"t",fun:h(true),des:"open the result in a new tab",cat:"Results"},82:{key:"r",fun:t,des:"reload page from the server",cat:"Control"},72:{key:"h",fun:g,des:"toggle help window",cat:"Other"}};if(searxng.settings.hotkeys){searxng.on(document,"keydown",function(e){if(Object.prototype.hasOwnProperty.call(d,e.keyCode)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var t=e.target.tagName.toLowerCase();if(e.keyCode===27){d[e.keyCode].fun(e)}else{if(e.target===document.body||t==="a"||t==="button"){e.preventDefault();d[e.keyCode].fun()}}}})}function i(d){return function(e){var t=document.querySelector(".result[data-vim-selected]"),n=d;if(t===null){t=document.querySelector(".result");if(t===null){return}if(d==="down"||d==="up"){n=t}}var r,i=document.querySelectorAll(".result");if(typeof n!=="string"){r=n}else{switch(n){case"visible":var o=document.documentElement.scrollTop||document.body.scrollTop;var s=o+document.documentElement.clientHeight;for(var a=0;ao){break}}break;case"down":r=t.nextElementSibling;if(r===null){r=i[0]}break;case"up":r=t.previousElementSibling;if(r===null){r=i[i.length-1]}break;case"bottom":r=i[i.length-1];break;case"top":default:r=i[0]}}if(r){t.removeAttribute("data-vim-selected");r.setAttribute("data-vim-selected","true");var c=r.querySelector("h3 a")||r.querySelector("a");if(c!==null){c.focus()}if(!e){f()}}}}function t(){document.location.reload(true)}function o(e){const t=e.target.tagName.toLowerCase();if(document.activeElement&&(t==="input"||t==="select"||t==="textarea")){document.activeElement.blur()}else{searxng.closeDetail()}}function s(t){return function(){var e=document.querySelector(t);if(e){e.click()}}}function a(){return s('nav#pagination .next_page button[type="submit"]')}function l(){return s('nav#pagination .previous_page button[type="submit"]')}function f(){var e=document.querySelector(".result[data-vim-selected]");if(e===null){return}var t=document.documentElement.scrollTop||document.body.scrollTop,n=document.documentElement.clientHeight,r=e.offsetTop,i=r+e.clientHeight,o=120;if(e.previousElementSibling===null&&ir-o){window.scroll(window.scrollX,r-o)}else{var s=t+n;if(s a")}if(e!==null){var t=e.getAttribute("href");if(n){window.open(t)}else{window.location.href=t}}}}function m(e){var n={};for(var t in d){var r=d[t];n[r.cat]=n[r.cat]||[];n[r.cat].push(r)}var i=Object.keys(n).sort(function(e,t){return n[t].length-n[e].length});if(i.length===0){return}var o='×';o+="

How to navigate searx with Vim-like hotkeys

";o+="";for(var s=0;s"}o+="";if(!u||l){o+=""}}o+="
";o+="

"+a[0].cat+"

";o+='
    ';for(var c in a){o+="
  • "+a[c].key+" "+a[c].des+"
  • "}o+="
";o+="
";e.innerHTML=o}function g(){var e=document.querySelector("#vim-hotkeys-help");if(e===undefined||e===null){e=document.createElement("div");e.id="vim-hotkeys-help";e.className="dialog-modal";m(e);m(e);m(e);var t=document.getElementsByTagName("body")[0];t.appendChild(e)}else{e.classList.toggle("invisible");return}}searxng.scrollPageToSelected=f;searxng.selectNext=i("down");searxng.selectPrevious=i("up")});(function(e,t,n){"use strict";n.ready(function(){n.on(".searxng_init_map","click",function(e){this.classList.remove("searxng_init_map");var d=this.dataset.leafletTarget;var f=parseFloat(this.dataset.mapLon);var p=parseFloat(this.dataset.mapLat);var h=parseFloat(this.dataset.mapZoom);var m=JSON.parse(this.dataset.mapBoundingbox);var g=JSON.parse(this.dataset.mapGeojson);n.loadStyle("css/leaflet.css");n.loadScript("js/leaflet.js",function(){var e=null;if(m){var t=L.latLng(m[0],m[2]);var n=L.latLng(m[1],m[3]);e=L.latLngBounds(t,n)}var r=L.map(d);var i="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";var o='Map data © OpenStreetMap contributors';var s=new L.TileLayer(i,{minZoom:1,maxZoom:19,attribution:o});var a="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";var l='Wikimedia maps | Maps data © OpenStreetMap contributors';var u=new L.TileLayer(a,{minZoom:1,maxZoom:19,attribution:l});if(e){setTimeout(function(){r.fitBounds(e,{maxZoom:17})},0)}else if(f&&p){if(h){r.setView(new L.latLng(p,f),h)}else{r.setView(new L.latLng(p,f),8)}}r.addLayer(s);var c={"OSM Mapnik":s,"OSM Wikimedia":u};L.control.layers(c).addTo(r);if(g){L.geoJson(g).addTo(r)}});e.preventDefault()})})})(window,document,window.searxng);(function(e,o,s){"use strict";if(s.endpoint!=="preferences"){return}s.ready(function(){let i=null;function e(){if(i==null){s.http("GET","engine_descriptions.json").then(function(e){i=JSON.parse(e);for(const[t,n]of Object.entries(i)){let e=o.querySelectorAll('[data-engine-name="'+t+'"] .engine-description');for(const r of e){let e=" ("+s.settings.translations.Source+": "+n[1]+")";r.innerHTML=n[0]+e}}})}}for(const t of o.querySelectorAll("[data-engine-name]")){s.on(t,"mouseenter",e)}})})(window,document,window.searxng);(function(e,a,l){"use strict";if(l.endpoint!=="results"){return}l.ready(function(){a.querySelectorAll("#urls img.image").forEach(e=>e.addEventListener("error",()=>{e.style.display="none";e.error=null}));l.on(".btn-collapse","click",function(){var e=this.getAttribute("data-btn-text-collapsed");var t=this.getAttribute("data-btn-text-not-collapsed");var n=this.getAttribute("data-target");var r=a.querySelector(n);var i=this.innerHTML;if(this.classList.contains("collapsed")){i=i.replace(e,t)}else{i=i.replace(t,e)}this.innerHTML=i;this.classList.toggle("collapsed");r.classList.toggle("invisible")});l.on(".media-loader","click",function(){var e=this.getAttribute("data-target");var t=a.querySelector(e+" > iframe");var n=t.getAttribute("src");if(n===null||n===undefined||n===false){t.setAttribute("src",t.getAttribute("data-src"))}});l.selectImage=function(e){if(e){const t=e.querySelector(".result-images-source img");const n=e.querySelector(".image_thumbnail");const r=e.querySelector(".detail");if(t){const i=t.getAttribute("data-src");if(i){const o=a.createElement("div");const s=new Image;o.classList.add("loader");r.appendChild(o);s.onload=e=>{t.src=i;o.remove()};s.onerror=e=>{o.remove()};s.src=i;t.src=n.src;t.removeAttribute("data-src")}}}a.getElementById("results").classList.add("image-detail-open");l.scrollPageToSelected()};l.closeDetail=function(e){a.getElementById("results").classList.remove("image-detail-open");l.scrollPageToSelected()};l.on(".result-detail-close","click",e=>{e.preventDefault();l.closeDetail()});l.on(".result-detail-previous","click",e=>l.selectPrevious(false));l.on(".result-detail-next","click",e=>l.selectNext(false));e.addEventListener("scroll",function(){var e=a.getElementById("backToTop"),t=document.documentElement.scrollTop||document.body.scrollTop,n=a.getElementById("results");if(e!==null){if(t>=100){n.classList.add("scrolling")}else{n.classList.remove("scrolling")}}},true)})})(window,document,window.searxng);(function(t,n,r){"use strict";var i=true,o="q",s;const a=window.matchMedia("only screen and (max-width: 50em)").matches;function l(e){if(e.setSelectionRange){var t=e.value.length;e.setSelectionRange(t,t)}}function u(){if(s.value.length>0){var e=document.getElementById("search");setTimeout(e.submit.bind(e),0)}}function c(t){var e=document.getElementById("clear_search");var n=function(){if(t.value.length===0){e.classList.add("empty")}else{e.classList.remove("empty")}};n();e.addEventListener("click",function(e){t.value="";t.focus();n();e.preventDefault()});t.addEventListener("keyup",n,false)}r.ready(function(){s=n.getElementById(o);function e(){if(i){l(s);i=false}else{}}if(s!==null){c(s);if(r.settings.autocomplete_provider){r.autocomplete=AutoComplete.call(t,{Url:"./autocompleter",EmptyMessage:r.settings.translations.no_item_found,HttpMethod:r.settings.http_method,HttpHeaders:{"Content-type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},MinChars:r.settings.autocomplete_min,Delay:300,_Position:function(){},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(e){if(e.getAttribute("class")!="locked"){e.onmousedown=function(){t._Select(e)}}})}},"#"+o)}s.addEventListener("focus",e,false);if(!a){s.focus()}}if(s!==null&&n.querySelector(".help")!=null&&r.settings.search_on_category_select){n.querySelector(".help").className="invisible";r.on("#categories input","change",function(){var e,t=n.querySelectorAll('#categories input[type="checkbox"]');for(e=0;e=e.From&&n.keyCode<=e.To){s=!e.Not}else{s=e.Not}}}};for(var o in a.prototype.getEventsByType(e,t)){var i=a.merge({Operator:l.AND},e.KeyboardMappings[o]),s=l.AND==i.Operator;i.Conditions.forEach(r);if(s===true){i.Callback.call(e,n)}}};a.prototype.makeRequest=function(e,t,n){var r=Object.getOwnPropertyNames(e.HttpHeaders),o=new XMLHttpRequest,i=e._HttpMethod(),s=e._Url(),a=e._Pre(),l=encodeURIComponent(e._QueryArg())+"="+encodeURIComponent(a);if(i.match(/^GET$/i)){if(s.indexOf("?")!==-1){s+="&"+l}else{s+="?"+l}}o.open(i,s,true);for(var u=r.length-1;u>=0;u--){o.setRequestHeader(r[u],e.HttpHeaders[r[u]])}o.onreadystatechange=function(){if(o.readyState==4&&o.status==200){e.$Cache[a]=o.response;t(o.response)}else if(o.status>=400){n()}};return o};a.prototype.ajax=function(e,t,n){if(n===void 0){n=true}if(e.$AjaxTimer){window.clearTimeout(e.$AjaxTimer)}if(n===true){e.$AjaxTimer=window.setTimeout(a.prototype.ajax.bind(null,e,t,false),e.Delay)}else{if(e.Request){e.Request.abort()}e.Request=t;e.Request.send(e._QueryArg()+"="+e._Pre())}};a.prototype.cache=function(e,t,n){var r=e._Cache(e._Pre());if(r===undefined){var o=a.prototype.makeRequest(e,t,n);a.prototype.ajax(e,o)}else{t(r)}};a.prototype.destroy=function(e){for(var t in e.$Listeners){e.Input.removeEventListener(t,e.$Listeners[t])}e.DOMResults.parentNode.removeChild(e.DOMResults)};a.merge=function(){var e={},t;for(var n=0;n"+e+""}},HttpHeaders:{"Content-type":"application/x-www-form-urlencoded"},Limit:0,MinChars:0,HttpMethod:"GET",QueryArg:"q",Url:null,KeyboardMappings:{Enter:{Conditions:[{Is:13,Not:false}],Callback:function(e){if(this.DOMResults.getAttribute("class").indexOf("open")!=-1){var t=this.DOMResults.querySelector("li.active");if(t!==null){e.preventDefault();this._Select(t);this.DOMResults.setAttribute("class","autocomplete")}}},Operator:l.AND,Event:i.KEYDOWN},KeyUpAndDown_down:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault()},Operator:l.OR,Event:i.KEYDOWN},KeyUpAndDown_up:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault();var t=this.DOMResults.querySelector("li:first-child:not(.locked)"),n=this.DOMResults.querySelector("li:last-child:not(.locked)"),r=this.DOMResults.querySelector("li.active");if(r){var o=Array.prototype.indexOf.call(r.parentNode.children,r),i=o+(e.keyCode-39),s=this.DOMResults.getElementsByTagName("li").length;if(i<0){i=s-1}else if(i>=s){i=0}r.classList.remove("active");r.parentElement.children.item(i).classList.add("active")}else if(n&&e.keyCode==38){n.classList.add("active")}else if(t){t.classList.add("active")}},Operator:l.OR,Event:i.KEYUP},AlphaNum:{Conditions:[{Is:13,Not:true},{From:35,To:40,Not:true}],Callback:function(){var e=this.Input.getAttribute("data-autocomplete-old-value"),t=this._Pre();if(t!==""&&t.length>=this._MinChars()){if(!e||t!=e){this.DOMResults.setAttribute("class","autocomplete open")}a.prototype.cache(this,function(e){this._Render(this._Post(e));this._Open()}.bind(this),this._Error)}else{this._Close()}},Operator:l.AND,Event:i.KEYUP}},DOMResults:null,Request:null,Input:null,_EmptyMessage:function(){var e="";if(this.Input.hasAttribute("data-autocomplete-empty-message")){e=this.Input.getAttribute("data-autocomplete-empty-message")}else if(this.EmptyMessage!==false){e=this.EmptyMessage}else{e=""}return e},_Limit:function(){var e=this.Input.getAttribute("data-autocomplete-limit");if(isNaN(e)||e===null){return this.Limit}return parseInt(e,10)},_MinChars:function(){var e=this.Input.getAttribute("data-autocomplete-minchars");if(isNaN(e)||e===null){return this.MinChars}return parseInt(e,10)},_Highlight:function(e){return e.replace(this.Highlight.getRegex(this._Pre()),this.Highlight.transform)},_HttpMethod:function(){if(this.Input.hasAttribute("data-autocomplete-method")){return this.Input.getAttribute("data-autocomplete-method")}return this.HttpMethod},_QueryArg:function(){if(this.Input.hasAttribute("data-autocomplete-param-name")){return this.Input.getAttribute("data-autocomplete-param-name")}return this.QueryArg},_Url:function(){if(this.Input.hasAttribute("data-autocomplete")){return this.Input.getAttribute("data-autocomplete")}return this.Url},_Blur:function(e){if(e===void 0){e=false}if(e){this._Close()}else{var t=this;setTimeout(function(){t._Blur(true)},150)}},_Cache:function(e){return this.$Cache[e]},_Focus:function(){var e=this.Input.getAttribute("data-autocomplete-old-value");if((!e||this.Input.value!=e)&&this._MinChars()<=this.Input.value.length){this.DOMResults.setAttribute("class","autocomplete open")}},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(e){if(e.getAttribute("class")!="locked"){e.onclick=function(){t._Select(e)}}})},_Close:function(){this.DOMResults.setAttribute("class","autocomplete")},_Position:function(){this.DOMResults.setAttribute("class","autocomplete");this.DOMResults.setAttribute("style","top:"+(this.Input.offsetTop+this.Input.offsetHeight)+"px;left:"+this.Input.offsetLeft+"px;width:"+this.Input.clientWidth+"px;")},_Render:function(e){var t;if(typeof e=="string"){t=this._RenderRaw(e)}else{t=this._RenderResponseItems(e)}if(this.DOMResults.hasChildNodes()){this.DOMResults.removeChild(this.DOMResults.childNodes[0])}this.DOMResults.appendChild(t)},_RenderResponseItems:function(e){var t=document.createElement("ul"),n=document.createElement("li"),r=this._Limit();if(r<0){e=e.reverse()}else if(r===0){r=e.length}for(var o=0;o0){this.DOMResults.innerHTML=e}else{var r=this._EmptyMessage();if(r!==""){n.innerHTML=r;n.setAttribute("class","locked");t.appendChild(n)}}return t},_Post:function(t){try{var e=[];var n=JSON.parse(t);if(Object.keys(n).length===0){return""}if(Array.isArray(n)){for(var r=0;r=e.From&&n.keyCode<=e.To){s=!e.Not}else{s=e.Not}}}};for(var i in a.prototype.getEventsByType(e,t)){var o=a.merge({Operator:l.AND},e.KeyboardMappings[i]),s=l.AND==o.Operator;o.Conditions.forEach(r);if(s===true){o.Callback.call(e,n)}}};a.prototype.makeRequest=function(e,t,n){var r=Object.getOwnPropertyNames(e.HttpHeaders),i=new XMLHttpRequest,o=e._HttpMethod(),s=e._Url(),a=e._Pre(),l=encodeURIComponent(e._QueryArg())+"="+encodeURIComponent(a);if(o.match(/^GET$/i)){if(s.indexOf("?")!==-1){s+="&"+l}else{s+="?"+l}}i.open(o,s,true);for(var u=r.length-1;u>=0;u--){i.setRequestHeader(r[u],e.HttpHeaders[r[u]])}i.onreadystatechange=function(){if(i.readyState==4&&i.status==200){e.$Cache[a]=i.response;t(i.response)}else if(i.status>=400){n()}};return i};a.prototype.ajax=function(e,t,n){if(n===void 0){n=true}if(e.$AjaxTimer){window.clearTimeout(e.$AjaxTimer)}if(n===true){e.$AjaxTimer=window.setTimeout(a.prototype.ajax.bind(null,e,t,false),e.Delay)}else{if(e.Request){e.Request.abort()}e.Request=t;e.Request.send(e._QueryArg()+"="+e._Pre())}};a.prototype.cache=function(e,t,n){var r=e._Cache(e._Pre());if(r===undefined){var i=a.prototype.makeRequest(e,t,n);a.prototype.ajax(e,i)}else{t(r)}};a.prototype.destroy=function(e){for(var t in e.$Listeners){e.Input.removeEventListener(t,e.$Listeners[t])}e.DOMResults.parentNode.removeChild(e.DOMResults)};a.merge=function(){var e={},t;for(var n=0;n"+e+""}},HttpHeaders:{"Content-type":"application/x-www-form-urlencoded"},Limit:0,MinChars:0,HttpMethod:"GET",QueryArg:"q",Url:null,KeyboardMappings:{Enter:{Conditions:[{Is:13,Not:false}],Callback:function(e){if(this.DOMResults.getAttribute("class").indexOf("open")!=-1){var t=this.DOMResults.querySelector("li.active");if(t!==null){e.preventDefault();this._Select(t);this.DOMResults.setAttribute("class","autocomplete")}}},Operator:l.AND,Event:o.KEYDOWN},KeyUpAndDown_down:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault()},Operator:l.OR,Event:o.KEYDOWN},KeyUpAndDown_up:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault();var t=this.DOMResults.querySelector("li:first-child:not(.locked)"),n=this.DOMResults.querySelector("li:last-child:not(.locked)"),r=this.DOMResults.querySelector("li.active");if(r){var i=Array.prototype.indexOf.call(r.parentNode.children,r),o=i+(e.keyCode-39),s=this.DOMResults.getElementsByTagName("li").length;if(o<0){o=s-1}else if(o>=s){o=0}r.classList.remove("active");r.parentElement.children.item(o).classList.add("active")}else if(n&&e.keyCode==38){n.classList.add("active")}else if(t){t.classList.add("active")}},Operator:l.OR,Event:o.KEYUP},AlphaNum:{Conditions:[{Is:13,Not:true},{From:35,To:40,Not:true}],Callback:function(){var e=this.Input.getAttribute("data-autocomplete-old-value"),t=this._Pre();if(t!==""&&t.length>=this._MinChars()){if(!e||t!=e){this.DOMResults.setAttribute("class","autocomplete open")}a.prototype.cache(this,function(e){this._Render(this._Post(e));this._Open()}.bind(this),this._Error)}else{this._Close()}},Operator:l.AND,Event:o.KEYUP}},DOMResults:null,Request:null,Input:null,_EmptyMessage:function(){var e="";if(this.Input.hasAttribute("data-autocomplete-empty-message")){e=this.Input.getAttribute("data-autocomplete-empty-message")}else if(this.EmptyMessage!==false){e=this.EmptyMessage}else{e=""}return e},_Limit:function(){var e=this.Input.getAttribute("data-autocomplete-limit");if(isNaN(e)||e===null){return this.Limit}return parseInt(e,10)},_MinChars:function(){var e=this.Input.getAttribute("data-autocomplete-minchars");if(isNaN(e)||e===null){return this.MinChars}return parseInt(e,10)},_Highlight:function(e){return e.replace(this.Highlight.getRegex(this._Pre()),this.Highlight.transform)},_HttpMethod:function(){if(this.Input.hasAttribute("data-autocomplete-method")){return this.Input.getAttribute("data-autocomplete-method")}return this.HttpMethod},_QueryArg:function(){if(this.Input.hasAttribute("data-autocomplete-param-name")){return this.Input.getAttribute("data-autocomplete-param-name")}return this.QueryArg},_Url:function(){if(this.Input.hasAttribute("data-autocomplete")){return this.Input.getAttribute("data-autocomplete")}return this.Url},_Blur:function(e){if(e===void 0){e=false}if(e){this._Close()}else{var t=this;setTimeout(function(){t._Blur(true)},150)}},_Cache:function(e){return this.$Cache[e]},_Focus:function(){var e=this.Input.getAttribute("data-autocomplete-old-value");if((!e||this.Input.value!=e)&&this._MinChars()<=this.Input.value.length){this.DOMResults.setAttribute("class","autocomplete open")}},_Open:function(){var t=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(e){if(e.getAttribute("class")!="locked"){e.onclick=function(){t._Select(e)}}})},_Close:function(){this.DOMResults.setAttribute("class","autocomplete")},_Position:function(){this.DOMResults.setAttribute("class","autocomplete");this.DOMResults.setAttribute("style","top:"+(this.Input.offsetTop+this.Input.offsetHeight)+"px;left:"+this.Input.offsetLeft+"px;width:"+this.Input.clientWidth+"px;")},_Render:function(e){var t;if(typeof e=="string"){t=this._RenderRaw(e)}else{t=this._RenderResponseItems(e)}if(this.DOMResults.hasChildNodes()){this.DOMResults.removeChild(this.DOMResults.childNodes[0])}this.DOMResults.appendChild(t)},_RenderResponseItems:function(e){var t=document.createElement("ul"),n=document.createElement("li"),r=this._Limit();if(r<0){e=e.reverse()}else if(r===0){r=e.length}for(var i=0;i0){this.DOMResults.innerHTML=e}else{var r=this._EmptyMessage();if(r!==""){n.innerHTML=r;n.setAttribute("class","locked");t.appendChild(n)}}return t},_Post:function(t){try{var e=[];var n=JSON.parse(t);if(Object.keys(n).length===0){return""}if(Array.isArray(n)){for(var r=0;r 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
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.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.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
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);\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 var vimKeys = {\n 27: {\n key: 'Escape',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 73: {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 66: {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 70: {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 85: {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 68: {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 71: {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 86: {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 75: {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 74: {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 80: {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 78: {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 79: {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 84: {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n 82: {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 72: {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n }\n };\n\n if (searxng.hotkeys) {\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.keyCode === 27) {\n vimKeys[e.keyCode].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n vimKeys[e.keyCode].fun();\n }\n }\n }\n });\n }\n\n function highlightResult (which) {\n return function (noScroll) {\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\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 = current.nextElementSibling;\n if (next === null) {\n next = results[0];\n }\n break;\n case 'up':\n next = current.previousElementSibling;\n if (next === null) {\n next = results[results.length - 1];\n }\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 var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\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 document.querySelector('#q').focus();\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 vimKeys) {\n var key = vimKeys[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

How to navigate searx with Vim-like hotkeys

';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
';\n\n html += '

' + cat[0].cat + '

';\n html += '
    ';\n\n for (var cj in cat) {\n html += '
  • ' + cat[cj].key + ' ' + cat[cj].des + '
  • ';\n }\n\n html += '
';\n html += '
';\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 initHelpContent(helpPanel);\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // togggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occour only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.translations['Source'] + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n });\n})(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 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.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 => searxng.selectPrevious(false));\n searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));\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 firstFocus = true, qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n\n function placeCursorAtEnd (element) {\n if (element.setSelectionRange) {\n var len = element.value.length;\n element.setSelectionRange(len, len);\n }\n }\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('keyup', updateClearButton, false);\n }\n\n searxng.ready(function () {\n qinput = d.getElementById(qinput_id);\n\n function placeCursorAtEndOnce () {\n if (firstFocus) {\n placeCursorAtEnd(qinput);\n firstFocus = false;\n } else {\n // e.preventDefault();\n }\n }\n\n if (qinput !== null) {\n // clear button\n createClearButton(qinput);\n\n // autocompleter\n if (searxng.autocompleter) {\n searxng.autocomplete = AutoComplete.call(w, {\n Url: \"./autocompleter\",\n EmptyMessage: searxng.translations.no_item_found,\n HttpMethod: searxng.method,\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n MinChars: 4,\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 }, \"#\" + qinput_id);\n }\n\n qinput.addEventListener('focus', placeCursorAtEndOnce, false);\n\n if (!isMobile) {\n qinput.focus();\n }\n }\n\n // vanilla js version of search_on_category_select.js\n if (qinput !== null && d.querySelector('.help') != null && searxng.search_on_category_select) {\n d.querySelector('.help').className = 'invisible';\n\n searxng.on('#categories input', 'change', function () {\n var i, categories = d.querySelectorAll('#categories input[type=\"checkbox\"]');\n for (i = 0; i < categories.length; i++) {\n if (categories[i] !== this && categories[i].checked) {\n categories[i].click();\n }\n }\n if (! this.checked) {\n this.click();\n }\n submitIfQuery();\n return false;\n });\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 });\n\n})(window, document, window.searxng);\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i @baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n // Constructor\n function AutoComplete(params, selector) {\n if (params === void 0) { params = {}; }\n if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n if (Array.isArray(selector)) {\n selector.forEach(function (s) {\n new AutoComplete(params, s);\n });\n }\n else if (typeof selector == \"string\") {\n var elements = document.querySelectorAll(selector);\n Array.prototype.forEach.call(elements, function (input) {\n new AutoComplete(params, input);\n });\n }\n else {\n var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n DOMResults: document.createElement(\"div\")\n });\n AutoComplete.prototype.create(specificParams, selector);\n return specificParams;\n }\n }\n AutoComplete.prototype.create = function (params, element) {\n params.Input = element;\n if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n params.Input.setAttribute(\"autocomplete\", \"off\");\n params._Position(params);\n params.Input.parentNode.appendChild(params.DOMResults);\n params.$Listeners = {\n blur: params._Blur.bind(params),\n destroy: AutoComplete.prototype.destroy.bind(null, params),\n focus: params._Focus.bind(params),\n keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n position: params._Position.bind(params)\n };\n for (var event in params.$Listeners) {\n params.Input.addEventListener(event, params.$Listeners[event]);\n }\n }\n };\n AutoComplete.prototype.getEventsByType = function (params, type) {\n var mappings = {};\n for (var key in params.KeyboardMappings) {\n var event = EventType.KEYUP;\n if (params.KeyboardMappings[key].Event !== undefined) {\n event = params.KeyboardMappings[key].Event;\n }\n if (event == type) {\n mappings[key] = params.KeyboardMappings[key];\n }\n }\n return mappings;\n };\n AutoComplete.prototype.event = function (params, type, event) {\n var eventIdentifier = function (condition) {\n if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n condition = AutoComplete.merge({\n Not: false\n }, condition);\n if (condition.hasOwnProperty(\"Is\")) {\n if (condition.Is == event.keyCode) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n }\n };\n for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n var mapping = AutoComplete.merge({\n Operator: ConditionOperator.AND\n }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n mapping.Conditions.forEach(eventIdentifier);\n if (match === true) {\n mapping.Callback.call(params, event);\n }\n }\n };\n AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n if (method.match(/^GET$/i)) {\n if (url.indexOf(\"?\") !== -1) {\n url += \"&\" + queryParamsStringify;\n }\n else {\n url += \"?\" + queryParamsStringify;\n }\n }\n request.open(method, url, true);\n for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4 && request.status == 200) {\n params.$Cache[queryParams] = request.response;\n callback(request.response);\n }\n else if (request.status >= 400) {\n callbackErr();\n }\n };\n return request;\n };\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n }\n else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n }\n };\n AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n var response = params._Cache(params._Pre());\n if (response === undefined) {\n var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n AutoComplete.prototype.ajax(params, request);\n }\n else {\n callback(response);\n }\n };\n AutoComplete.prototype.destroy = function (params) {\n for (var event in params.$Listeners) {\n params.Input.removeEventListener(event, params.$Listeners[event]);\n }\n params.DOMResults.parentNode.removeChild(params.DOMResults);\n };\n AutoComplete.merge = function () {\n var merge = {}, tmp;\n for (var i = 0; i < arguments.length; i++) {\n for (tmp in arguments[i]) {\n merge[tmp] = arguments[i][tmp];\n }\n }\n return merge;\n };\n AutoComplete.defaults = {\n Delay: 150,\n EmptyMessage: \"No result here\",\n Highlight: {\n getRegex: function (value) {\n return new RegExp(value, \"ig\");\n },\n transform: function (value) {\n return \"\" + value + \"\";\n }\n },\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\"\n },\n Limit: 0,\n MinChars: 0,\n HttpMethod: \"GET\",\n QueryArg: \"q\",\n Url: null,\n KeyboardMappings: {\n \"Enter\": {\n Conditions: [{\n Is: 13,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n event.preventDefault();\n this._Select(liActive);\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n }\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_down\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_up\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n if (active) {\n var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n if (position < 0) {\n position = lisCount - 1;\n }\n else if (position >= lisCount) {\n position = 0;\n }\n active.classList.remove(\"active\");\n active.parentElement.children.item(position).classList.add(\"active\");\n }\n else if (last && event.keyCode == 38) {\n last.classList.add(\"active\");\n }\n else if (first) {\n first.classList.add(\"active\");\n }\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYUP\n },\n \"AlphaNum\": {\n Conditions: [{\n Is: 13,\n Not: true\n }, {\n From: 35,\n To: 40,\n Not: true\n }],\n Callback: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n if (!oldValue || currentValue != oldValue) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n AutoComplete.prototype.cache(this, function (response) {\n this._Render(this._Post(response));\n this._Open();\n }.bind(this), this._Error);\n }\n else {\n this._Close();\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYUP\n }\n },\n DOMResults: null,\n Request: null,\n Input: null,\n /**\n * Return the message when no result returns\n */\n _EmptyMessage: function () {\n var emptyMessage = \"\";\n if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n }\n else if (this.EmptyMessage !== false) {\n emptyMessage = this.EmptyMessage;\n }\n else {\n emptyMessage = \"\";\n }\n return emptyMessage;\n },\n /**\n * Returns the maximum number of results\n */\n _Limit: function () {\n var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n if (isNaN(limit) || limit === null) {\n return this.Limit;\n }\n return parseInt(limit, 10);\n },\n /**\n * Returns the minimum number of characters entered before firing ajax\n */\n _MinChars: function () {\n var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n if (isNaN(minchars) || minchars === null) {\n return this.MinChars;\n }\n return parseInt(minchars, 10);\n },\n /**\n * Apply transformation on labels response\n */\n _Highlight: function (label) {\n return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n },\n /**\n * Returns the HHTP method to use\n */\n _HttpMethod: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n return this.Input.getAttribute(\"data-autocomplete-method\");\n }\n return this.HttpMethod;\n },\n /**\n * Returns the query param to use\n */\n _QueryArg: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n return this.Input.getAttribute(\"data-autocomplete-param-name\");\n }\n return this.QueryArg;\n },\n /**\n * Returns the URL to use for AJAX request\n */\n _Url: function () {\n if (this.Input.hasAttribute(\"data-autocomplete\")) {\n return this.Input.getAttribute(\"data-autocomplete\");\n }\n return this.Url;\n },\n /**\n * Manage the close\n */\n _Blur: function (now) {\n if (now === void 0) { now = false; }\n if (now) {\n this._Close();\n }\n else {\n var params = this;\n setTimeout(function () {\n params._Blur(true);\n }, 150);\n }\n },\n /**\n * Manage the cache\n */\n _Cache: function (value) {\n return this.$Cache[value];\n },\n /**\n * Manage the open\n */\n _Focus: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n },\n /**\n * Bind all results item if one result is opened\n */\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onclick = function () {\n params._Select(li);\n };\n }\n });\n },\n _Close: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n },\n /**\n * Position the results HTML element\n */\n _Position: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n },\n /**\n * Execute the render of results DOM element\n */\n _Render: function (response) {\n var ul;\n if (typeof response == \"string\") {\n ul = this._RenderRaw(response);\n }\n else {\n ul = this._RenderResponseItems(response);\n }\n if (this.DOMResults.hasChildNodes()) {\n this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n }\n this.DOMResults.appendChild(ul);\n },\n /**\n * ResponseItems[] rendering\n */\n _RenderResponseItems: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n // Order\n if (limit < 0) {\n response = response.reverse();\n }\n else if (limit === 0) {\n limit = response.length;\n }\n for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n li.innerHTML = response[item].Label;\n li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n ul.appendChild(li);\n li = document.createElement(\"li\");\n }\n return ul;\n },\n /**\n * string response rendering (RAW HTML)\n */\n _RenderRaw: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n if (response.length > 0) {\n this.DOMResults.innerHTML = response;\n }\n else {\n var emptyMessage = this._EmptyMessage();\n if (emptyMessage !== \"\") {\n li.innerHTML = emptyMessage;\n li.setAttribute(\"class\", \"locked\");\n ul.appendChild(li);\n }\n }\n return ul;\n },\n /**\n * Deal with request response\n */\n _Post: function (response) {\n try {\n var returnResponse = [];\n //JSON return\n var json = JSON.parse(response);\n if (Object.keys(json).length === 0) {\n return \"\";\n }\n if (Array.isArray(json)) {\n for (var i = 0; i < Object.keys(json).length; i++) {\n returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n }\n }\n else {\n for (var value in json) {\n returnResponse.push({\n \"Value\": value,\n \"Label\": this._Highlight(json[value])\n });\n }\n }\n return returnResponse;\n }\n catch (event) {\n //HTML return\n return response;\n }\n },\n /**\n * Return the autocomplete value to send (before request)\n */\n _Pre: function () {\n return this.Input.value;\n },\n /**\n * Choice one result item\n */\n _Select: function (item) {\n if (item.hasAttribute(\"data-autocomplete-value\")) {\n this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n }\n else {\n this.Input.value = item.innerHTML;\n }\n this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n },\n /**\n * Handle HTTP error on the request\n */\n _Error: function () {\n },\n $AjaxTimer: null,\n $Cache: {},\n $Listeners: {}\n };\n return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n"],"names":["window","searxng","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","data","Promise","resolve","reject","req","XMLHttpRequest","open","timeout","onload","status","response","responseType","Error","statusText","onerror","onabort","ontimeout","send","ex","loadStyle","src","path","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","vimKeys","27","key","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","GoToPreviousPage","78","GoToNextPage","79","openResult","84","82","reloadPage","72","toggleHelp","hotkeys","Object","hasOwnProperty","keyCode","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","current","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","offsetTop","ebot","nextElementSibling","previousElementSibling","removeAttribute","link","focus","scrollPageToSelected","location","reload","activeElement","blur","closeDetail","pageButtonClick","css_selector","button","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","position","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","push","sorted","keys","sort","a","b","html","lastCategory","first","cj","innerHTML","helpPanel","toggle","selectNext","selectPrevious","event","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","JSON","parse","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","setTimeout","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","OSM Wikimedia","control","layers","addTo","geoJson","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","img","style","display","error","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","imgLoader","Image","firstFocus","qinput_id","qinput","isMobile","matchMedia","placeCursorAtEnd","setSelectionRange","len","value","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","ev","placeCursorAtEndOnce","autocompleter","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","HttpHeaders","Content-type","X-Requested-With","MinChars","Delay","_Position","_Open","params","Array","DOMResults","li","onmousedown","_Select","search_on_category_select","checked","f","exports","module","define","amd","g","global","self","r","n","t","o","c","require","u","code","p","1","ConditionOperator","EventType","isArray","input","specificParams","merge","defaults","create","Input","nodeName","match","$Listeners","_Blur","destroy","_Focus","keyup","KEYUP","keydown","KEYDOWN","getEventsByType","type","mappings","KeyboardMappings","Event","eventIdentifier","condition","mapping","Operator","AND","OR","Not","Is","From","To","name","Conditions","Callback","makeRequest","callbackErr","propertyHttpHeaders","getOwnPropertyNames","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","$AjaxTimer","clearTimeout","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","Enter","liActive","KeyUpAndDown_down","KeyUpAndDown_up","last","active","currentIndex","lisCount","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","onclick","offsetHeight","offsetLeft","clientWidth","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","Label","Value","returnResponse","json"],"mappings":"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"} \ No newline at end of file +{"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
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
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);\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 var vimKeys = {\n 27: {\n key: 'Escape',\n fun: removeFocus,\n des: 'remove focus from the focused input',\n cat: 'Control'\n },\n 73: {\n key: 'i',\n fun: searchInputFocus,\n des: 'focus on the search input',\n cat: 'Control'\n },\n 66: {\n key: 'b',\n fun: scrollPage(-window.innerHeight),\n des: 'scroll one page up',\n cat: 'Navigation'\n },\n 70: {\n key: 'f',\n fun: scrollPage(window.innerHeight),\n des: 'scroll one page down',\n cat: 'Navigation'\n },\n 85: {\n key: 'u',\n fun: scrollPage(-window.innerHeight / 2),\n des: 'scroll half a page up',\n cat: 'Navigation'\n },\n 68: {\n key: 'd',\n fun: scrollPage(window.innerHeight / 2),\n des: 'scroll half a page down',\n cat: 'Navigation'\n },\n 71: {\n key: 'g',\n fun: scrollPageTo(-document.body.scrollHeight, 'top'),\n des: 'scroll to the top of the page',\n cat: 'Navigation'\n },\n 86: {\n key: 'v',\n fun: scrollPageTo(document.body.scrollHeight, 'bottom'),\n des: 'scroll to the bottom of the page',\n cat: 'Navigation'\n },\n 75: {\n key: 'k',\n fun: highlightResult('up'),\n des: 'select previous search result',\n cat: 'Results'\n },\n 74: {\n key: 'j',\n fun: highlightResult('down'),\n des: 'select next search result',\n cat: 'Results'\n },\n 80: {\n key: 'p',\n fun: GoToPreviousPage(),\n des: 'go to previous page',\n cat: 'Results'\n },\n 78: {\n key: 'n',\n fun: GoToNextPage(),\n des: 'go to next page',\n cat: 'Results'\n },\n 79: {\n key: 'o',\n fun: openResult(false),\n des: 'open search result',\n cat: 'Results'\n },\n 84: {\n key: 't',\n fun: openResult(true),\n des: 'open the result in a new tab',\n cat: 'Results'\n },\n 82: {\n key: 'r',\n fun: reloadPage,\n des: 'reload page from the server',\n cat: 'Control'\n },\n 72: {\n key: 'h',\n fun: toggleHelp,\n des: 'toggle help window',\n cat: 'Other'\n }\n };\n\n if (searxng.settings.hotkeys) {\n searxng.on(document, \"keydown\", function (e) {\n // check for modifiers so we don't break browser's hotkeys\n if (Object.prototype.hasOwnProperty.call(vimKeys, e.keyCode) && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n var tagName = e.target.tagName.toLowerCase();\n if (e.keyCode === 27) {\n vimKeys[e.keyCode].fun(e);\n } else {\n if (e.target === document.body || tagName === 'a' || tagName === 'button') {\n e.preventDefault();\n vimKeys[e.keyCode].fun();\n }\n }\n }\n });\n }\n\n function highlightResult (which) {\n return function (noScroll) {\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\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 = current.nextElementSibling;\n if (next === null) {\n next = results[0];\n }\n break;\n case 'up':\n next = current.previousElementSibling;\n if (next === null) {\n next = results[results.length - 1];\n }\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 var link = next.querySelector('h3 a') || next.querySelector('a');\n if (link !== null) {\n link.focus();\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 document.querySelector('#q').focus();\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 vimKeys) {\n var key = vimKeys[k];\n categories[key.cat] = categories[key.cat] || [];\n categories[key.cat].push(key);\n }\n\n var sorted = Object.keys(categories).sort(function (a, b) {\n return categories[b].length - categories[a].length;\n });\n\n if (sorted.length === 0) {\n return;\n }\n\n var html = '×';\n html += '

How to navigate searx with Vim-like hotkeys

';\n html += '';\n\n for (var i = 0; i < sorted.length; i++) {\n var cat = categories[sorted[i]];\n\n var lastCategory = i === (sorted.length - 1);\n var first = i % 2 === 0;\n\n if (first) {\n html += '';\n }\n html += ''; // col-sm-*\n\n if (!first || lastCategory) {\n html += ''; // row\n }\n }\n\n html += '
';\n\n html += '

' + cat[0].cat + '

';\n html += '
    ';\n\n for (var cj in cat) {\n html += '
  • ' + cat[cj].key + ' ' + cat[cj].des + '
  • ';\n }\n\n html += '
';\n html += '
';\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 initHelpContent(helpPanel);\n initHelpContent(helpPanel);\n var body = document.getElementsByTagName('body')[0];\n body.appendChild(helpPanel);\n } else {\n // togggle hidden\n helpPanel.classList.toggle('invisible');\n return;\n }\n }\n\n searxng.scrollPageToSelected = scrollPageToSelected;\n searxng.selectNext = highlightResult('down');\n searxng.selectPrevious = highlightResult('up');\n});\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n/* global L */\n(function (w, d, searxng) {\n 'use strict';\n\n searxng.ready(function () {\n searxng.on('.searxng_init_map', 'click', function (event) {\n // no more request\n this.classList.remove(\"searxng_init_map\");\n\n //\n var leaflet_target = this.dataset.leafletTarget;\n var map_lon = parseFloat(this.dataset.mapLon);\n var map_lat = parseFloat(this.dataset.mapLat);\n var map_zoom = parseFloat(this.dataset.mapZoom);\n var map_boundingbox = JSON.parse(this.dataset.mapBoundingbox);\n var map_geojson = JSON.parse(this.dataset.mapGeojson);\n\n searxng.loadStyle('css/leaflet.css');\n searxng.loadScript('js/leaflet.js', function () {\n var map_bounds = null;\n if (map_boundingbox) {\n var southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);\n var northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);\n map_bounds = L.latLngBounds(southWest, northEast);\n }\n\n // init map\n var map = L.map(leaflet_target);\n // create the tile layer with correct attribution\n var osmMapnikUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';\n var osmMapnikAttrib = 'Map data © OpenStreetMap contributors';\n var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});\n var osmWikimediaUrl = 'https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';\n var osmWikimediaAttrib = 'Wikimedia maps | Maps data © OpenStreetMap contributors';\n var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});\n // init map view\n if (map_bounds) {\n // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021\n // Still useful ?\n setTimeout(function () {\n map.fitBounds(map_bounds, {\n maxZoom: 17\n });\n }, 0);\n } else if (map_lon && map_lat) {\n if (map_zoom) {\n map.setView(new L.latLng(map_lat, map_lon), map_zoom);\n } else {\n map.setView(new L.latLng(map_lat, map_lon), 8);\n }\n }\n\n map.addLayer(osmMapnik);\n\n var baseLayers = {\n \"OSM Mapnik\": osmMapnik,\n \"OSM Wikimedia\": osmWikimedia,\n };\n\n L.control.layers(baseLayers).addTo(map);\n\n if (map_geojson) {\n L.geoJson(map_geojson).addTo(map);\n } /* else if(map_bounds) {\n L.rectangle(map_bounds, {color: \"#ff7800\", weight: 3, fill:false}).addTo(map);\n } */\n });\n\n // this event occour only once per element\n event.preventDefault();\n });\n });\n})(window, document, window.searxng);\n","/* SPDX-License-Identifier: AGPL-3.0-or-later */\n(function (w, d, searxng) {\n 'use strict';\n\n if (searxng.endpoint !== 'preferences') {\n return;\n }\n\n searxng.ready(function () {\n let engine_descriptions = null;\n function load_engine_descriptions () {\n if (engine_descriptions == null) {\n searxng.http(\"GET\", \"engine_descriptions.json\").then(function (content) {\n engine_descriptions = JSON.parse(content);\n for (const [engine_name, description] of Object.entries(engine_descriptions)) {\n let elements = d.querySelectorAll('[data-engine-name=\"' + engine_name + '\"] .engine-description');\n for (const element of elements) {\n let source = ' (' + searxng.settings.translations.Source + ': ' + description[1] + ')';\n element.innerHTML = description[0] + source;\n }\n }\n });\n }\n }\n\n for (const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\n });\n})(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 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.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 => searxng.selectPrevious(false));\n searxng.on('.result-detail-next', 'click', e => searxng.selectNext(false));\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 firstFocus = true, qinput_id = \"q\", qinput;\n\n const isMobile = window.matchMedia(\"only screen and (max-width: 50em)\").matches;\n\n function placeCursorAtEnd (element) {\n if (element.setSelectionRange) {\n var len = element.value.length;\n element.setSelectionRange(len, len);\n }\n }\n\n function submitIfQuery () {\n if (qinput.value.length > 0) {\n var search = document.getElementById('search');\n setTimeout(search.submit.bind(search), 0);\n }\n }\n\n function createClearButton (qinput) {\n var cs = document.getElementById('clear_search');\n var updateClearButton = function () {\n if (qinput.value.length === 0) {\n cs.classList.add(\"empty\");\n } else {\n cs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function (ev) {\n qinput.value = '';\n qinput.focus();\n updateClearButton();\n ev.preventDefault();\n });\n qinput.addEventListener('keyup', updateClearButton, false);\n }\n\n searxng.ready(function () {\n qinput = d.getElementById(qinput_id);\n\n function placeCursorAtEndOnce () {\n if (firstFocus) {\n placeCursorAtEnd(qinput);\n firstFocus = false;\n } else {\n // e.preventDefault();\n }\n }\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 }, \"#\" + qinput_id);\n }\n\n qinput.addEventListener('focus', placeCursorAtEndOnce, false);\n\n if (!isMobile) {\n qinput.focus();\n }\n }\n\n // vanilla js version of search_on_category_select.js\n if (qinput !== null && d.querySelector('.help') != null && searxng.settings.search_on_category_select) {\n d.querySelector('.help').className = 'invisible';\n\n searxng.on('#categories input', 'change', function () {\n var i, categories = d.querySelectorAll('#categories input[type=\"checkbox\"]');\n for (i = 0; i < categories.length; i++) {\n if (categories[i] !== this && categories[i].checked) {\n categories[i].click();\n }\n }\n if (! this.checked) {\n this.click();\n }\n submitIfQuery();\n return false;\n });\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 });\n\n})(window, document, window.searxng);\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i @baptistedonaux\n */\nvar AutoComplete = /** @class */ (function () {\n // Constructor\n function AutoComplete(params, selector) {\n if (params === void 0) { params = {}; }\n if (selector === void 0) { selector = \"[data-autocomplete]\"; }\n if (Array.isArray(selector)) {\n selector.forEach(function (s) {\n new AutoComplete(params, s);\n });\n }\n else if (typeof selector == \"string\") {\n var elements = document.querySelectorAll(selector);\n Array.prototype.forEach.call(elements, function (input) {\n new AutoComplete(params, input);\n });\n }\n else {\n var specificParams = AutoComplete.merge(AutoComplete.defaults, params, {\n DOMResults: document.createElement(\"div\")\n });\n AutoComplete.prototype.create(specificParams, selector);\n return specificParams;\n }\n }\n AutoComplete.prototype.create = function (params, element) {\n params.Input = element;\n if (params.Input.nodeName.match(/^INPUT$/i) && (params.Input.hasAttribute(\"type\") === false || params.Input.getAttribute(\"type\").match(/^TEXT|SEARCH$/i))) {\n params.Input.setAttribute(\"autocomplete\", \"off\");\n params._Position(params);\n params.Input.parentNode.appendChild(params.DOMResults);\n params.$Listeners = {\n blur: params._Blur.bind(params),\n destroy: AutoComplete.prototype.destroy.bind(null, params),\n focus: params._Focus.bind(params),\n keyup: AutoComplete.prototype.event.bind(null, params, EventType.KEYUP),\n keydown: AutoComplete.prototype.event.bind(null, params, EventType.KEYDOWN),\n position: params._Position.bind(params)\n };\n for (var event in params.$Listeners) {\n params.Input.addEventListener(event, params.$Listeners[event]);\n }\n }\n };\n AutoComplete.prototype.getEventsByType = function (params, type) {\n var mappings = {};\n for (var key in params.KeyboardMappings) {\n var event = EventType.KEYUP;\n if (params.KeyboardMappings[key].Event !== undefined) {\n event = params.KeyboardMappings[key].Event;\n }\n if (event == type) {\n mappings[key] = params.KeyboardMappings[key];\n }\n }\n return mappings;\n };\n AutoComplete.prototype.event = function (params, type, event) {\n var eventIdentifier = function (condition) {\n if ((match === true && mapping.Operator == ConditionOperator.AND) || (match === false && mapping.Operator == ConditionOperator.OR)) {\n condition = AutoComplete.merge({\n Not: false\n }, condition);\n if (condition.hasOwnProperty(\"Is\")) {\n if (condition.Is == event.keyCode) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n else if (condition.hasOwnProperty(\"From\") && condition.hasOwnProperty(\"To\")) {\n if (event.keyCode >= condition.From && event.keyCode <= condition.To) {\n match = !condition.Not;\n }\n else {\n match = condition.Not;\n }\n }\n }\n };\n for (var name in AutoComplete.prototype.getEventsByType(params, type)) {\n var mapping = AutoComplete.merge({\n Operator: ConditionOperator.AND\n }, params.KeyboardMappings[name]), match = ConditionOperator.AND == mapping.Operator;\n mapping.Conditions.forEach(eventIdentifier);\n if (match === true) {\n mapping.Callback.call(params, event);\n }\n }\n };\n AutoComplete.prototype.makeRequest = function (params, callback, callbackErr) {\n var propertyHttpHeaders = Object.getOwnPropertyNames(params.HttpHeaders), request = new XMLHttpRequest(), method = params._HttpMethod(), url = params._Url(), queryParams = params._Pre(), queryParamsStringify = encodeURIComponent(params._QueryArg()) + \"=\" + encodeURIComponent(queryParams);\n if (method.match(/^GET$/i)) {\n if (url.indexOf(\"?\") !== -1) {\n url += \"&\" + queryParamsStringify;\n }\n else {\n url += \"?\" + queryParamsStringify;\n }\n }\n request.open(method, url, true);\n for (var i = propertyHttpHeaders.length - 1; i >= 0; i--) {\n request.setRequestHeader(propertyHttpHeaders[i], params.HttpHeaders[propertyHttpHeaders[i]]);\n }\n request.onreadystatechange = function () {\n if (request.readyState == 4 && request.status == 200) {\n params.$Cache[queryParams] = request.response;\n callback(request.response);\n }\n else if (request.status >= 400) {\n callbackErr();\n }\n };\n return request;\n };\n AutoComplete.prototype.ajax = function (params, request, timeout) {\n if (timeout === void 0) { timeout = true; }\n if (params.$AjaxTimer) {\n window.clearTimeout(params.$AjaxTimer);\n }\n if (timeout === true) {\n params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);\n }\n else {\n if (params.Request) {\n params.Request.abort();\n }\n params.Request = request;\n params.Request.send(params._QueryArg() + \"=\" + params._Pre());\n }\n };\n AutoComplete.prototype.cache = function (params, callback, callbackErr) {\n var response = params._Cache(params._Pre());\n if (response === undefined) {\n var request = AutoComplete.prototype.makeRequest(params, callback, callbackErr);\n AutoComplete.prototype.ajax(params, request);\n }\n else {\n callback(response);\n }\n };\n AutoComplete.prototype.destroy = function (params) {\n for (var event in params.$Listeners) {\n params.Input.removeEventListener(event, params.$Listeners[event]);\n }\n params.DOMResults.parentNode.removeChild(params.DOMResults);\n };\n AutoComplete.merge = function () {\n var merge = {}, tmp;\n for (var i = 0; i < arguments.length; i++) {\n for (tmp in arguments[i]) {\n merge[tmp] = arguments[i][tmp];\n }\n }\n return merge;\n };\n AutoComplete.defaults = {\n Delay: 150,\n EmptyMessage: \"No result here\",\n Highlight: {\n getRegex: function (value) {\n return new RegExp(value, \"ig\");\n },\n transform: function (value) {\n return \"\" + value + \"\";\n }\n },\n HttpHeaders: {\n \"Content-type\": \"application/x-www-form-urlencoded\"\n },\n Limit: 0,\n MinChars: 0,\n HttpMethod: \"GET\",\n QueryArg: \"q\",\n Url: null,\n KeyboardMappings: {\n \"Enter\": {\n Conditions: [{\n Is: 13,\n Not: false\n }],\n Callback: function (event) {\n if (this.DOMResults.getAttribute(\"class\").indexOf(\"open\") != -1) {\n var liActive = this.DOMResults.querySelector(\"li.active\");\n if (liActive !== null) {\n event.preventDefault();\n this._Select(liActive);\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n }\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_down\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYDOWN\n },\n \"KeyUpAndDown_up\": {\n Conditions: [{\n Is: 38,\n Not: false\n },\n {\n Is: 40,\n Not: false\n }],\n Callback: function (event) {\n event.preventDefault();\n var first = this.DOMResults.querySelector(\"li:first-child:not(.locked)\"), last = this.DOMResults.querySelector(\"li:last-child:not(.locked)\"), active = this.DOMResults.querySelector(\"li.active\");\n if (active) {\n var currentIndex = Array.prototype.indexOf.call(active.parentNode.children, active), position = currentIndex + (event.keyCode - 39), lisCount = this.DOMResults.getElementsByTagName(\"li\").length;\n if (position < 0) {\n position = lisCount - 1;\n }\n else if (position >= lisCount) {\n position = 0;\n }\n active.classList.remove(\"active\");\n active.parentElement.children.item(position).classList.add(\"active\");\n }\n else if (last && event.keyCode == 38) {\n last.classList.add(\"active\");\n }\n else if (first) {\n first.classList.add(\"active\");\n }\n },\n Operator: ConditionOperator.OR,\n Event: EventType.KEYUP\n },\n \"AlphaNum\": {\n Conditions: [{\n Is: 13,\n Not: true\n }, {\n From: 35,\n To: 40,\n Not: true\n }],\n Callback: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\"), currentValue = this._Pre();\n if (currentValue !== \"\" && currentValue.length >= this._MinChars()) {\n if (!oldValue || currentValue != oldValue) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n AutoComplete.prototype.cache(this, function (response) {\n this._Render(this._Post(response));\n this._Open();\n }.bind(this), this._Error);\n }\n else {\n this._Close();\n }\n },\n Operator: ConditionOperator.AND,\n Event: EventType.KEYUP\n }\n },\n DOMResults: null,\n Request: null,\n Input: null,\n /**\n * Return the message when no result returns\n */\n _EmptyMessage: function () {\n var emptyMessage = \"\";\n if (this.Input.hasAttribute(\"data-autocomplete-empty-message\")) {\n emptyMessage = this.Input.getAttribute(\"data-autocomplete-empty-message\");\n }\n else if (this.EmptyMessage !== false) {\n emptyMessage = this.EmptyMessage;\n }\n else {\n emptyMessage = \"\";\n }\n return emptyMessage;\n },\n /**\n * Returns the maximum number of results\n */\n _Limit: function () {\n var limit = this.Input.getAttribute(\"data-autocomplete-limit\");\n if (isNaN(limit) || limit === null) {\n return this.Limit;\n }\n return parseInt(limit, 10);\n },\n /**\n * Returns the minimum number of characters entered before firing ajax\n */\n _MinChars: function () {\n var minchars = this.Input.getAttribute(\"data-autocomplete-minchars\");\n if (isNaN(minchars) || minchars === null) {\n return this.MinChars;\n }\n return parseInt(minchars, 10);\n },\n /**\n * Apply transformation on labels response\n */\n _Highlight: function (label) {\n return label.replace(this.Highlight.getRegex(this._Pre()), this.Highlight.transform);\n },\n /**\n * Returns the HHTP method to use\n */\n _HttpMethod: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-method\")) {\n return this.Input.getAttribute(\"data-autocomplete-method\");\n }\n return this.HttpMethod;\n },\n /**\n * Returns the query param to use\n */\n _QueryArg: function () {\n if (this.Input.hasAttribute(\"data-autocomplete-param-name\")) {\n return this.Input.getAttribute(\"data-autocomplete-param-name\");\n }\n return this.QueryArg;\n },\n /**\n * Returns the URL to use for AJAX request\n */\n _Url: function () {\n if (this.Input.hasAttribute(\"data-autocomplete\")) {\n return this.Input.getAttribute(\"data-autocomplete\");\n }\n return this.Url;\n },\n /**\n * Manage the close\n */\n _Blur: function (now) {\n if (now === void 0) { now = false; }\n if (now) {\n this._Close();\n }\n else {\n var params = this;\n setTimeout(function () {\n params._Blur(true);\n }, 150);\n }\n },\n /**\n * Manage the cache\n */\n _Cache: function (value) {\n return this.$Cache[value];\n },\n /**\n * Manage the open\n */\n _Focus: function () {\n var oldValue = this.Input.getAttribute(\"data-autocomplete-old-value\");\n if ((!oldValue || this.Input.value != oldValue) && this._MinChars() <= this.Input.value.length) {\n this.DOMResults.setAttribute(\"class\", \"autocomplete open\");\n }\n },\n /**\n * Bind all results item if one result is opened\n */\n _Open: function () {\n var params = this;\n Array.prototype.forEach.call(this.DOMResults.getElementsByTagName(\"li\"), function (li) {\n if (li.getAttribute(\"class\") != \"locked\") {\n li.onclick = function () {\n params._Select(li);\n };\n }\n });\n },\n _Close: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n },\n /**\n * Position the results HTML element\n */\n _Position: function () {\n this.DOMResults.setAttribute(\"class\", \"autocomplete\");\n this.DOMResults.setAttribute(\"style\", \"top:\" + (this.Input.offsetTop + this.Input.offsetHeight) + \"px;left:\" + this.Input.offsetLeft + \"px;width:\" + this.Input.clientWidth + \"px;\");\n },\n /**\n * Execute the render of results DOM element\n */\n _Render: function (response) {\n var ul;\n if (typeof response == \"string\") {\n ul = this._RenderRaw(response);\n }\n else {\n ul = this._RenderResponseItems(response);\n }\n if (this.DOMResults.hasChildNodes()) {\n this.DOMResults.removeChild(this.DOMResults.childNodes[0]);\n }\n this.DOMResults.appendChild(ul);\n },\n /**\n * ResponseItems[] rendering\n */\n _RenderResponseItems: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\"), limit = this._Limit();\n // Order\n if (limit < 0) {\n response = response.reverse();\n }\n else if (limit === 0) {\n limit = response.length;\n }\n for (var item = 0; item < Math.min(Math.abs(limit), response.length); item++) {\n li.innerHTML = response[item].Label;\n li.setAttribute(\"data-autocomplete-value\", response[item].Value);\n ul.appendChild(li);\n li = document.createElement(\"li\");\n }\n return ul;\n },\n /**\n * string response rendering (RAW HTML)\n */\n _RenderRaw: function (response) {\n var ul = document.createElement(\"ul\"), li = document.createElement(\"li\");\n if (response.length > 0) {\n this.DOMResults.innerHTML = response;\n }\n else {\n var emptyMessage = this._EmptyMessage();\n if (emptyMessage !== \"\") {\n li.innerHTML = emptyMessage;\n li.setAttribute(\"class\", \"locked\");\n ul.appendChild(li);\n }\n }\n return ul;\n },\n /**\n * Deal with request response\n */\n _Post: function (response) {\n try {\n var returnResponse = [];\n //JSON return\n var json = JSON.parse(response);\n if (Object.keys(json).length === 0) {\n return \"\";\n }\n if (Array.isArray(json)) {\n for (var i = 0; i < Object.keys(json).length; i++) {\n returnResponse[returnResponse.length] = { \"Value\": json[i], \"Label\": this._Highlight(json[i]) };\n }\n }\n else {\n for (var value in json) {\n returnResponse.push({\n \"Value\": value,\n \"Label\": this._Highlight(json[value])\n });\n }\n }\n return returnResponse;\n }\n catch (event) {\n //HTML return\n return response;\n }\n },\n /**\n * Return the autocomplete value to send (before request)\n */\n _Pre: function () {\n return this.Input.value;\n },\n /**\n * Choice one result item\n */\n _Select: function (item) {\n if (item.hasAttribute(\"data-autocomplete-value\")) {\n this.Input.value = item.getAttribute(\"data-autocomplete-value\");\n }\n else {\n this.Input.value = item.innerHTML;\n }\n this.Input.setAttribute(\"data-autocomplete-old-value\", this.Input.value);\n },\n /**\n * Handle HTTP error on the request\n */\n _Error: function () {\n },\n $AjaxTimer: null,\n $Cache: {},\n $Listeners: {}\n };\n return AutoComplete;\n}());\nmodule.exports = AutoComplete;\n\n},{}]},{},[1])(1)\n});\n"],"names":["window","searxng","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","data","Promise","resolve","reject","req","XMLHttpRequest","open","timeout","onload","status","response","responseType","Error","statusText","onerror","onabort","ontimeout","send","ex","loadStyle","src","path","settings","theme_static_path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","insertAfter","nextSibling","classList","add","getEndpoint","className","getElementsByTagName","values","endsWith","split","endpoint","infinite_scroll_supported","IntersectionObserverEntry","let","onlyImages","contains","newLoadSpinner","loader","replaceChildrenWith","element","children","textContent","forEach","child","loadNextPage","form","querySelector","formData","FormData","getAttribute","then","nextPageDoc","DOMParser","parseFromString","articleList","paginationElement","remove","length","articleElement","catch","err","translations","error_loading_next_page","infinite_scroll","intersectionObserveOptions","rootMargin","observedSelector","observer","IntersectionObserver","entries","paginationEntry","isIntersecting","unobserve","observe","isElementInDetail","undefined","getResultElement","isImageResult","resultElement","highlightResult","preventDefault","selectImage","vimKeys","27","key","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","GoToPreviousPage","78","GoToNextPage","79","openResult","84","82","reloadPage","72","toggleHelp","hotkeys","Object","hasOwnProperty","keyCode","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","current","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","offsetTop","ebot","nextElementSibling","previousElementSibling","removeAttribute","link","focus","scrollPageToSelected","location","reload","activeElement","blur","closeDetail","pageButtonClick","css_selector","button","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","position","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","push","sorted","keys","sort","a","b","html","lastCategory","first","cj","innerHTML","helpPanel","toggle","selectNext","selectPrevious","event","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","JSON","parse","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","setTimeout","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","OSM Wikimedia","control","layers","addTo","geoJson","engine_descriptions","load_engine_descriptions","content","engine_name","description","elements","source","Source","img","style","display","error","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","imgLoader","Image","firstFocus","qinput_id","qinput","isMobile","matchMedia","placeCursorAtEnd","setSelectionRange","len","value","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","ev","placeCursorAtEndOnce","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","Array","DOMResults","li","onmousedown","_Select","search_on_category_select","checked","f","exports","module","define","amd","g","global","self","r","n","t","o","c","require","u","code","p","1","ConditionOperator","EventType","isArray","input","specificParams","merge","defaults","create","Input","nodeName","match","$Listeners","_Blur","destroy","_Focus","keyup","KEYUP","keydown","KEYDOWN","getEventsByType","type","mappings","KeyboardMappings","Event","eventIdentifier","condition","mapping","Operator","AND","OR","Not","Is","From","To","name","Conditions","Callback","makeRequest","callbackErr","propertyHttpHeaders","getOwnPropertyNames","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","$AjaxTimer","clearTimeout","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","Enter","liActive","KeyUpAndDown_down","KeyUpAndDown_up","last","active","currentIndex","lisCount","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","onclick","offsetHeight","offsetLeft","clientWidth","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","Label","Value","returnResponse","json"],"mappings":"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"} \ No newline at end of file