// $Id: extlink.js,v 1.8 2010/05/26 01:25:56 quicksketch Exp $
(function ($) {

function extlinkAttach(context) {
  // 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.
  if (Drupal.settings.extlink.extSubdomains) {
    var subdomains = "([^/]*\\.)?";
  }
  else if (subdomain == 'www.' || subdomain == '') {
    var subdomains = "(www\\.)?";
  }
  else {
    var 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 (Drupal.settings.extlink.extInclude) {
    extInclude = new RegExp(Drupal.settings.extlink.extInclude.replace(/\\/, '\\'));
  }

  // Extra external link matching.
  var extExclude = false;
  if (Drupal.settings.extlink.extExclude) {
    extExclude = new RegExp(Drupal.settings.extlink.extExclude.replace(/\\/, '\\'));
  }

  // 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(." + Drupal.settings.extlink.extClass + ", ." + Drupal.settings.extlink.mailtoClass + ")", context).each(function(el) {
    try {
      var url = this.href.toLowerCase();
      if (url.indexOf('http') == 0 && (!url.match(internal_link) || (extInclude && url.match(extInclude))) && !(extExclude && url.match(extExclude))) {
        external_links.push(this);
      }
      else if (url.indexOf('mailto:') == 0) {
        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 (Drupal.settings.extlink.extClass) {
    // Apply the "ext" class to all links not containing images.
    if (parseFloat($().jquery) < 1.2) {
      $(external_links).not('[img]').addClass(Drupal.settings.extlink.extClass).each(function() {if ($(this).css('display') == 'inline') $(this).after('<span class=' + Drupal.settings.extlink.extClass + '></span>');});
    }
    else {
      $(external_links).not($(external_links).find('img').parents('a')).addClass(Drupal.settings.extlink.extClass).each(function() {if ($(this).css('display') == 'inline') $(this).after('<span class=' + Drupal.settings.extlink.extClass + '></span>');});
    }
  }

  if (Drupal.settings.extlink.mailtoClass) {
    // Apply the "mailto" class to all mailto links not containing images.
    if (parseFloat($().jquery) < 1.2) {
      $(mailto_links).not('[img]').addClass(Drupal.settings.extlink.mailtoClass).each(function() {if ($(this).css('display') == 'inline') $(this).after('<span class=' + Drupal.settings.extlink.mailtoClass + '></span>');});
    }
    else {
      $(mailto_links).not($(mailto_links).find('img').parents('a')).addClass(Drupal.settings.extlink.mailtoClass).each(function() {if ($(this).css('display') == 'inline') $(this).after('<span class=' + Drupal.settings.extlink.mailtoClass + '></span>');});
    }
  }

  if (Drupal.settings.extlink.extTarget) {
    // Apply the target attribute to all links.
    $(external_links).attr('target', Drupal.settings.extlink.extTarget);
  }

  $(external_links).click(function(e) {

    $('.ui-dialog').remove();
    $('.'+ Drupal.settings.extlink.extContainerClass).remove();

    $(this).blur();
  
    var url = $(this).attr('href');
    if (Drupal.settings.extlink.extAlert == '1') {
      e.preventDefault();
      
      // link for the actual href and title
      var title = $(this).text();
      if (!title) {
        title = $(this).find('img').attr('alt');
      }

      var target = ' target="'+ $(this).attr('target') +'"';
      var link = '<a class="target-link" href="'+ $(this).attr('href') +'" title="'+ title +'"'+ target +'>'+ $.trim(title) +'</a>';
      
      // replace placeholders
      var tags = new Array(/@target_link@/ig, /@base_path@/ig, /@target_url@/ig);
      var itens = new Array(link, Drupal.settings.basePath, url);
      var message = Drupal.settings.extlink.extHtmlText;
      var okButton = Drupal.settings.extlink.extOkLabel;
      var closeText = Drupal.settings.extlink.extCloseButton;
      var cancelButton = Drupal.settings.extlink.extCancelLabel;
      for (var i in tags) {
        message = message.replace(tags[i], itens[i]);
      }

      var buttonsOkCancel = {};

      buttonsOkCancel[okButton] = function() {
        window.open(url);
        $(this).dialog("close");
      };

      buttonsOkCancel[cancelButton] = function() {
        $(this).dialog("close");
      };

      $(message).dialog({
        draggable: false,
        modal: true,
        resizable: false,
        width: 617,
        height: 300,
        dialogClass: 'extlink-message',
        title: Drupal.t('NOTICE'),
        closeText: closeText,
        buttons: buttonsOkCancel,
        create: function(event, ui) {
          Drupal.attachBehaviors($(event.target).parents().filter('.ui-dialog'));
        }
      });

      $("div.ui-dialog-buttonset button:first").addClass("ok-button").attr('title', okButton);
      $("div.ui-dialog-buttonset button").not(":first").addClass("cancel-button").attr('title', cancelButton);

    }
    else {
      return confirm(Drupal.settings.extlink.extAlertText);
    }
  }).mousedown(function (e) { // open disclaimer even if the middlebutton is clicked
    if (e.which == 2) { 
      $(this).click();
    }
  });

  // Work around for Internet Explorer box model problems.
  if (($.support && !($.support.boxModel === undefined) && !$.support.boxModel) || ($.browser.msie && parseInt($.browser.version) <= 7)) {
    $('span.ext, span.mailto').css('display', 'inline-block');
  }
}

Drupal.behaviors.extlink = {
  attach: function(context){
    extlinkAttach(context);
  }
}

})(jQuery);
;

