danielebarchiesi@2
|
1 (function ($) {
|
danielebarchiesi@2
|
2
|
danielebarchiesi@2
|
3 $(document).ready(function() {
|
danielebarchiesi@2
|
4
|
danielebarchiesi@2
|
5 // Expression to check for absolute internal links.
|
danielebarchiesi@2
|
6 var isInternal = new RegExp("^(https?):\/\/" + window.location.host, "i");
|
danielebarchiesi@2
|
7
|
danielebarchiesi@2
|
8 // Attach onclick event to document only and catch clicks on all elements.
|
danielebarchiesi@2
|
9 $(document.body).click(function(event) {
|
danielebarchiesi@2
|
10 // Catch the closest surrounding link of a clicked element.
|
danielebarchiesi@2
|
11 $(event.target).closest("a,area").each(function() {
|
danielebarchiesi@2
|
12
|
danielebarchiesi@2
|
13 var ga = Drupal.settings.googleanalytics;
|
danielebarchiesi@2
|
14 // Expression to check for special links like gotwo.module /go/* links.
|
danielebarchiesi@2
|
15 var isInternalSpecial = new RegExp("(\/go\/.*)$", "i");
|
danielebarchiesi@2
|
16 // Expression to check for download links.
|
danielebarchiesi@2
|
17 var isDownload = new RegExp("\\.(" + ga.trackDownloadExtensions + ")$", "i");
|
danielebarchiesi@2
|
18
|
danielebarchiesi@2
|
19 // Is the clicked URL internal?
|
danielebarchiesi@2
|
20 if (isInternal.test(this.href)) {
|
danielebarchiesi@2
|
21 // Skip 'click' tracking, if custom tracking events are bound.
|
danielebarchiesi@2
|
22 if ($(this).is('.colorbox')) {
|
danielebarchiesi@2
|
23 // Do nothing here. The custom event will handle all tracking.
|
danielebarchiesi@2
|
24 }
|
danielebarchiesi@2
|
25 // Is download tracking activated and the file extension configured for download tracking?
|
danielebarchiesi@2
|
26 else if (ga.trackDownload && isDownload.test(this.href)) {
|
danielebarchiesi@2
|
27 // Download link clicked.
|
danielebarchiesi@2
|
28 var extension = isDownload.exec(this.href);
|
danielebarchiesi@2
|
29 _gaq.push(["_trackEvent", "Downloads", extension[1].toUpperCase(), this.href.replace(isInternal, '')]);
|
danielebarchiesi@2
|
30 }
|
danielebarchiesi@2
|
31 else if (isInternalSpecial.test(this.href)) {
|
danielebarchiesi@2
|
32 // Keep the internal URL for Google Analytics website overlay intact.
|
danielebarchiesi@2
|
33 _gaq.push(["_trackPageview", this.href.replace(isInternal, '')]);
|
danielebarchiesi@2
|
34 }
|
danielebarchiesi@2
|
35 }
|
danielebarchiesi@2
|
36 else {
|
danielebarchiesi@2
|
37 if (ga.trackMailto && $(this).is("a[href^='mailto:'],area[href^='mailto:']")) {
|
danielebarchiesi@2
|
38 // Mailto link clicked.
|
danielebarchiesi@2
|
39 _gaq.push(["_trackEvent", "Mails", "Click", this.href.substring(7)]);
|
danielebarchiesi@2
|
40 }
|
danielebarchiesi@2
|
41 else if (ga.trackOutbound && this.href.match(/^\w+:\/\//i)) {
|
danielebarchiesi@2
|
42 if (ga.trackDomainMode == 2 && isCrossDomain($(this).attr('hostname'), ga.trackCrossDomains)) {
|
danielebarchiesi@2
|
43 // Top-level cross domain clicked. document.location is handled by _link internally.
|
danielebarchiesi@2
|
44 event.preventDefault();
|
danielebarchiesi@2
|
45 _gaq.push(["_link", this.href]);
|
danielebarchiesi@2
|
46 }
|
danielebarchiesi@2
|
47 else {
|
danielebarchiesi@2
|
48 // External link clicked.
|
danielebarchiesi@2
|
49 _gaq.push(["_trackEvent", "Outbound links", "Click", this.href]);
|
danielebarchiesi@2
|
50 }
|
danielebarchiesi@2
|
51 }
|
danielebarchiesi@2
|
52 }
|
danielebarchiesi@2
|
53 });
|
danielebarchiesi@2
|
54 });
|
danielebarchiesi@2
|
55
|
danielebarchiesi@2
|
56 // Colorbox: This event triggers when the transition has completed and the
|
danielebarchiesi@2
|
57 // newly loaded content has been revealed.
|
danielebarchiesi@2
|
58 $(document).bind("cbox_complete", function() {
|
danielebarchiesi@2
|
59 var href = $.colorbox.element().attr("href");
|
danielebarchiesi@2
|
60 if (href) {
|
danielebarchiesi@2
|
61 _gaq.push(["_trackPageview", href.replace(isInternal, '')]);
|
danielebarchiesi@2
|
62 }
|
danielebarchiesi@2
|
63 });
|
danielebarchiesi@2
|
64
|
danielebarchiesi@2
|
65 });
|
danielebarchiesi@2
|
66
|
danielebarchiesi@2
|
67 /**
|
danielebarchiesi@2
|
68 * Check whether the hostname is part of the cross domains or not.
|
danielebarchiesi@2
|
69 *
|
danielebarchiesi@2
|
70 * @param string hostname
|
danielebarchiesi@2
|
71 * The hostname of the clicked URL.
|
danielebarchiesi@2
|
72 * @param array crossDomains
|
danielebarchiesi@2
|
73 * All cross domain hostnames as JS array.
|
danielebarchiesi@2
|
74 *
|
danielebarchiesi@2
|
75 * @return boolean
|
danielebarchiesi@2
|
76 */
|
danielebarchiesi@2
|
77 function isCrossDomain(hostname, crossDomains) {
|
danielebarchiesi@2
|
78 /**
|
danielebarchiesi@2
|
79 * jQuery < 1.6.3 bug: $.inArray crushes IE6 and Chrome if second argument is
|
danielebarchiesi@2
|
80 * `null` or `undefined`, http://bugs.jquery.com/ticket/10076,
|
danielebarchiesi@2
|
81 * https://github.com/jquery/jquery/commit/a839af034db2bd934e4d4fa6758a3fed8de74174
|
danielebarchiesi@2
|
82 *
|
danielebarchiesi@2
|
83 * @todo: Remove/Refactor in D8
|
danielebarchiesi@2
|
84 */
|
danielebarchiesi@2
|
85 if (!crossDomains) {
|
danielebarchiesi@2
|
86 return false;
|
danielebarchiesi@2
|
87 }
|
danielebarchiesi@2
|
88 else {
|
danielebarchiesi@2
|
89 return $.inArray(hostname, crossDomains) > -1 ? true : false;
|
danielebarchiesi@2
|
90 }
|
danielebarchiesi@2
|
91 }
|
danielebarchiesi@2
|
92
|
danielebarchiesi@2
|
93 })(jQuery);
|