summaryrefslogtreecommitdiff
path: root/searx/static/themes/simple/chunk/Dzkb_VTO.min.js.map
blob: 05eaeae0dbb8d1ea98172ad2aabc3a954a8aceed (plain)
1
{"version":3,"file":"Dzkb_VTO.min.js","names":["window","document"],"sources":["../../../../../client/simple/node_modules/swiped-events/src/swiped-events.js","../../../../../client/simple/src/js/main/results.ts"],"sourcesContent":["/*!\n * swiped-events.js - v@version@\n * Pure JavaScript swipe events\n * https://github.com/john-doherty/swiped-events\n * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element\n * @author John Doherty <www.johndoherty.info>\n * @license MIT\n */\n(function (window, document) {\n\n    'use strict';\n\n    // patch CustomEvent to allow constructor creation (IE/Chrome)\n    if (typeof window.CustomEvent !== 'function') {\n\n        window.CustomEvent = function (event, params) {\n\n            params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n            var evt = document.createEvent('CustomEvent');\n            evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n            return evt;\n        };\n\n        window.CustomEvent.prototype = window.Event.prototype;\n    }\n\n    document.addEventListener('touchstart', handleTouchStart, false);\n    document.addEventListener('touchmove', handleTouchMove, false);\n    document.addEventListener('touchend', handleTouchEnd, false);\n\n    var xDown = null;\n    var yDown = null;\n    var xDiff = null;\n    var yDiff = null;\n    var timeDown = null;\n    var startEl = null;\n    var touchCount = 0;\n\n    /**\n     * Fires swiped event if swipe detected on touchend\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchEnd(e) {\n\n        // if the user released on a different target, cancel!\n        if (startEl !== e.target) return;\n\n        var swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', '20'), 10); // default 20 units\n        var swipeUnit = getNearestAttribute(startEl, 'data-swipe-unit', 'px'); // default px\n        var swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', '500'), 10);    // default 500ms\n        var timeDiff = Date.now() - timeDown;\n        var eventType = '';\n        var changedTouches = e.changedTouches || e.touches || [];\n\n        if (swipeUnit === 'vh') {\n            swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientHeight); // get percentage of viewport height in pixels\n        }\n        if (swipeUnit === 'vw') {\n            swipeThreshold = Math.round((swipeThreshold / 100) * document.documentElement.clientWidth); // get percentage of viewport height in pixels\n        }\n\n        if (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\n            if (Math.abs(xDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n                if (xDiff > 0) {\n                    eventType = 'swiped-left';\n                }\n                else {\n                    eventType = 'swiped-right';\n                }\n            }\n        }\n        else if (Math.abs(yDiff) > swipeThreshold && timeDiff < swipeTimeout) {\n            if (yDiff > 0) {\n                eventType = 'swiped-up';\n            }\n            else {\n                eventType = 'swiped-down';\n            }\n        }\n\n        if (eventType !== '') {\n\n            var eventData = {\n                dir: eventType.replace(/swiped-/, ''),\n                touchType: (changedTouches[0] || {}).touchType || 'direct',\n                fingers: touchCount, // Number of fingers used\n                xStart: parseInt(xDown, 10),\n                xEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\n                yStart: parseInt(yDown, 10),\n                yEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\n            };\n\n            // fire `swiped` event event on the element that started the swipe\n            startEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\n\n            // fire `swiped-dir` event on the element that started the swipe\n            startEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\n        }\n\n        // reset values\n        xDown = null;\n        yDown = null;\n        timeDown = null;\n    }\n    /**\n     * Records current location on touchstart event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchStart(e) {\n\n        // if the element has data-swipe-ignore=\"true\" we stop listening for swipe events\n        if (e.target.getAttribute('data-swipe-ignore') === 'true') return;\n\n        startEl = e.target;\n\n        timeDown = Date.now();\n        xDown = e.touches[0].clientX;\n        yDown = e.touches[0].clientY;\n        xDiff = 0;\n        yDiff = 0;\n        touchCount = e.touches.length;\n    }\n\n    /**\n     * Records location diff in px on touchmove event\n     * @param {object} e - browser event object\n     * @returns {void}\n     */\n    function handleTouchMove(e) {\n\n        if (!xDown || !yDown) return;\n\n        var xUp = e.touches[0].clientX;\n        var yUp = e.touches[0].clientY;\n\n        xDiff = xDown - xUp;\n        yDiff = yDown - yUp;\n    }\n\n    /**\n     * Gets attribute off HTML element or nearest parent\n     * @param {object} el - HTML element to retrieve attribute from\n     * @param {string} attributeName - name of the attribute\n     * @param {any} defaultValue - default value to return if no match found\n     * @returns {any} attribute value or defaultValue\n     */\n    function getNearestAttribute(el, attributeName, defaultValue) {\n\n        // walk up the dom tree looking for attributeName\n        while (el && el !== document.documentElement) {\n\n            var attributeValue = el.getAttribute(attributeName);\n\n            if (attributeValue) {\n                return attributeValue;\n            }\n\n            el = el.parentNode;\n        }\n\n        return defaultValue;\n    }\n\n}(window, document));\n","// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport \"../../../node_modules/swiped-events/src/swiped-events.js\";\nimport { listen, mutable, settings } from \"../toolkit.ts\";\nimport { assertElement } from \"../util/assertElement.ts\";\n\nlet imgTimeoutID: number;\n\nconst imageLoader = (resultElement: HTMLElement): void => {\n  if (imgTimeoutID) clearTimeout(imgTimeoutID);\n\n  const imgElement = resultElement.querySelector<HTMLImageElement>(\".result-images-source img\");\n  if (!imgElement) return;\n\n  // use thumbnail until full image loads\n  const thumbnail = resultElement.querySelector<HTMLImageElement>(\".image_thumbnail\");\n  if (thumbnail) {\n    if (thumbnail.src === `${settings.theme_static_path}/img/img_load_error.svg`) return;\n\n    imgElement.onerror = (): void => {\n      imgElement.src = thumbnail.src;\n    };\n\n    imgElement.src = thumbnail.src;\n  }\n\n  const imgSource = imgElement.getAttribute(\"data-src\");\n  if (!imgSource) return;\n\n  // unsafe nodejs specific, cast to https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#return_value\n  // https://github.com/searxng/searxng/pull/5073#discussion_r2265767231\n  imgTimeoutID = setTimeout(() => {\n    imgElement.src = imgSource;\n    imgElement.removeAttribute(\"data-src\");\n  }, 1000) as unknown as number;\n};\n\nconst imageThumbnails: NodeListOf<HTMLImageElement> =\n  document.querySelectorAll<HTMLImageElement>(\"#urls img.image_thumbnail\");\nfor (const thumbnail of imageThumbnails) {\n  if (thumbnail.complete && thumbnail.naturalWidth === 0) {\n    thumbnail.src = `${settings.theme_static_path}/img/img_load_error.svg`;\n  }\n\n  thumbnail.onerror = (): void => {\n    thumbnail.src = `${settings.theme_static_path}/img/img_load_error.svg`;\n  };\n}\n\nconst copyUrlButton: HTMLButtonElement | null =\n  document.querySelector<HTMLButtonElement>(\"#search_url button#copy_url\");\ncopyUrlButton?.style.setProperty(\"display\", \"block\");\n\nmutable.selectImage = (resultElement: HTMLElement): void => {\n  // add a class that can be evaluated in the CSS and indicates that the\n  // detail view is open\n  const resultsElement = document.getElementById(\"results\");\n  resultsElement?.classList.add(\"image-detail-open\");\n\n  // add a hash to the browser history so that pressing back doesn't return\n  // to the previous page this allows us to dismiss the image details on\n  // pressing the back button on mobile devices\n  window.location.hash = \"#image-viewer\";\n\n  mutable.scrollPageToSelected?.();\n\n  // if there is no element given by the caller, stop here\n  if (!resultElement) return;\n\n  imageLoader(resultElement);\n};\n\nmutable.closeDetail = (): void => {\n  const resultsElement = document.getElementById(\"results\");\n  resultsElement?.classList.remove(\"image-detail-open\");\n\n  // remove #image-viewer hash from url by navigating back\n  if (window.location.hash === \"#image-viewer\") {\n    window.history.back();\n  }\n\n  mutable.scrollPageToSelected?.();\n};\n\nlisten(\"click\", \".btn-collapse\", function (this: HTMLElement) {\n  const btnLabelCollapsed = this.getAttribute(\"data-btn-text-collapsed\");\n  const btnLabelNotCollapsed = this.getAttribute(\"data-btn-text-not-collapsed\");\n  const target = this.getAttribute(\"data-target\");\n\n  if (!(target && btnLabelCollapsed && btnLabelNotCollapsed)) return;\n\n  const targetElement = document.querySelector<HTMLElement>(target);\n  assertElement(targetElement);\n\n  const isCollapsed = this.classList.contains(\"collapsed\");\n  const newLabel = isCollapsed ? btnLabelNotCollapsed : btnLabelCollapsed;\n  const oldLabel = isCollapsed ? btnLabelCollapsed : btnLabelNotCollapsed;\n\n  this.innerHTML = this.innerHTML.replace(oldLabel, newLabel);\n  this.classList.toggle(\"collapsed\");\n\n  targetElement.classList.toggle(\"invisible\");\n});\n\nlisten(\"click\", \".media-loader\", function (this: HTMLElement) {\n  const target = this.getAttribute(\"data-target\");\n  if (!target) return;\n\n  const iframeLoad = document.querySelector<HTMLIFrameElement>(`${target} > iframe`);\n  assertElement(iframeLoad);\n\n  const srctest = iframeLoad.getAttribute(\"src\");\n  if (!srctest) {\n    const dataSrc = iframeLoad.getAttribute(\"data-src\");\n    if (dataSrc) {\n      iframeLoad.setAttribute(\"src\", dataSrc);\n    }\n  }\n});\n\nlisten(\"click\", \"#copy_url\", async function (this: HTMLElement) {\n  const target = this.parentElement?.querySelector<HTMLPreElement>(\"pre\");\n  assertElement(target);\n\n  if (window.isSecureContext) {\n    await navigator.clipboard.writeText(target.innerText);\n  } else {\n    const selection = window.getSelection();\n    if (selection) {\n      const range = document.createRange();\n      range.selectNodeContents(target);\n      selection.removeAllRanges();\n      selection.addRange(range);\n      document.execCommand(\"copy\");\n    }\n  }\n\n  if (this.dataset.copiedText) {\n    this.innerText = this.dataset.copiedText;\n  }\n});\n\nlisten(\"click\", \".result-detail-close\", (event: Event) => {\n  event.preventDefault();\n  mutable.closeDetail?.();\n});\n\nlisten(\"click\", \".result-detail-previous\", (event: Event) => {\n  event.preventDefault();\n  mutable.selectPrevious?.(false);\n});\n\nlisten(\"click\", \".result-detail-next\", (event: Event) => {\n  event.preventDefault();\n  mutable.selectNext?.(false);\n});\n\n// listen for the back button to be pressed and dismiss the image details when called\nwindow.addEventListener(\"hashchange\", () => {\n  if (window.location.hash !== \"#image-viewer\") {\n    mutable.closeDetail?.();\n  }\n});\n\nconst swipeHorizontal: NodeListOf<HTMLElement> = document.querySelectorAll<HTMLElement>(\".swipe-horizontal\");\nfor (const element of swipeHorizontal) {\n  listen(\"swiped-left\", element, () => {\n    mutable.selectNext?.(false);\n  });\n\n  listen(\"swiped-right\", element, () => {\n    mutable.selectPrevious?.(false);\n  });\n}\n\nwindow.addEventListener(\n  \"scroll\",\n  () => {\n    const backToTopElement = document.getElementById(\"backToTop\");\n    const resultsElement = document.getElementById(\"results\");\n\n    if (backToTopElement && resultsElement) {\n      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;\n      const isScrolling = scrollTop >= 100;\n      resultsElement.classList.toggle(\"scrolling\", isScrolling);\n    }\n  },\n  true\n);\n"],"x_google_ignoreList":[0],"mappings":"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"}