// Copyright 2010 Google Inc.  All Rights Reserved.

/**
 * @fileoverview Autotracking scriptlet allowing tracking of all A tags on page.
 * @author rbreheny (Rupert Breheny)
 */



/**
 * Initialize namespaces.
 */
var gweb = gweb || {};
var _gaq = _gaq || [];
gweb.analytics = gweb.analytics || {};



/**
 * Constructor for AutoTrack object.
 * @param {object} config An object with configuration parameters.
 *     profile: Analytics profile.
 *     tracklinks: Boolean to trigger tracking of all page links.
 *     prefix: Prefix string for Analytics description.
 * @constructor
 */
gweb.analytics.AutoTrack = function(config) {
	if (!document.createElement) {return false;}
	gweb.analytics.AutoTrack.stProfile = config.profile;
	gweb.analytics.AutoTrack.stPrefix = (config.prefix ? config.prefix : '');
	gweb.analytics.AutoTrack.stPrefixAnalytics = (config.prefixAnalytics ? config.prefixAnalytics : '');
	gweb.analytics.AutoTrack.stPrefixClassname = (config.prefixClassname ? config.prefixClassname : '');
	gweb.analytics.AutoTrack.rgProtocols = /^(https?:\/\/|mailto:)(.*)/;
	this.setupTrack();
	if (config.tracklinks) {this.fnTagLinks();}
};



/**
 * Function to inject Analytics javascript.
 */
gweb.analytics.AutoTrack.prototype.setupTrack = function() {
	_gaq.push(
		['_setAccount', 'UA-' + gweb.analytics.AutoTrack.stProfile],
		['_setCookiePath', location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1)],
		['_setAllowAnchor', true],
		['_trackPageview', gweb.analytics.AutoTrack.stPrefixAnalytics + location.pathname]
	);
	(function() {
		var ga = document.createElement('script');
		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
		ga.setAttribute('async', 'true');
		document.documentElement.firstChild.appendChild(ga);
	})();
};



/**
 * Function to cycle through page links and attach click events.
 */
gweb.analytics.AutoTrack.prototype.fnTagLinks = function() {
	var arLinks = document.getElementsByTagName('a');
	for (var i = 0, link; link = arLinks[i]; i++) {
		if (link.getAttribute('href') && link.className.indexOf(gweb.analytics.AutoTrack.stPrefixClassname + 'notrack') == -1) {
			this.addEvent(link, 'click', this.handleClick);
		}
	}
};



/**
 * Function to be called when a link is clicked.
 */
gweb.analytics.AutoTrack.prototype.handleClick = function() {
	var stTracking = this.getAttribute('href');
	if (this.className.indexOf(gweb.analytics.AutoTrack.stPrefixClassname) != -1) {
		stTracking = this.className.split(gweb.analytics.AutoTrack.stPrefixClassname)[1].split(' ')[0];
	}	else if (stTracking.match(gweb.analytics.AutoTrack.rgProtocols)) {
		stTracking = gweb.analytics.AutoTrack.rgProtocols.exec(stTracking)[2];
	}
	stTracking = gweb.analytics.AutoTrack.stPrefixAnalytics + stTracking;
	_gaq.push(['_trackEvent', 'link', 'clicked_links', stTracking]);
};



/**
 * Handler for clicking on an element.
 * @param {object} obj The item to select.
 * @param {object} type The event object.
 * @param {object} fn The function to attach.
 */
gweb.analytics.AutoTrack.prototype.addEvent = function(obj, type, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(type,fn,false);
	} else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() {obj["e"+type+fn](window.event);};
		obj.attachEvent("on"+type,obj[type+fn]);
	} else {
		obj["on"+type] = obj["e"+type+fn];
	}
};

