
/**
 * @class Page Load Tracking component.
 *     This class encapsulates all logic for page load time tracking on a particular
 *     page. 
 *
 * @param {String} arg1 Variable name of the Google Analytics tracking object used on the page
 * @param {String} arg2 Optional page name of index page
 * @param {Number} arg3 Optional start time specified by user
 * @constructor
 */
 
var PageLoadTracker = function(GATrackerObj, defaultPage, startTime) {
	this.GATrackerObj_ = GATrackerObj;
	this.defaultPage_ = defaultPage;
	this.timeTracker_ = new TimeTracker(PageLoadTracker.DEFAULT_BUCKET);
	this.timeTracker_._recordStartTime(startTime);
};

PageLoadTracker.prototype.GATrackerObj_;
PageLoadTracker.prototype.defaultPage_;
PageLoadTracker.prototype.timeTracker_;
PageLoadTracker.DEFAULT_BUCKET = [1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500, 7000, 7500, 8000, 9000, 10000, 15000, 20000];

/**
  *  Determines what page name to send as the event label, and sends the event tracking request
  */
PageLoadTracker.prototype.track = function () {
	
	var GATrackerObj = null;
	var pageName = "";
	
	if (window.location.pathname.search(/\/$/) >= 0)
		pageName = window.location.pathname + this.defaultPage_;
	else
		pageName = window.location.pathname;
	
	if (window[this.GATrackerObj_] != 'undefined')
		GATrackerObj = window[this.GATrackerObj_];
	else if (document[this.GATrackerObj_] != 'undefined')
		GATrackerObj = document[this.GATrackerObj_];
	
	if (GATrackerObj != null && typeof GATrackerObj == 'object') {
		try {
			this.timeTracker_._recordEndTime();
			this.timeTracker_._track(GATrackerObj, 'Page Load Times', pageName);
		} catch (e) {}
	}
};

/**
  *  Adds event handler for specified event to an element
  *  
  *  @param	element	Element to add event listener to
  *  @param	type		Event to listen for.  Do not prepend event with 'on', as the functions automatically prepends it
  *  @param	expression	Javascript function to execute on event.  Can be either a function name or anonymous function
  *  @param	bubbling	Sets whether to register the event on bubbling phase (true) or capturing phase (false).  Only applies to W3C compliant browsers.
  *  @return			True on success, false on failure
  */
function addListener (element, type, expression, bubbling) {
	bubbling = bubbling || false;
	
	if(window.addEventListener) { // Standard
		element.addEventListener(type, expression, bubbling);
		return true;
	} else if(window.attachEvent) { // IE
		element.attachEvent('on' + type, expression);
		return true;
	} else return false;
}

