/** * @file * Attaches several event listener to a web page. */ (function ($, Drupal, drupalSettings) { /* eslint max-nested-callbacks: ["error", 4] */ '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: * - https://mydomain.com/node/1 -> /node/1 * - https://example.com/foo/bar -> https://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);