function Tracker() 
{
  var that = this;
  var body = document.getElementsByTagName('body')[0];
  var host = location.hostname;

  this.tests = [
    { internal: true,  regexp: /^mailto/,                            category: 'mailto',   label: 'email' },
    { internal: false, regexp: /^http/,                              category: 'external', label: 'url' },
    { internal: true,  regexp: /\.(pdf|zip|doc|xls)(\?.*)?(\#.*)?$/, category: 'download', label: 'url' }
  ];

  function getHref( href ) {
    return href;
  }

  function getLocation( href )
  {
    return href.substr(href.indexOf(':') + 1);
  }

  function trackLink( e )
  {
    if( !e ) var e = window.event;

    var target = window.event ? e.srcElement : e.target;
    
    if( target.nodeName != 'A' ) return true;

    for( test in that.tests ) 
    {
      if( that.tests[test].regexp.test( target.href ) )
      {
        if( !that.tests[test].internal && target.hostname == host ) continue; 
        _gaq.push(['_trackEvent', that.tests[test].category, that.tests[test].label, target.href])
        break;
      }
    }
  }

  if( body.addEventListener )
    body.addEventListener( 'click', trackLink, false );
  else if( body.attachEvent )
    body.attachEvent( 'onclick', trackLink );
  else
    return false;

  this.addTest = function(pattern, category, label, internal)
  {
    that.tests.unshift({internal: internal, regexp: new RegExp(pattern), category: category, label: label});
  }
};
