// Copyright 2011 Google Inc. All Rights Reserved.

/**
 * @fileoverview A simple script to automatically track Facebook and Twitter
 * buttons using Google Analytics social tracking feature.
 * @author api.nickm@google.com (Nick Mihailovski)
 */

/**
 * Namespace.
 * 
 * @type {Object}.
 */
var _ga = _ga || {};

/**
 * Ensure global _gaq Google Anlaytics queue has be initialized.
 * 
 * @type {Array}
 */
var _gaq = _gaq || [];

/**
 * Helper method to track social features. This assumes all the social scripts /
 * apis are loaded synchronously. If they are loaded async, you might need to
 * add the nextwork specific tracking call to the a callback once the network's
 * script has loaded.
 * 
 * @param {string}
 *          opt_pageUrl An optional URL to associate the social tracking with a
 *          particular page.
 * @param {string}
 *          opt_trackerName An optional name for the tracker object.
 */
_ga.trackSocial = function(opt_pageUrl, opt_trackerName) {
	_ga.trackFacebook(opt_pageUrl, opt_trackerName);
	_ga.trackTwitter(opt_pageUrl, opt_trackerName);
};

/**
 * Tracks Facebook likes, unlikes and sends by suscribing to the Facebook JSAPI
 * event model. Note: This will not track facebook buttons using the iFrame
 * method.
 * 
 * @param {string}
 *          opt_pageUrl An optional URL to associate the social tracking with a
 *          particular page.
 * @param {string}
 *          opt_trackerName An optional name for the tracker object.
 */
_ga.trackFacebook = function(opt_pageUrl, opt_trackerName) {
	var trackerName = _ga.buildTrackerName_(opt_trackerName);
	try {
		if (FB && FB.Event && FB.Event.subscribe) {
			FB.Event.subscribe('edge.create', function(targetUrl) {
				_gaq.push([ trackerName + '_trackSocial', 'facebook', 'like',
						document.location.origin, document.location.pathname // targetUrl,
																																	// opt_pageUrl
				]);
			});
			FB.Event.subscribe('edge.remove', function(targetUrl) {
				_gaq.push([ trackerName + '_trackSocial', 'facebook', 'unlike',
						document.location.origin, document.location.pathname // targetUrl,
																																	// opt_pageUrl
				]);
			});
			FB.Event.subscribe('message.send', function(targetUrl) {
				_gaq.push([ trackerName + '_trackSocial', 'facebook', 'send',
						document.location.origin, document.location.pathname // targetUrl,
																																	// opt_pageUrl
				]);
			});
		}
	} catch (e) {
	}
};

/**
 * Returns the normalized tracker name configuration parameter.
 * 
 * @param {string}
 *          opt_trackerName An optional name for the tracker object.
 * @return {string} If opt_trackerName is set, then the value appended with a .
 *         Otherwise an empty string.
 * @private
 */
_ga.buildTrackerName_ = function(opt_trackerName) {
	return opt_trackerName ? opt_trackerName + '.' : '';
};

/**
 * Tracks everytime a user clicks on a tweet button from Twitter. This
 * subscribes to the Twitter JS API event mechanism to listen for clicks coming
 * from this page. Details here:
 * http://dev.twitter.com/pages/intents-events#click This method should be
 * called once the twitter API has loaded.
 * 
 * @param {string}
 *          opt_pageUrl An optional URL to associate the social tracking with a
 *          particular page.
 * @param {string}
 *          opt_trackerName An optional name for the tracker object.
 */
_ga.trackTwitter = function(opt_pageUrl, opt_trackerName) {
	var trackerName = _ga.buildTrackerName_(opt_trackerName);
	try {
		if (twttr && twttr.events && twttr.events.bind) {
			twttr.events.bind('tweet', function(event) {
				if (event) {
					var targetUrl; // Default value is undefined.
					if (event.target && event.target.nodeName == 'IFRAME') {
						targetUrl = _ga.extractParamFromUri_(event.target.src, 'url');
					}
					_gaq.push([ trackerName + '_trackSocial', 'twitter', 'tweet',
							document.location.origin, document.location.pathname // targetUrl,
																																		// opt_pageUrl
					]);
				}
			});
		}
	} catch (e) {
	}
};

/**
 * Extracts a query parameter value from a URI.
 * 
 * @param {string}
 *          uri The URI from which to extract the parameter.
 * @param {string}
 *          paramName The name of the query paramater to extract.
 * @return {string} The un-encoded value of the query paramater. underfined if
 *         there is no URI parameter.
 * @private
 */
_ga.extractParamFromUri_ = function(uri, paramName) {
	if (!uri) {
		return;
	}
	var uri = uri.split('#')[0]; // Remove anchor.
	var parts = uri.split('?'); // Check for query params.
	if (parts.length == 1) {
		return;
	}
	var query = decodeURI(parts[1]);

	// Find url param.
	paramName += '=';
	var params = query.split('&');
	for ( var i = 0, param; param = params[i]; ++i) {
		if (param.indexOf(paramName) === 0) {
			return unescape(param.split('=')[1]);
		}
	}
	return;
};

