diff --git a/_includes/layout/base/footer-js.html b/_includes/layout/base/footer-js.html
index 893a8f41..9180cbc7 100644
--- a/_includes/layout/base/footer-js.html
+++ b/_includes/layout/base/footer-js.html
@@ -6,7 +6,7 @@ http://opensource.org/licenses/MIT.
{% comment %}
diff --git a/js/base.js b/js/base.js
index fc778401..5e9f7cd0 100644
--- a/js/base.js
+++ b/js/base.js
@@ -205,3 +205,75 @@ function addAnchorLinks() {
nodes[i].insertBefore(anc, nodes[i].firstChild);
}
}
+
+ function _gaLt(event) {
+
+ /* If GA is blocked or not loaded, or not main|middle|touch click then don't track */
+ if (!ga.hasOwnProperty("loaded") || ga.loaded != true || (event.which != 1 && event.which != 2)) {
+ return;
+ }
+
+ var el = event.srcElement || event.target;
+
+ /* Loop up the DOM tree through parent elements if clicked element is not a link (eg: an image inside a link) */
+ while (el && (typeof el.tagName == 'undefined' || el.tagName.toLowerCase() != 'a' || !el.href)) {
+ el = el.parentNode;
+ }
+
+ /* if a link with valid href has been clicked */
+ if (el && el.href) {
+
+ var link = el.href;
+
+ /* Only if it is an external link */
+ if (link.indexOf(location.host) == -1 && !link.match(/^javascript\:/i)) {
+
+ /* Is actual target set and not _(self|parent|top)? */
+ var target = (el.target && !el.target.match(/^_(self|parent|top)$/i)) ? el.target : false;
+
+ /* Assume a target if Ctrl|shift|meta-click */
+ if (event.ctrlKey || event.shiftKey || event.metaKey || event.which == 2) {
+ target = "_blank";
+ }
+
+ var hbrun = false; // tracker has not yet run
+
+ /* HitCallback to open link in same window after tracker */
+ var hitBack = function() {
+ /* run once only */
+ if (hbrun) return;
+ hbrun = true;
+ window.location.href = link;
+ };
+
+ if (target) { /* If target opens a new window then just track */
+ ga(
+ "send", "event", "Outgoing Links", link,
+ document.location.pathname + document.location.search
+ );
+ } else { /* Prevent standard click, track then open */
+ event.preventDefault ? event.preventDefault() : event.returnValue = !1;
+ /* send event with callback */
+ ga(
+ "send", "event", "Outgoing Links", link,
+ document.location.pathname + document.location.search, {
+ "hitCallback": hitBack
+ }
+ );
+
+ /* Run hitCallback again if GA takes longer than 1 second */
+ setTimeout(hitBack, 1000);
+ }
+ }
+ }
+}
+
+function trackOutgoingLinks() {
+ var _w = window;
+ /* Use "click" if touchscreen device, else "mousedown" */
+ var _gaLtEvt = ("ontouchstart" in _w) ? "click" : "mousedown";
+ /* Attach the event to all clicks in the document after page has loaded */
+ _w.addEventListener ? _w.addEventListener("load", function() {document.body.addEventListener(_gaLtEvt, _gaLt, !1)}, !1)
+ : _w.attachEvent && _w.attachEvent("onload", function() {document.body.attachEvent("on" + _gaLtEvt, _gaLt)});
+ }
+}