text: /**
   * @file
   * Attaches several event listener to a web page.
   */
  
  (function ($, Drupal, drupalSettings) {
  
    "use strict";
  
    Drupal.google_analytics = {};
  
    $(document).ready(function () {
  
      // Attach mousedown, keyup, touchstart events to document only and catch
      // clicks on all elements.
      $(document.body).on("mousedown keyup touchstart", function (event) {
  
        // Catch the closest surrounding link of a clicked element.
        $(event.target).closest("a,area").each(function () {
  
          // Is the clicked URL internal?
          if (Drupal.google_analytics.isInternal(this.href)) {
            // Skip 'click' tracking, if custom tracking events are bound.
            if ($(this).is('.colorbox') && (drupalSettings.google_analytics.trackColorbox)) {
              // 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 (drupalSettings.google_analytics.trackDownload && Drupal.google_analytics.isDownload(this.href)) {
              // Download link clicked.
              ga("send", {
                "hitType": "event",
                "eventCategory": "Downloads",
                "eventAction": Drupal.google_analytics.getDownloadExtension(this.href).toUpperCase(),
                "eventLabel": Drupal.google_analytics.getPageUrl(this.href),
                "transport": "beacon"
              });
            }
            else if (Drupal.google_analytics.isInternalSpecial(this.href)) {
              // Keep the internal URL for Google Analytics website overlay intact.
              ga("send", {
                "hitType": "pageview",
                "page": Drupal.google_analytics.getPageUrl(this.href),
                "transport": "beacon"
              });
            }
          }
          else {
            if (drupalSettings.google_analytics.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) {
              // Mailto link clicked.
              ga("send", {
                "hitType": "event",
                "eventCategory": "Mails",
                "eventAction": "Click",
                "eventLabel": this.href.substring(7),
                "transport": "beacon"
              });
            }
            else if (drupalSettings.google_analytics.trackOutbound && this.href.match(/^\w+:\/\//i)) {
              if (drupalSettings.google_analytics.trackDomainMode !== 2 || (drupalSettings.google_analytics.trackDomainMode === 2 && !Drupal.google_analytics.isCrossDomain(this.hostname, drupalSettings.google_analytics.trackCrossDomains))) {
                // External link clicked / No top-level cross domain clicked.
                ga("send", {
                  "hitType": "event",
                  "eventCategory": "Outbound links",
                  "eventAction": "Click",
                  "eventLabel": this.href,
                  "transport": "beacon"
                });
              }
            }
          }
        });
      });
  
      // Track hash changes as unique pageviews, if this option has been enabled.
      if (drupalSettings.google_analytics.trackUrlFragments) {
        window.onhashchange = function () {
          ga("send", {
            "hitType": "pageview",
            "page": location.pathname + location.search + location.hash
          });
        };
      }
  
      // Colorbox: This event triggers when the transition has completed and the
      // newly loaded content has been revealed.
      if (drupalSettings.google_analytics.trackColorbox) {
        $(document).on("cbox_complete", function () {
          var href = $.colorbox.element().attr("href");
          if (href) {
            ga("send", {
              "hitType": "pageview",
              "page": Drupal.google_analytics.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} isCrossDomain
     */
    Drupal.google_analytics.isCrossDomain = function (hostname, crossDomains) {
      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} isDownload
     */
    Drupal.google_analytics.isDownload = function (url) {
      var isDownload = new RegExp("\\.(" + drupalSettings.google_analytics.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} isInternal
     */
    Drupal.google_analytics.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} isInternalSpecial
     */
    Drupal.google_analytics.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} getPageUrl
     *   Internal website URL.
     */
    Drupal.google_analytics.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} getDownloadExtension
     *   The file extension of the passed url. e.g. "zip", "txt"
     */
    Drupal.google_analytics.getDownloadExtension = function (url) {
      var extractDownloadextension = new RegExp("\\.(" + drupalSettings.google_analytics.trackDownloadExtensions + ")([\?#].*)?$", "i");
      var extension = extractDownloadextension.exec(url);
      return (extension === null) ? '' : extension[1];
    };
  
  })(jQuery, Drupal, drupalSettings);
  