94 lines
3.3 KiB
JavaScript
94 lines
3.3 KiB
JavaScript
(function ($) {
|
|
|
|
$(document).ready(function() {
|
|
|
|
// Expression to check for absolute internal links.
|
|
var isInternal = new RegExp("^(https?):\/\/" + window.location.host, "i");
|
|
|
|
// Attach onclick event to document only and catch clicks on all elements.
|
|
$(document.body).click(function(event) {
|
|
// Catch the closest surrounding link of a clicked element.
|
|
$(event.target).closest("a,area").each(function() {
|
|
|
|
var ga = Drupal.settings.googleanalytics;
|
|
// Expression to check for special links like gotwo.module /go/* links.
|
|
var isInternalSpecial = new RegExp("(\/go\/.*)$", "i");
|
|
// Expression to check for download links.
|
|
var isDownload = new RegExp("\\.(" + ga.trackDownloadExtensions + ")$", "i");
|
|
|
|
// Is the clicked URL internal?
|
|
if (isInternal.test(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.
|
|
}
|
|
// Is download tracking activated and the file extension configured for download tracking?
|
|
else if (ga.trackDownload && isDownload.test(this.href)) {
|
|
// Download link clicked.
|
|
var extension = isDownload.exec(this.href);
|
|
_gaq.push(["_trackEvent", "Downloads", extension[1].toUpperCase(), this.href.replace(isInternal, '')]);
|
|
}
|
|
else if (isInternalSpecial.test(this.href)) {
|
|
// Keep the internal URL for Google Analytics website overlay intact.
|
|
_gaq.push(["_trackPageview", this.href.replace(isInternal, '')]);
|
|
}
|
|
}
|
|
else {
|
|
if (ga.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) {
|
|
// Mailto link clicked.
|
|
_gaq.push(["_trackEvent", "Mails", "Click", this.href.substring(7)]);
|
|
}
|
|
else if (ga.trackOutbound && this.href.match(/^\w+:\/\//i)) {
|
|
if (ga.trackDomainMode == 2 && isCrossDomain($(this).attr('hostname'), ga.trackCrossDomains)) {
|
|
// Top-level cross domain clicked. document.location is handled by _link internally.
|
|
event.preventDefault();
|
|
_gaq.push(["_link", this.href]);
|
|
}
|
|
else {
|
|
// External link clicked.
|
|
_gaq.push(["_trackEvent", "Outbound links", "Click", this.href]);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
// 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) {
|
|
_gaq.push(["_trackPageview", href.replace(isInternal, '')]);
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
/**
|
|
* 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
|
|
*/
|
|
function isCrossDomain(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;
|
|
}
|
|
}
|
|
|
|
})(jQuery);
|