// JavaScript Document
var analytics = function() {
	// these are the internal variables based on omniture. they will need to be 
	// expanded upon as more analytic services are added.
	var parameters = {
		pageName: '',
		server: '',
		channel: '',
		pageType: '',
		properties: {},
		campaign: '',
		state: '',
		zip: '',
		events: '',
		products: '',
		purchaseID: '',
		eventVars: {},
		linkTrackEvents: '',
		linkTrackVars: 'None',
		linkTrackType: 'o',
		linkTrackName: 'Internal Campaign Click'
	};

	/**
	 * Function to send data to analytics.
	 */
	function sendPageView() {
		// send tag to analytics providers
		mapParams(parameters);
		$A(providers).invoke('sendPageView');
		//console.info("sendPageView:" + $H(parameters).toJSON());
	}
	
	function sendEvent() {
		// this makes a deep copy of current parameters
		var temp = Object.clone(parameters), $providers = $A(providers);
		temp.properties = Object.clone(parameters.properties);
		temp.eventVars = Object.clone(parameters.eventVars);
		
		$providers.invoke('mapParams', Object.extend(temp, arguments[0]));
		$providers.invoke('sendEvent');
		$providers.invoke('mapParams', parameters);
		//console.info("sendEvent:" + $H(parameters).toJSON());
	}
	
	function sendTrackingLink() {
		//console.group();
		var temp = Object.clone(parameters), $providers = $A(providers);
		temp.properties = Object.clone(parameters.properties);
		temp.eventVars = Object.clone(parameters.eventVars);
		temp.pageName = '';
		
		$providers.invoke('mapParams', Object.extend(temp, arguments[0]));
		//console.info("sendTrackingLink object: " + $H(temp).toJSON());
		//console.info("current contents of s object: ");
		//console.dir(s);
		$providers.invoke('sendTrackingLink', Object.extend(temp, arguments[0]));
		$providers.invoke('mapParams', parameters);
		//console.groupEnd();
	}

	/**
	 * Function that writes the generic params to the provider 
	 */
	function mapParams(paramsArg) {
		$A(providers).invoke('mapParams', paramsArg);
	}
	
	function set() {
		Object.extend(parameters, arguments[0]);
		mapParams(parameters);
	}
	
	/**
	 * Hash of parameters.
	 */
	var providers = [
		{
			provider: 'Omniture',			
			sendPageView: function() {
				s.t();
			},
			sendEvent: function() {
				s.t();
			},
			sendTrackingLink: function(trackParams) {
				//console.log('calling s.tl')
				s.tl(s, trackParams.linkTrackType, trackParams.linkTrackName);
			},
			mapParams: function(paramsArg) {

				s.pageName = paramsArg.pageName || '';
				s.server = paramsArg.server || '';
				s.channel = paramsArg.channel || '';
				s.pageType = paramsArg.pageType || '';
				s.campaign = paramsArg.campaign || '';
				s.state = paramsArg.state || '';
				s.zip = paramsArg.zip || '';
				s.events = paramsArg.events || '';
				s.products = paramsArg.products || '';
				s.purchaseID = paramsArg.purchaseID || '';
				s.linkTrackVars = paramsArg.linkTrackVars || '';
				s.linkTrackEvents = paramsArg.linkTrackEvents || 'None';
				s.linkTrackType = paramsArg.linkTrackType || 'o';
				s.linkTrackName = paramsArg.linkTrackName || 'Internal Campaign Click';

				
				// set the channel to the appropriate language for tagging
				if (TMSSite.i18n[TMSSite.lang].pageName) {
					s.channel = s.channel.sub(/^GM/, TMSSite.i18n[TMSSite.lang].pageName);
					s.pageName = s.pageName.sub(/^GM/, TMSSite.i18n[TMSSite.lang].pageName);
				}

				// wipe out existing values of properties and eVars
				for (var i = 1; i<=50; i++) {
					s['prop' + i] = '';
					s['eVar' + i] = '';
				}
				
				$H(paramsArg.properties).each(
					function(pair) {
						s['prop' + pair.key] = pair.value;
					}
				);
				
				// this is a hardcoded business logic rule that has to fire when pageName is set
				if (paramsArg.pageName && paramsArg.pageName.length > 0) {
					var pairs = paramsArg.pageName.split(" : ");
					//s.prop10 = pairs[0];
					//s.prop11 = pairs[0] + " : " + pairs[1];
					s.prop10 = "GM : Minisite";
					s.prop11 = "GM : Tundra : Minisite";
				}
				
				$H(paramsArg.eventVars).each(
					function(pair) {
						s['eVar' + pair.key] = pair.value;
					}
				);
			}
		}
	];
			
	
	return {
		sendPageView: sendPageView,
		sendEvent: sendEvent,
		sendTrackingLink: sendTrackingLink,
		set: set
	};
}();
TMSSite.analytics = analytics;