summaryrefslogtreecommitdiff
path: root/searx/static/themes/simple/src/js/main/results.js
blob: adde916ea8f81dd3ebadb86321aac4a6a7ba2c48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* SPDX-License-Identifier: AGPL-3.0-or-later */
(function (w, d, searxng) {
  'use strict';

  if (searxng.endpoint !== 'results') {
    return;
  }

  searxng.ready(function () {
    d.querySelectorAll('#urls img').forEach(
      img =>
        img.addEventListener(
          'error', () => {
            // console.log("ERROR can't load: " + img.src);
            img.src = window.searxng.settings.theme_static_path + "/img/img_load_error.svg";
          },
          {once: true}
        ));

    if (d.querySelector('#search_url button#copy_url')) {
      d.querySelector('#search_url button#copy_url').style.display = "block";
    }

    searxng.on('.btn-collapse', 'click', function () {
      var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed');
      var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed');
      var target = this.getAttribute('data-target');
      var targetElement = d.querySelector(target);
      var html = this.innerHTML;
      if (this.classList.contains('collapsed')) {
        html = html.replace(btnLabelCollapsed, btnLabelNotCollapsed);
      } else {
        html = html.replace(btnLabelNotCollapsed, btnLabelCollapsed);
      }
      this.innerHTML = html;
      this.classList.toggle('collapsed');
      targetElement.classList.toggle('invisible');
    });

    searxng.on('.media-loader', 'click', function () {
      var target = this.getAttribute('data-target');
      var iframe_load = d.querySelector(target + ' > iframe');
      var srctest = iframe_load.getAttribute('src');
      if (srctest === null || srctest === undefined || srctest === false) {
        iframe_load.setAttribute('src', iframe_load.getAttribute('data-src'));
      }
    });

    searxng.on('#copy_url', 'click', function () {
      var target = this.parentElement.querySelector('pre');
      navigator.clipboard.writeText(target.innerText);
      this.innerText = this.dataset.copiedText;
    });

    // progress spinner that is being attached while an image is loading
    const imgLoaderSpinner = d.createElement('div');
    imgLoaderSpinner.classList.add('loader');
    const imgLoader = new Image();

    const loadImage = (imgSrc, onSuccess) => {
      imgLoader.onload = () => {
        onSuccess();
        imgLoaderSpinner.remove();
      };
      imgLoader.onerror = () => {
        imgLoaderSpinner.remove();
      };
      imgLoader.src = imgSrc;
    }
    searxng.selectImage = function (resultElement) {
      /* eslint no-unused-vars: 0 */
      if (resultElement) {
        // load full size image in background
        const thumbnailElement = resultElement.querySelector('.image_thumbnail');
        const detailElement = resultElement.querySelector('.detail');
        const imgElement = resultElement.querySelector('.result-images-source img');
        if (!imgElement) return;

        const imgSrc = imgElement.getAttribute('data-src');
        // already loaded high-res image or no high-res image available
        if (!imgSrc) return;

        // show a progress spinner and start loading the full high-res image
        detailElement.appendChild(imgLoaderSpinner);
        loadImage(imgSrc, () => {
          imgElement.src = imgSrc;
          imgElement.removeAttribute('data-src');
        })

        // use the image thumbnail until the image is fully loaded
        imgElement.src = thumbnailElement.src;
      }
      d.getElementById('results').classList.add('image-detail-open');

      // add a hash to the browser history so that pressing back doesn't return to the previous page
      // this allows us to dismiss the image details on pressing the back button on mobile devices
      window.location.hash = '#image-viewer';

      searxng.scrollPageToSelected();
    };

    searxng.closeDetail = function () {
      d.getElementById('results').classList.remove('image-detail-open');
      // remove #image-viewer hash from url by navigating back
      if (window.location.hash == '#image-viewer') window.history.back();
      searxng.scrollPageToSelected();
    };
    searxng.on('.result-detail-close', 'click', e => {
      e.preventDefault();
      searxng.closeDetail();
    });
    searxng.on('.result-detail-previous', 'click', e => {
      e.preventDefault();
      searxng.selectPrevious(false);
    });
    searxng.on('.result-detail-next', 'click', e => {
      e.preventDefault();
      searxng.selectNext(false);
    });

    // listen for the back button to be pressed and dismiss the image details when called
    window.addEventListener('hashchange', () => {
      if (window.location.hash != '#image-viewer') searxng.closeDetail();
    });

    d.querySelectorAll('.swipe-horizontal').forEach(
      obj => {
        obj.addEventListener('swiped-left', function (e) {
          searxng.selectNext(false);
        });
        obj.addEventListener('swiped-right', function (e) {
          searxng.selectPrevious(false);
        });
      }
    );

    w.addEventListener('scroll', function () {
      var e = d.getElementById('backToTop'),
        scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
        results = d.getElementById('results');
      if (e !== null) {
        if (scrollTop >= 100) {
          results.classList.add('scrolling');
        } else {
          results.classList.remove('scrolling');
        }
      }
    }, true);

  });

})(window, document, window.searxng);