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 += '';\n\n html += '' + cat[0].cat + '';\n html += '';\n\n for (var cj in cat) {\n html += '- ' + cat[cj].key + ' ' + cat[cj].des + '
';\n }\n\n html += ' ';\n html += ' | '; // col-sm-*\n\n if (!first || lastCategory) {\n html += '
'; // row\n }\n }\n\n html += '
';\n\n divElement.innerHTML = html;\n }\n\n function toggleHelp() {\n var helpPanel = document.querySelector('#vim-hotkeys-help');\n if (helpPanel === undefined || helpPanel === null) {\n // first call\n helpPanel = document.createElement('div');\n helpPanel.id = 'vim-hotkeys-help';\n helpPanel.className='dialog-modal';\n initHelpContent(helpPanel);\n\t\t\tinitHelpContent(helpPanel);\t\t\t\t\t\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 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 if (d.querySelector('body[class=\"preferences_endpoint\"]')) {\n for(const el of d.querySelectorAll('[data-engine-name]')) {\n searxng.on(el, 'mouseenter', load_engine_descriptions);\n }\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 searxng.ready(function() {\n searxng.image_thumbnail_layout = new searxng.ImageLayout('#urls', '#urls .result-images', 'img.image_thumbnail', 14, 6, 200);\n searxng.image_thumbnail_layout.watch();\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.image_thumbnail_layout.align();\n searxng.scrollPageToSelected();\n }\n\n searxng.closeDetail = function(e) {\n d.getElementById('results').classList.remove('image-detail-open');\n searxng.image_thumbnail_layout.align();\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 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\tcs.classList.add(\"empty\");\n } else {\n\tcs.classList.remove(\"empty\");\n }\n };\n\n // update status, event listener\n updateClearButton();\n cs.addEventListener('click', function() {\n qinput.value='';\n qinput.focus();\n updateClearButton();\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 }, \"#\" + qinput_id);\n\n // hack, see : https://github.com/autocompletejs/autocomplete.js/issues/37\n w.addEventListener('resize', function() {\n var event = new CustomEvent(\"position\");\n qinput.dispatchEvent(event);\n });\n }\n\n qinput.addEventListener('focus', placeCursorAtEndOnce, false);\n qinput.focus();\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
Example usage of searxng.ImageLayout class.\n* searxng.image_thumbnail_layout = new searxng.ImageLayout(\n* '#urls', // container_selector\n* '#urls .result-images', // results_selector\n* 'img.image_thumbnail', // img_selector\n* 14, // verticalMargin\n* 6, // horizontalMargin\n* 200 // maxHeight\n* );\n* searxng.image_thumbnail_layout.watch();\n*/\n\n\n(function (w, d) {\n function ImageLayout(container_selector, results_selector, img_selector, verticalMargin, horizontalMargin, maxHeight) {\n this.container_selector = container_selector;\n this.results_selector = results_selector;\n this.img_selector = img_selector;\n this.verticalMargin = verticalMargin;\n this.horizontalMargin = horizontalMargin;\n this.maxHeight = maxHeight;\n this.isAlignDone = true;\n }\n\n /**\n * Get the height that make all images fit the container\n *\n * width = w1 + w2 + w3 + ... = r1*h + r2*h + r3*h + ...\n *\n * @param {[type]} images the images to be calculated\n * @param {[type]} width the container witdth\n * @param {[type]} margin the margin between each image\n *\n * @return {[type]} the height\n */\n ImageLayout.prototype._getHeigth = function (images, width) {\n var i, img;\n var r = 0;\n\n for (i = 0; i < images.length; i++) {\n img = images[i];\n if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) {\n r += img.naturalWidth / img.naturalHeight;\n } else {\n // assume that not loaded images are square\n r += 1;\n }\n }\n\n return (width - images.length * this.verticalMargin) / r; //have to round down because Firefox will automatically roundup value with number of decimals > 3\n };\n\n ImageLayout.prototype._setSize = function (images, height) {\n var i, img, imgWidth;\n var imagesLength = images.length, resultNode;\n\n for (i = 0; i < imagesLength; i++) {\n img = images[i];\n if ((img.naturalWidth > 0) && (img.naturalHeight > 0)) {\n imgWidth = height * img.naturalWidth / img.naturalHeight;\n } else {\n // not loaded image : make it square as _getHeigth said it\n imgWidth = height;\n }\n img.style.width = imgWidth + 'px';\n img.style.height = height + 'px';\n img.style.marginLeft = this.horizontalMargin + 'px';\n img.style.marginTop = this.horizontalMargin + 'px';\n img.style.marginRight = this.verticalMargin - 7 + 'px'; // -4 is the negative margin of the inline element\n img.style.marginBottom = this.verticalMargin - 7 + 'px';\n resultNode = img.parentNode.parentNode;\n if (!resultNode.classList.contains('js')) {\n resultNode.classList.add('js');\n }\n }\n };\n\n ImageLayout.prototype._alignImgs = function (imgGroup) {\n var isSearching, slice, i, h;\n var containerElement = d.querySelector(this.container_selector);\n var containerCompStyles = window.getComputedStyle(containerElement);\n var containerPaddingLeft = parseInt(containerCompStyles.getPropertyValue('padding-left'), 10);\n var containerPaddingRight = parseInt(containerCompStyles.getPropertyValue('padding-right'), 10);\n var containerWidth = containerElement.clientWidth - containerPaddingLeft - containerPaddingRight;\n\n while (imgGroup.length > 0) {\n isSearching = true;\n for (i = 1; i <= imgGroup.length && isSearching; i++) {\n slice = imgGroup.slice(0, i);\n h = this._getHeigth(slice, containerWidth);\n if (h < this.maxHeight) {\n this._setSize(slice, h);\n // continue with the remaining images\n imgGroup = imgGroup.slice(i);\n isSearching = false;\n }\n }\n if (isSearching) {\n this._setSize(slice, Math.min(this.maxHeight, h));\n break;\n }\n }\n };\n\n ImageLayout.prototype.align = function () {\n var i;\n var results_selectorNode = d.querySelectorAll(this.results_selector);\n var results_length = results_selectorNode.length;\n var previous = null;\n var current = null;\n var imgGroup = [];\n\n for (i = 0; i < results_length; i++) {\n current = results_selectorNode[i];\n if (current.previousElementSibling !== previous && imgGroup.length > 0) {\n // the current image is not connected to previous one\n // so the current image is the start of a new group of images.\n // so call _alignImgs to align the current group\n this._alignImgs(imgGroup);\n // and start a new empty group of images\n imgGroup = [];\n }\n // add the current image to the group (only the img tag)\n imgGroup.push(current.querySelector(this.img_selector));\n // update the previous variable\n previous = current;\n }\n // align the remaining images\n if (imgGroup.length > 0) {\n this._alignImgs(imgGroup);\n }\n };\n\n ImageLayout.prototype.watch = function () {\n var i, img;\n var obj = this;\n var results_nodes = d.querySelectorAll(this.results_selector);\n var results_length = results_nodes.length;\n\n function img_load_error(event) {\n // console.log(\"ERROR can't load: \" + event.originalTarget.src);\n event.originalTarget.src = w.searxng.static_path + w.searxng.theme.img_load_error;\n }\n\n function throttleAlign() {\n if (obj.isAlignDone) {\n obj.isAlignDone = false;\n setTimeout(function () {\n obj.align();\n obj.isAlignDone = true;\n }, 100);\n }\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/pageshow_event\n w.addEventListener('pageshow', throttleAlign);\n // https://developer.mozilla.org/en-US/docs/Web/API/FileReader/load_event\n w.addEventListener('load', throttleAlign);\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/resize_event\n w.addEventListener('resize', throttleAlign);\n\n for (i = 0; i < results_length; i++) {\n img = results_nodes[i].querySelector(this.img_selector);\n if (img !== null && img !== undefined) {\n img.addEventListener('load', throttleAlign);\n // https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror\n img.addEventListener('error', throttleAlign);\n if (w.searxng.theme.img_load_error) {\n img.addEventListener('error', img_load_error, {once: true});\n }\n }\n }\n };\n\n w.searxng.ImageLayout = ImageLayout;\n\n}(window, document));\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":["w","d","script","currentScript","scripts","getElementsByTagName","length","searxng","touch","classList","contains","method","getAttribute","autocompleter","search_on_category_select","infinite_scroll","hotkeys","static_path","translations","JSON","parse","theme","img_load_error","window","document","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","url","req","XMLHttpRequest","resolve","reject","promise","then","catch","open","onload","status","response","responseType","Error","statusText","onerror","onabort","send","ex","loadStyle","src","path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","insertAfter","nextSibling","add","isElementInDetail","undefined","getResultElement","isImageResult","resultElement","highlightResult","let","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","Object","hasOwnProperty","keyCode","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","current","querySelector","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","className","toggle","selectNext","selectPrevious","event","remove","leaflet_target","dataset","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","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","entries","elements","element","source","image_thumbnail_layout","ImageLayout","watch","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","imgElement","thumbnailElement","detailElement","imgSrc","loader","imgLoader","Image","align","firstFocus","qinput_id","qinput","placeCursorAtEnd","setSelectionRange","len","value","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","placeCursorAtEndOnce","autocomplete","AutoComplete","Url","EmptyMessage","no_item_found","HttpMethod","HttpHeaders","Content-type","X-Requested-With","MinChars","Delay","CustomEvent","dispatchEvent","checked","container_selector","results_selector","img_selector","verticalMargin","horizontalMargin","maxHeight","isAlignDone","_getHeigth","images","width","img","r","naturalWidth","naturalHeight","_setSize","height","imgWidth","imagesLength","resultNode","style","marginLeft","marginTop","marginRight","marginBottom","_alignImgs","imgGroup","isSearching","slice","h","containerElement","containerCompStyles","getComputedStyle","containerPaddingLeft","parseInt","getPropertyValue","containerPaddingRight","containerWidth","clientWidth","Math","min","results_selectorNode","results_length","previous","results_nodes","originalTarget","throttleAlign","once","f","exports","module","define","amd","g","global","self","n","t","o","c","require","u","code","p","1","ConditionOperator","EventType","params","Array","isArray","forEach","input","specificParams","merge","defaults","DOMResults","create","Input","nodeName","match","_Position","$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","timeout","$AjaxTimer","clearTimeout","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","Highlight","getRegex","RegExp","transform","Limit","QueryArg","Enter","liActive","_Select","KeyUpAndDown_down","KeyUpAndDown_up","last","active","currentIndex","children","lisCount","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Open","_Error","_Close","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","minchars","_Highlight","label","now","li","onclick","offsetHeight","offsetLeft","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","abs","Label","Value","returnResponse","json"],"mappings":"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"}
\ No newline at end of file