results.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /* SPDX-License-Identifier: AGPL-3.0-or-later */
  2. (function (w, d, searxng) {
  3. 'use strict';
  4. if (searxng.endpoint !== 'results') {
  5. return;
  6. }
  7. searxng.ready(function () {
  8. d.querySelectorAll('#urls img.image').forEach(
  9. img =>
  10. img.addEventListener(
  11. 'error', () => {
  12. img.style.display = 'none';
  13. img.error = null;
  14. }
  15. ));
  16. if (d.querySelector('#search_url button#copy_url')) {
  17. d.querySelector('#search_url button#copy_url').style.display = "block";
  18. }
  19. searxng.on('.btn-collapse', 'click', function () {
  20. var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');
  21. var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');
  22. var target = this.getAttribute('data-target');
  23. var targetElement = d.querySelector(target);
  24. var html = this.innerHTML;
  25. if (this.classList.contains('collapsed')) {
  26. html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);
  27. } else {
  28. html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);
  29. }
  30. this.innerHTML = html;
  31. this.classList.toggle('collapsed');
  32. targetElement.classList.toggle('invisible');
  33. });
  34. searxng.on('.media-loader', 'click', function () {
  35. var target = this.getAttribute('data-target');
  36. var iframe_load = d.querySelector(target + ' > iframe');
  37. var srctest = iframe_load.getAttribute('src');
  38. if (srctest === null || srctest === undefined || srctest === false) {
  39. iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));
  40. }
  41. });
  42. searxng.on('#copy_url', 'click', function () {
  43. var target = this.parentElement.querySelector('pre');
  44. navigator.clipboard.writeText(target.innerText);
  45. this.innerText = this.dataset.copiedText;
  46. });
  47. searxng.selectImage = function (resultElement) {
  48. /* eslint no-unused-vars: 0 */
  49. if (resultElement) {
  50. // load full size image in background
  51. const imgElement = resultElement.querySelector('.result-images-source img');
  52. const thumbnailElement = resultElement.querySelector('.image_thumbnail');
  53. const detailElement = resultElement.querySelector('.detail');
  54. if (imgElement) {
  55. const imgSrc = imgElement.getAttribute('data-src');
  56. if (imgSrc) {
  57. const loader = d.createElement('div');
  58. const imgLoader = new Image();
  59. loader.classList.add('loader');
  60. detailElement.appendChild(loader);
  61. imgLoader.onload = e => {
  62. imgElement.src = imgSrc;
  63. loader.remove();
  64. };
  65. imgLoader.onerror = e => {
  66. loader.remove();
  67. };
  68. imgLoader.src = imgSrc;
  69. imgElement.src = thumbnailElement.src;
  70. imgElement.removeAttribute('data-src');
  71. }
  72. }
  73. }
  74. d.getElementById('results').classList.add('image-detail-open');
  75. searxng.scrollPageToSelected();
  76. }
  77. searxng.closeDetail = function (e) {
  78. d.getElementById('results').classList.remove('image-detail-open');
  79. searxng.scrollPageToSelected();
  80. }
  81. searxng.on('.result-detail-close', 'click', e => {
  82. e.preventDefault();
  83. searxng.closeDetail();
  84. });
  85. searxng.on('.result-detail-previous', 'click', e => {
  86. e.preventDefault();
  87. searxng.selectPrevious(false)
  88. });
  89. searxng.on('.result-detail-next', 'click', e => {
  90. e.preventDefault();
  91. searxng.selectNext(false);
  92. });
  93. w.addEventListener('scroll', function () {
  94. var e = d.getElementById('backToTop'),
  95. scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
  96. results = d.getElementById('results');
  97. if (e !== null) {
  98. if (scrollTop >= 100) {
  99. results.classList.add('scrolling');
  100. } else {
  101. results.classList.remove('scrolling');
  102. }
  103. }
  104. }, true);
  105. });
  106. })(window, document, window.searxng);