PageSourceSearch

https://www.jynarque.com/modules/contrib/external_link_popup/js/dialog.js

js jynarque.com collected 2026-10-08 00:24:20 UTC 5,687 bytes, 193 lines download raw bytes

1/**
2 * @file
3 * Dialog initialization for mail preview.
4 */
5
6(function ($, Drupal, drupalSettings, once) {
7  'use strict';
8  var $window = $(window);
9
10  Drupal.behaviors.externalLinkPopup = {
11    attach: function (context) {
12      var self = this;
13      var settings = drupalSettings.external_link_popup;
14
15      if (
16        !settings.popups
17        || !settings.popups.length
18        || !$(once('external-link-popup', 'body', context)).length
19      ) {
20        return;
21      }
22
23      // RegExp /\s*,\s*|\s+/ supports both space and comma delimiters
24      // and its combination.
25      var whitelist = settings.whitelist ? settings.whitelist.split(/\s*,\s*|\s+/) : [];
26      var current = window.location.host || window.location.hostname;
27      var popup;
28
29      whitelist.unshift(current);
30      if (current.substr(0, 4) === 'www.') {
31        whitelist.push(current.substr(4));
32      }
33      else {
34        whitelist.push('www.' + current);
35      }
36
37      // $.once checked above.
38      $('body', context).on('click', 'a', function (e) {
39        var element = $(this).get(0);
40        var popupId = element.getAttribute('data-external-link-popup-id');
41        var domain = self.getDomain(element.getAttribute('href'));
42        if (!domain && !popupId) {
43          // It's internal link, return without events.
44          return;
45        }
46        if (
47          $(element).hasClass('external-link-popup-disabled') ||
48          !popupId &&
49          self.inDomain(domain, whitelist)
50        ) {
51          $window.trigger({
52            type: 'externalLinkPopup:skipped',
53            popupId: null,
54            domain: domain,
55            target: element
56          });
57          return;
58        }
59
60        for (var i = 0; i < settings.popups.length; i++) {
61          popup = settings.popups[i];
62          if (!popupId && popup.domains !== '*' && !self.inDomain(domain, popup.domains.split(/\s*,\s*|\s+/))) {
63            continue;
64          }
65          if (popupId && popupId !== popup.id) {
66            continue;
67          }
68          e.preventDefault();
69          return self.openDialog(
70            element,
71            popup,
72            domain
73          );
74        }
75
76        $window.trigger({
77          type: 'externalLinkPopup:notFound',
78          popupId: null,
79          domain: domain,
80          target: element
81        });
82      });
83    },
84    inDomain: function (domain, domains) {
85      if (typeof domain !== 'string') {
86        return false;
87      }
88      for (var i in domains) {
89        if (
90          domain.toLowerCase() === domains[i].toLowerCase() ||
91          domain.match(new RegExp('\\.' + this.pregEscape(domains[i]) + '$', 'i'))
92        ) {
93          return true;
94        }
95      }
96      return false;
97    },
98    getDomain: function (url) {
99      if (typeof url !== 'string') {
100        return null;
101      }
102      var matches = url.match(/\/\/([^/]+)\/?/);
103      return matches && matches[1];
104    },
105    pregEscape: function (str) {
106      return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]', 'g'), '\\$&');
107    },
108    openDialog: function (element, popup, domain) {
109      var dialog;
110      var yes = false;
111      var body = document.createElement('div');
112      var content = document.createElement('div');
113      var options = {
114        title: popup.title,
115        width: drupalSettings.external_link_popup.width || '85%',
116        buttons: [
117          {
118            text: popup.labelyes,
119            click: function () {
120              yes = true;
121              $(this).dialog('close');
122              $window.trigger({
123                type: 'externalLinkPopup:yes',
124                popupId: popup.id,
125                domain: domain,
126                target: element
127              });
128              var target = window.open(element.href, element.target || popup.target);
129              target.focus();
130            }
131          }
132        ],
133        create: function () {
134          var $widget = $(this).parent();
135
136          if (!$widget.length) {
137            // Bootstrap theme modal.
138            $widget = $('.modal-dialog', this);
139          }
140          $widget.addClass('external-link-popup')
141            .addClass('external-link-popup-id-' + popup.id.replace('_', '-'));
142          if (!popup.close) {
143            $widget.find('.ui-dialog-titlebar-close').remove();
144          }
145          if (!popup.title && !popup.close) {
146            $widget.find('.ui-dialog-titlebar').remove();
147          }
148        },
149        close: function () {
150          var $element = $(this);
151          if (dialog && dialog.open) {
152            dialog.close();
153          }
154          $element.dialog('destroy');
155          if (!yes) {
156            $window.trigger({
157              type: 'externalLinkPopup:no',
158              popupId: popup.id,
159              domain: domain,
160              target: element
161            });
162          }
163        }
164      };
165      if (popup.labelno) {
166        options.buttons.push({
167          text: popup.labelno,
168          click: function () {
169            $(this).dialog('close');
170          }
171        });
172      }
173
174      // Take care about tokens.
175      var url = $(element).attr('href');
176      var text = $(element).text();
177      var bodyHtml = popup.body
178        .replace('[link:url]', this.htmlEncode(url))
179        .replace('[link:text]', this.htmlEncode(text));
180
181      content.className = 'external-link-popup-content';
182      body.innerHTML = bodyHtml;
183      body.className = 'external-link-popup-body';
184      content.appendChild(body);
185
186      dialog = Drupal.dialog(content, options);
187      dialog.showModal();
188    },
189    htmlEncode: function (value) {
190      return $('<div/>').text(value).html();
191    }
192  };
193})(jQuery, Drupal, drupalSettings, once);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.