| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | (function ($) {Drupal.extlink = Drupal.extlink || {};Drupal.extlink.attach = function (context, settings) {  if (!settings.hasOwnProperty('extlink')) {    return;  }  // Strip the host name down, removing ports, subdomains, or www.  var pattern = /^(([^\/:]+?\.)*)([^\.:]{4,})((\.[a-z]{1,4})*)(:[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 (settings.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 (settings.extlink.extInclude) {    extInclude = new RegExp(settings.extlink.extInclude.replace(/\\/, '\\'), "i");  }  // Extra external link matching.  var extExclude = false;  if (settings.extlink.extExclude) {    extExclude = new RegExp(settings.extlink.extExclude.replace(/\\/, '\\'), "i");  }  // Extra external link CSS selector exclusion.  var extCssExclude = false;  if (settings.extlink.extCssExclude) {    extCssExclude = settings.extlink.extCssExclude;  }  // Extra external link CSS selector explicit.  var extCssExplicit = false;  if (settings.extlink.extCssExplicit) {    extCssExplicit = settings.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 = new Array();  var mailto_links = new Array();  $("a:not(." + settings.extlink.extClass + ", ." + settings.extlink.mailtoClass + "), area:not(." + settings.extlink.extClass + ", ." + settings.extlink.mailtoClass + ")", context).each(function(el) {    try {      var url = this.href.toLowerCase();      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 (settings.extlink.extClass) {    Drupal.extlink.applyClassAndSpan(external_links, settings.extlink.extClass);  }  if (settings.extlink.mailtoClass) {    Drupal.extlink.applyClassAndSpan(mailto_links, settings.extlink.mailtoClass);  }  if (settings.extlink.extTarget) {    // Apply the target attribute to all links.    $(external_links).attr('target', settings.extlink.extTarget);  }  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 (settings.extlink.extAlert) {      return confirm(settings.extlink.extAlertText);    }   }  $(external_links).click(function(e) {    return Drupal.extlink.popupClickHandler(e);  });};/** * 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 (Drupal.settings.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 == Drupal.settings.extlink.mailtoClass) {        $link.append('<span class="' + class_name + '"><span class="element-invisible"> ' + Drupal.settings.extlink.mailtoLabel + '</span></span>');      }      else {        $link.append('<span class="' + class_name + '"><span class="element-invisible"> ' + Drupal.settings.extlink.extLabel + '</span></span>');      }    }  }};Drupal.behaviors.extlink = Drupal.behaviors.extlink || {};Drupal.behaviors.extlink.attach = function (context, settings) {  // 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, settings);  }};})(jQuery);
 |