mixpanel tracker

by John Allan

HTML

<script src="https://www.resaas.com/assets/common/js/vendor/q/q.js"></script>
<div id="html" data-mixpanel-guid="123456" data-mixpanel-content_subtype="buyer need">
  <a href="#" class="btn2" data-mixpanel-name="Intent" data-mixpanel-type="share" data-mixpanel-from="lead detail" data-mixpanel-leadtype="buyer need" context="public" source="7fdsa8089pq4uih5asd6asap8ruh6oa7sjf">Ajax</a>

  <br>
  <a id="testLink" href="/some/link" class="btn2" data-mixpanel-name="Intent" data-mixpanel-type="share" data-mixpanel-from="lead detail" data-mixpanel-leadtype="buyer need" context="public" source="7fdsa8089pq4uih5asd6asap8ruh6oa7sjf">Link</a>

  <br>
  
  <a id="testLink" href="http://www.google.com" class="btn2" target="_blank" data-mixpanel-name="Intent" data-mixpanel-type="share" data-mixpanel-from="lead detail" data-mixpanel-leadtype="buyer need" context="public" source="7fdsa8089pq4uih5asd6asap8ruh6oa7sjf">Open New Window</a>
  
  <br>
  
  <a href="#">Nothing</a>
</div>

JavaScript

var globalData;

function trackEvent(name, data, url) {
	console.log('trackEvent(', name, ', ', JSON.stringify(data), ', ', url, ');');
};

function trackEventPromise(name, data) {
	var d = Q.defer();
  
  mixpanel.track(name, data, function () {
  	d.resolve('mixpanel request complete');
  });
  
  setTimeout(function () {
  	d.reject(new Error("mixpanel request timed out"));
  }, 1000);
  
  return d.promise;
};

function isLink(href) {
	if (
  	typeof href === 'string'
  	&& href !== ''
		&& href !== '#'
    && href.indexOf('javascript:') !== 0
  ) {
  	return true;
  }
  
  return false;
};

function getMixpanelData (element) {
	var mpObj, attrs, attrPrefix, attrPrefixLength, i, l;
  
  attrPrefix = 'data-mixpanel-';
  attrPrefixLength = attrPrefix.length;
  
  if (typeof element === 'undefined' || typeof element === null) {
  	return false;
  }
  
  if (typeof element === 'string') {
  	element = document.querySelector(element);
  }
  
  mpObj = false;
  attrs = element.attributes;
  
  //look at all element attributes
  for(i = 0, l = attrs.length; i < l; i++) {
  	//if element attribute matches data-mixpanel add to the mixpanel object
    if (attrs[i].name.indexOf(attrPrefix) === 0) {
    	if (!mpObj) { mpObj = {}; }
    	mpObj[attrs[i].name.substr(attrPrefixLength)] = attrs[i].value
    }
  }
  
  return mpObj;
};

globalData = getMixpanelData('#html');

document.querySelector('#testLink').addEventListener('click', function () {
	console.log('other event binding');
});

document.querySelector('#html').addEventListener('click', function (e) {
	var mpObj, href, target, redirect, i, l; 

  mpObj = {};
  href = false;
  
  //get mixpanel data
  mpObj = getMixpanelData(e.target);
  
  //not mixpanel, exit
  if (!mpObj['name']) {
  	return;
  }
  
  //capture the href if it is a link
	if (isLink(e.target.getAttribute('href'))) {
		href = e.target.getAttribute('href');
    target = e.target.getAttribute('target');
	}
  
  //if href is set and not opening a new...