var Tracert = Tracert ? Tracert : {

   init : function() {
      return Tracert._track();
   },

   _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 (AdWords)';
             if (Tracert._getParameter('source') == 'web') {
                referrer = 'Google (organic)';
             }
          }
      }

      return referrer;
   },

   _track : function(referrer) {

      var referrer = Tracert._getSource();
      if (!referrer) {
         return false;
      }

      // Track only unique sources
      for (var i = 1; i <= 5; i++) {
         if (pageTracker._getVisitorCustomVar(i) == referrer) {
            return false;
         }
      }

      // Original source
      if (!pageTracker._getVisitorCustomVar(1)) {
         pageTracker._setCustomVar(1, 'ref-o', referrer, 1);
         return true;
      }

      // Assisting source
      for (var i = 2; i <= 5; i++) {
         if (!pageTracker._getVisitorCustomVar(i)) {
            pageTracker._setCustomVar(i, 'ref-a', referrer, 1);
            return true;
         }
      }

      return false;
   },

   _getParameter : function(p) {
      var regex  = new RegExp('[\\?&]' + p + '=([^&#]*)');
      var result = regex.exec(document.referrer);
      return (result == null) ? '' : result[1];
   },

   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;
   }

}
Tracert.addListener(window, 'load', Tracert.init);
