| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | (function ($, Drupal, drupalSettings) {  "use strict";  Drupal.extlink = Drupal.extlink || {};  Drupal.extlink.attach = function (context, drupalSettings) {    if (!drupalSettings.data.hasOwnProperty('extlink')) {      return;    }    // Strip the host name down, removing ports, subdomains, or www.    var pattern = /^(([^\/:]+?\.)*)([^\.:]{1,})((\.[a-z0-9]{1,253})*)(:[0-9]{1,5})?$/;    var host = window.location.host.replace(pattern, '$3$4');    var subdomain = window.location.host.replace(pattern, '$1');    // Determine what subdomains are considered internal.    var subdomains;    if (drupalSettings.data.extlink.extSubdomains) {      subdomains = "([^/]*\\.)?";    }    else if (subdomain === 'www.' || subdomain === '') {      subdomains = "(www\\.)?";    }    else {      subdomains = subdomain.replace(".", "\\.");    }    // Build regular expressions that define an internal link.    var internal_link = new RegExp("^https?://" + subdomains + host, "i");    // Extra internal link matching.    var extInclude = false;    if (drupalSettings.data.extlink.extInclude) {      extInclude = new RegExp(drupalSettings.data.extlink.extInclude.replace(/\\/, '\\'), "i");    }    // Extra external link matching.    var extExclude = false;    if (drupalSettings.data.extlink.extExclude) {      extExclude = new RegExp(drupalSettings.data.extlink.extExclude.replace(/\\/, '\\'), "i");    }    // Extra external link CSS selector exclusion.    var extCssExclude = false;    if (drupalSettings.data.extlink.extCssExclude) {      extCssExclude = drupalSettings.data.extlink.extCssExclude;    }    // Extra external link CSS selector explicit.    var extCssExplicit = false;    if (drupalSettings.data.extlink.extCssExplicit) {      extCssExplicit = drupalSettings.data.extlink.extCssExplicit;    }    // Find all links which are NOT internal and begin with http as opposed    // to ftp://, javascript:, etc. other kinds of links.    // When operating on the 'this' variable, the host has been appended to    // all links by the browser, even local ones.    // In jQuery 1.1 and higher, we'd use a filter method here, but it is not    // available in jQuery 1.0 (Drupal 5 default).    var external_links = [];    var mailto_links = [];    $("a:not(." + drupalSettings.data.extlink.extClass + ", ." + drupalSettings.data.extlink.mailtoClass + "), area:not(." + drupalSettings.data.extlink.extClass + ", ." + drupalSettings.data.extlink.mailtoClass + ")", context).each(function (el) {      try {        if (typeof this.href == 'string') {          var url = this.href.toLowerCase();        }        // Handle SVG links (xlink:href).        else if (typeof this.href == 'object') {          var url = this.href.baseVal;        }        if (url.indexOf('http') === 0          && ((!url.match(internal_link) && !(extExclude && url.match(extExclude))) || (extInclude && url.match(extInclude)))          && !(extCssExclude && $(this).parents(extCssExclude).length > 0)          && !(extCssExplicit && $(this).parents(extCssExplicit).length < 1)) {          external_links.push(this);        }        // Do not include area tags with begin with mailto: (this prohibits        // icons from being added to image-maps).        else if (this.tagName !== 'AREA'          && url.indexOf('mailto:') === 0          && !(extCssExclude && $(this).parents(extCssExclude).length > 0)          && !(extCssExplicit && $(this).parents(extCssExplicit).length < 1)) {          mailto_links.push(this);        }      }        // IE7 throws errors often when dealing with irregular links, such as:        // <a href="node/10"></a> Empty tags.        // <a href="http://user:pass@example.com">example</a> User:pass syntax.      catch (error) {        return false;      }    });    if (drupalSettings.data.extlink.extClass) {      Drupal.extlink.applyClassAndSpan(external_links, drupalSettings.data.extlink.extClass);    }    if (drupalSettings.data.extlink.mailtoClass) {      Drupal.extlink.applyClassAndSpan(mailto_links, drupalSettings.data.extlink.mailtoClass);    }    if (drupalSettings.data.extlink.extTarget) {      // Apply the target attribute to all links.      if(drupalSettings.data.extlink.extTarget){        $(external_links).attr('target', '_blank');      }    }    Drupal.extlink = Drupal.extlink || {};    // Set up default click function for the external links popup. This should be    // overridden by modules wanting to alter the popup.    Drupal.extlink.popupClickHandler = Drupal.extlink.popupClickHandler || function () {      if (drupalSettings.data.extlink.extAlert) {        return confirm(drupalSettings.data.extlink.extAlertText);      }    };    $(external_links).click(function (e) {      return Drupal.extlink.popupClickHandler(e, this);    });  };  /**   * Apply a class and a trailing <span> to all links not containing images.   *   * @param links   *   An array of DOM elements representing the links.   * @param class_name   *   The class to apply to the links.   */  Drupal.extlink.applyClassAndSpan = function (links, class_name) {    var $links_to_process;    if (drupalSettings.data.extlink.extImgClass) {      $links_to_process = $(links);    }    else {      var links_with_images = $(links).find('img').parents('a');      $links_to_process = $(links).not(links_with_images);    }    $links_to_process.addClass(class_name);    var i;    var length = $links_to_process.length;    for (i = 0; i < length; i++) {      var $link = $($links_to_process[i]);      if ($link.css('display') === 'inline' || $link.css('display') === 'inline-block') {        if (class_name === drupalSettings.data.extlink.mailtoClass) {          $link.append('<span class="' + class_name + '"><span class="element-invisible"> ' + drupalSettings.data.extlink.mailtoLabel + '</span></span>');        }        else {          $link.append('<span class="' + class_name + '"><span class="element-invisible"> ' + drupalSettings.data.extlink.extLabel + '</span></span>');        }      }    }  };  Drupal.behaviors.extlink = Drupal.behaviors.extlink || {};  Drupal.behaviors.extlink.attach = function (context, drupalSettings) {    // Backwards compatibility, for the benefit of modules overriding extlink    // functionality by defining an "extlinkAttach" global function.    if (typeof extlinkAttach === 'function') {      extlinkAttach(context);    }    else {      Drupal.extlink.attach(context, drupalSettings);    }  };})(jQuery, Drupal, drupalSettings);
 |