/**
* A tracker for first- and multi-touch tracking using Google Analytics. In 
* addition, the script also tracks time-to-conversion. Further reading at
* http://weblog.scanyours.com/2010/06/23/multi-touch-conversion-tracking-with-google-analytics-part-3-implementation/
*
* Please keep this header intact when distributing.
*
* @author     A.G. Gideonse
* @version    0.1
* @license    GNU General Public License (GPL)
* @copyright  ScanYours 2010
*/
var Tracert = Tracert ? Tracert : {

   // Initializes Multi-Touch / Time-To-Conversion tracking
   init : function() {
      return Tracert._track();
   },

   // METHOD :: Returns the current referrer
   _getSource : function() {

      var regex = /^((\w+):\/\/\/?)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#;\|]+)?([;\|])?([^\?#]+)?\??([^#]+)?#?(\w*)/;
      var referrer = '(direct)';

      if (document.referrer) {

          referrer = document.referrer.replace(regex, '$6');
          
          // Internal referal (same host)
          if (referrer == window.location.host) {
             return false;
          }

          // Google (organic)
          var regex = /[a-z0-9\-\.]+\.google\.[a-zA-Z]{2,3}/i;
          if (regex.test(referrer)) {

             referrer = 'Google';
             if (Tracert._getParameter('url').substr(1, 4) == 'aclk') {
                referrer = 'Google_adwords';
             }
          }
      }

      return referrer;
   },
   
   // METHOD :: Actual tracking of the data
   _track : function(referrer) {

      var referrer = Tracert._getSource();
      if (!referrer) {
         return false;
      }

      // Calculate Time-To-Conversion
      var timeToConversion = 0;
      var currentTouch = Math.round(new Date().getTime() / 1000);

      if (pageTracker._getVisitorCustomVar(1)) {

         var firstTouch = parseInt(Tracert.readCookie('firstTouch'));

         if (firstTouch) {
            timeToConversion = Math.round((currentTouch - firstTouch) / 3600);
         }

      }

      // Save Time-To-Conversion (as String to track zero)
      timeToConversion = String(timeToConversion);
      pageTracker._setCustomVar(3, 'time-to-conversion', timeToConversion, 1);      
      
      // Save original source (first-touch)
      if (!pageTracker._getVisitorCustomVar(1)) {
         pageTracker._setCustomVar(1, 'ref-origin', referrer, 1);
         Tracert.createCookie('firstTouch', currentTouch, 180);
      }

      // Save assisting source (new)
      if (!pageTracker._getVisitorCustomVar(2)) {
         pageTracker._setCustomVar(2, 'ref-route', referrer, 1);
         return true;
      }

      // Skip assisting source (already-in-route)
      var cRoute = pageTracker._getVisitorCustomVar(2).split('~');
      if (cRoute.find(referrer) != -1) {
         return false;
      }

      // Save assisting source (new-in-route)
      cRoute[cRoute.length] = referrer;
      if (cRoute.join('~').length > 55) {
         return false;
      }

      cRoute.sort();
      pageTracker._setCustomVar(2, 'ref-route', cRoute.join('~'), 1);
   },

   // METHOD :: Returns the requested GET-parameter
   _getParameter : function(p) {
      var regex  = new RegExp('[\\?&]' + p + '=([^&#]*)');
      var result = regex.exec(document.referrer);
      return (result == null) ? '' : result[1];
   },

   // METHOD :: Utility method to add events
   addListener : function(el, type, expression) {

      // Add event (FF & other)
      if (window.addEventListener) {
         el.addEventListener(type, expression, false);
         return true;
      }

      // Add event (IE)
      if (window.attachEvent) {
         el.attachEvent('on' + type, expression);
        return true;
      }

      return false;
   },

   // METHOD :: Write a cookie
   // SOURCE: http://www.quirksmode.org/ (and many others)
   createCookie : function(name, value, days) {
	   if (days) {
		   var date = new Date();
		   date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		   var expires = '; expires=' + date.toGMTString();
	   } else {
	      var expires = '';
	   }

	   document.cookie = name + '=' + value + expires + '; path=/';
   },
   
   // METHOD :: Read a cookie
   // SOURCE: http://www.quirksmode.org/ (and many others)
   readCookie : function(name) {

	   var nameEQ = name + "=";
	   var ca = document.cookie.split(';');

	   for(var i = 0; i < ca.length; i++) {

		   var c = ca[i];
		   while (c.charAt(0)==' ') {
		      c = c.substring(1, c.length);
		   }
		   
		   if (c.indexOf(nameEQ) == 0) {
		      return c.substring(nameEQ.length, c.length);
		   }

	   }

	   return 0;
   }

}
Tracert.addListener(window, 'load', Tracert.init);

// METHOD :: Adds search functionality to Arrays
Array.prototype.find = function (element) {

   for (var keys in this) {
      if (this[keys] == element) {
         return keys;
      }
   }

   return -1;
};
