danielebarchiesi@2: (function ($) { danielebarchiesi@2: danielebarchiesi@2: $(document).ready(function() { danielebarchiesi@2: danielebarchiesi@2: // Expression to check for absolute internal links. danielebarchiesi@2: var isInternal = new RegExp("^(https?):\/\/" + window.location.host, "i"); danielebarchiesi@2: danielebarchiesi@2: // Attach onclick event to document only and catch clicks on all elements. danielebarchiesi@2: $(document.body).click(function(event) { danielebarchiesi@2: // Catch the closest surrounding link of a clicked element. danielebarchiesi@2: $(event.target).closest("a,area").each(function() { danielebarchiesi@2: danielebarchiesi@2: var ga = Drupal.settings.googleanalytics; danielebarchiesi@2: // Expression to check for special links like gotwo.module /go/* links. danielebarchiesi@2: var isInternalSpecial = new RegExp("(\/go\/.*)$", "i"); danielebarchiesi@2: // Expression to check for download links. danielebarchiesi@2: var isDownload = new RegExp("\\.(" + ga.trackDownloadExtensions + ")$", "i"); danielebarchiesi@2: danielebarchiesi@2: // Is the clicked URL internal? danielebarchiesi@2: if (isInternal.test(this.href)) { danielebarchiesi@2: // Skip 'click' tracking, if custom tracking events are bound. danielebarchiesi@2: if ($(this).is('.colorbox')) { danielebarchiesi@2: // Do nothing here. The custom event will handle all tracking. danielebarchiesi@2: } danielebarchiesi@2: // Is download tracking activated and the file extension configured for download tracking? danielebarchiesi@2: else if (ga.trackDownload && isDownload.test(this.href)) { danielebarchiesi@2: // Download link clicked. danielebarchiesi@2: var extension = isDownload.exec(this.href); danielebarchiesi@2: _gaq.push(["_trackEvent", "Downloads", extension[1].toUpperCase(), this.href.replace(isInternal, '')]); danielebarchiesi@2: } danielebarchiesi@2: else if (isInternalSpecial.test(this.href)) { danielebarchiesi@2: // Keep the internal URL for Google Analytics website overlay intact. danielebarchiesi@2: _gaq.push(["_trackPageview", this.href.replace(isInternal, '')]); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: else { danielebarchiesi@2: if (ga.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) { danielebarchiesi@2: // Mailto link clicked. danielebarchiesi@2: _gaq.push(["_trackEvent", "Mails", "Click", this.href.substring(7)]); danielebarchiesi@2: } danielebarchiesi@2: else if (ga.trackOutbound && this.href.match(/^\w+:\/\//i)) { danielebarchiesi@2: if (ga.trackDomainMode == 2 && isCrossDomain($(this).attr('hostname'), ga.trackCrossDomains)) { danielebarchiesi@2: // Top-level cross domain clicked. document.location is handled by _link internally. danielebarchiesi@2: event.preventDefault(); danielebarchiesi@2: _gaq.push(["_link", this.href]); danielebarchiesi@2: } danielebarchiesi@2: else { danielebarchiesi@2: // External link clicked. danielebarchiesi@2: _gaq.push(["_trackEvent", "Outbound links", "Click", this.href]); danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: }); danielebarchiesi@2: }); danielebarchiesi@2: danielebarchiesi@2: // Colorbox: This event triggers when the transition has completed and the danielebarchiesi@2: // newly loaded content has been revealed. danielebarchiesi@2: $(document).bind("cbox_complete", function() { danielebarchiesi@2: var href = $.colorbox.element().attr("href"); danielebarchiesi@2: if (href) { danielebarchiesi@2: _gaq.push(["_trackPageview", href.replace(isInternal, '')]); danielebarchiesi@2: } danielebarchiesi@2: }); danielebarchiesi@2: danielebarchiesi@2: }); danielebarchiesi@2: danielebarchiesi@2: /** danielebarchiesi@2: * Check whether the hostname is part of the cross domains or not. danielebarchiesi@2: * danielebarchiesi@2: * @param string hostname danielebarchiesi@2: * The hostname of the clicked URL. danielebarchiesi@2: * @param array crossDomains danielebarchiesi@2: * All cross domain hostnames as JS array. danielebarchiesi@2: * danielebarchiesi@2: * @return boolean danielebarchiesi@2: */ danielebarchiesi@2: function isCrossDomain(hostname, crossDomains) { danielebarchiesi@2: /** danielebarchiesi@2: * jQuery < 1.6.3 bug: $.inArray crushes IE6 and Chrome if second argument is danielebarchiesi@2: * `null` or `undefined`, http://bugs.jquery.com/ticket/10076, danielebarchiesi@2: * https://github.com/jquery/jquery/commit/a839af034db2bd934e4d4fa6758a3fed8de74174 danielebarchiesi@2: * danielebarchiesi@2: * @todo: Remove/Refactor in D8 danielebarchiesi@2: */ danielebarchiesi@2: if (!crossDomains) { danielebarchiesi@2: return false; danielebarchiesi@2: } danielebarchiesi@2: else { danielebarchiesi@2: return $.inArray(hostname, crossDomains) > -1 ? true : false; danielebarchiesi@2: } danielebarchiesi@2: } danielebarchiesi@2: danielebarchiesi@2: })(jQuery);