| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | (function ($) {Drupal.googleanalytics = {};$(document).ready(function() {  // Attach mousedown, keyup, touchstart events to document only and catch  // clicks on all elements.  $(document.body).bind("mousedown keyup touchstart", function(event) {    console.group("Running Google Analytics for Drupal.");    console.info(event);    // Catch the closest surrounding link of a clicked element.    $(event.target).closest("a,area").each(function() {      console.info("Element '%o' has been detected. Link '%s' found.", this, this.href);      // Is the clicked URL internal?      if (Drupal.googleanalytics.isInternal(this.href)) {        // Skip 'click' tracking, if custom tracking events are bound.        if ($(this).is('.colorbox')) {          // Do nothing here. The custom event will handle all tracking.          console.info("Click on .colorbox item has been detected.");        }        // Is download tracking activated and the file extension configured for download tracking?        else if (Drupal.settings.googleanalytics.trackDownload && Drupal.googleanalytics.isDownload(this.href)) {          // Download link clicked.          console.info("Download url '%s' has been found. Tracked download as extension '%s'.", Drupal.googleanalytics.getPageUrl(this.href), Drupal.googleanalytics.getDownloadExtension(this.href).toUpperCase());          ga("send", "event", "Downloads", Drupal.googleanalytics.getDownloadExtension(this.href).toUpperCase(), Drupal.googleanalytics.getPageUrl(this.href));        }        else if (Drupal.googleanalytics.isInternalSpecial(this.href)) {          // Keep the internal URL for Google Analytics website overlay intact.          console.info("Click on internal special link '%s' has been tracked.", Drupal.googleanalytics.getPageUrl(this.href));          ga("send", "pageview", { "page": Drupal.googleanalytics.getPageUrl(this.href) });        }        else {          // e.g. anchor in same page or other internal page link          console.info("Click on internal link '%s' detected, but not tracked by click.", this.href);        }      }      else {        if (Drupal.settings.googleanalytics.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) {          // Mailto link clicked.          console.info("Click on e-mail '%s' has been tracked.", this.href.substring(7));          ga("send", "event", "Mails", "Click", this.href.substring(7));        }        else if (Drupal.settings.googleanalytics.trackOutbound && this.href.match(/^\w+:\/\//i)) {          if (Drupal.settings.googleanalytics.trackDomainMode != 2 || (Drupal.settings.googleanalytics.trackDomainMode == 2 && !Drupal.googleanalytics.isCrossDomain(this.hostname, Drupal.settings.googleanalytics.trackCrossDomains))) {            // External link clicked / No top-level cross domain clicked.            console.info("Outbound link '%s' has been tracked.", this.href);            ga("send", "event", "Outbound links", "Click", this.href);          }          else {            console.info("Internal link '%s' clicked, not tracked.", this.href);          }        }      }    });    console.groupEnd();  });  // Track hash changes as unique pageviews, if this option has been enabled.  if (Drupal.settings.googleanalytics.trackUrlFragments) {    window.onhashchange = function() {      console.info("Track URL '%s' as pageview. Hash '%s' has changed.", location.pathname + location.search + location.hash, location.hash);      ga('send', 'pageview', location.pathname + location.search + location.hash);    }  }  // Colorbox: This event triggers when the transition has completed and the  // newly loaded content has been revealed.  $(document).bind("cbox_complete", function () {    var href = $.colorbox.element().attr("href");    if (href) {      console.info("Colorbox transition to url '%s' has been tracked.", Drupal.googleanalytics.getPageUrl(href));      ga("send", "pageview", { "page": Drupal.googleanalytics.getPageUrl(href) });    }  });});/** * Check whether the hostname is part of the cross domains or not. * * @param string hostname *   The hostname of the clicked URL. * @param array crossDomains *   All cross domain hostnames as JS array. * * @return boolean */Drupal.googleanalytics.isCrossDomain = function (hostname, crossDomains) {  /**   * jQuery < 1.6.3 bug: $.inArray crushes IE6 and Chrome if second argument is   * `null` or `undefined`, http://bugs.jquery.com/ticket/10076,   * https://github.com/jquery/jquery/commit/a839af034db2bd934e4d4fa6758a3fed8de74174   *   * @todo: Remove/Refactor in D8   */  if (!crossDomains) {    return false;  }  else {    return $.inArray(hostname, crossDomains) > -1 ? true : false;  }};/** * Check whether this is a download URL or not. * * @param string url *   The web url to check. * * @return boolean */Drupal.googleanalytics.isDownload = function (url) {  var isDownload = new RegExp("\\.(" + Drupal.settings.googleanalytics.trackDownloadExtensions + ")([\?#].*)?$", "i");  return isDownload.test(url);};/** * Check whether this is an absolute internal URL or not. * * @param string url *   The web url to check. * * @return boolean */Drupal.googleanalytics.isInternal = function (url) {  var isInternal = new RegExp("^(https?):\/\/" + window.location.host, "i");  return isInternal.test(url);};/** * Check whether this is a special URL or not. * * URL types: *  - gotwo.module /go/* links. * * @param string url *   The web url to check. * * @return boolean */Drupal.googleanalytics.isInternalSpecial = function (url) {  var isInternalSpecial = new RegExp("(\/go\/.*)$", "i");  return isInternalSpecial.test(url);};/** * Extract the relative internal URL from an absolute internal URL. * * Examples: * - http://mydomain.com/node/1 -> /node/1 * - http://example.com/foo/bar -> http://example.com/foo/bar * * @param string url *   The web url to check. * * @return string *   Internal website URL */Drupal.googleanalytics.getPageUrl = function (url) {  var extractInternalUrl = new RegExp("^(https?):\/\/" + window.location.host, "i");  return url.replace(extractInternalUrl, '');};/** * Extract the download file extension from the URL. * * @param string url *   The web url to check. * * @return string *   The file extension of the passed url. e.g. "zip", "txt" */Drupal.googleanalytics.getDownloadExtension = function (url) {  var extractDownloadextension = new RegExp("\\.(" + Drupal.settings.googleanalytics.trackDownloadExtensions + ")([\?#].*)?$", "i");  var extension = extractDownloadextension.exec(url);  return (extension === null) ? '' : extension[1];};})(jQuery);
 |