/**
 * TRACKING MODULE
 * @description: Tracking implementation for page level and click event tracking.
 * @requires: /nikeos/global/js/jquery.cookie.js, /nikeos/global/js/ppk.browser.js, tracking.html include fragment (to define sitewide_tracker_object and tracker_obj)
 * @see: siteConfig.xml, pageConfig_PAGENAME.xml for xml > freemarker > javascript variable implementation
 * * * * * * * * * * * * * * * * * * * * * * * * * *
 	- 	04/11/2010, s_code.js has been updated from h.15 => h.21.  
 		Anything with "D=*" in Charles is not a tracking error.
 		Main example is "eVar48" always being set to "D=pageName".
 * * * * * * * * * * * * * * * * * * * * * * * * * *
 */

var tracking,s_account,s_currencyCode,s_charSet;
var protocol = (location.protocol == 'https:') ? 'https://' : 'http://';
function init_tracking()
{	
	tracking = new DaleWarth();
}

/**
 * DALEWARTH
 * @description: Class used to track page views and click events.
 * @constructor
 * @param s_charSet {String}: Omniture character set (set in tracking.html - sitewide_tracker_obj)
 * @param s_account {String}: Omniture account code (set in tracking.html - sitewide_tracker_obj)
 * @param s_currencyCode {String}: Omniture currency code (set in tracking.html - sitewide_tracker_obj)
 ** HTML/Javascript methods
 * @method sanitizeTracking(Object/String): cleans up tracking values so that '>' aren't doubled up
 * @method init(): doms in s_code.js file, sets logged in status/id, modifies Omniture "s" object, and calls initial page tracking call
 * @method click(Object/String): fires a page-level tracking call. Takes a hash of name/value pairs of Omniture props or a string. If passed a string, it will replace the pageName prop.
 * 		@example: tracking.click("Nike Prototype Link Clicked");
 * 		@example: tracking.click({pageName:"Nike Prototype Link Clicked", prop21:"value"});
 * @method click_track(String, String): fires an event-level click tracking call. This should only be called in the onclick event of an anchor. Pass the name of the link and type of track ('o':custom, 'e':exit, 'd':download)
 * @deprecated @method flash(Object): stringifies a json object to be passed to flash for flash swf-based tracking.
 ** FLASH methods (to be called using flash.external.ExternalInterface)
 * @method track(Object/String): fires a page-level tracking call. Removes any s.props assigned by the page_tracker_obj before firing call. Takes a hash of name/value pairs of Omniture props or a string. If passed a string, it will replace the pageName prop.
 * @method trackClick(Object): fires an event-level click tracking call. Takes a hash of name/value pairs of Omniture props or a string. If passed a string, it will replace the pageName prop. All s props are then reverted to previous values, in case a link track event remains on the same page.
 */

function DaleWarth()
{
	var self = this;
	
	/* 
		will need a better solution than hardcoding these values 
		but will work for now
	*/
	var blog_urls = /^(cs|inside\-staging|inside)\./i;
	var env_url_map = {
		'cs': 'nike-dev4.ny.rga.com',
		'inside-staging': 'ecn10-www.nike.com',
		'inside': 'www.nike.com',
		'default': location.host	
	};

	function sanitizeTracking(varName) {
		if (typeof varName != 'undefined') return varName.replace(/>+/g,'>');
	}
	function returnSitePrefix() {
		var prefix = (typeof window.nav_tracker_obj.prefix == 'undefined') ? '' : nav_tracker_obj.prefix;
		return (typeof window.track_site == 'undefined') ? prefix : track_site;
	}
	self.init = function(){
		
		// find host, if no match, use default in array
		var host = location.host.match(blog_urls) || ['', 'default'];
		var src = protocol + env_url_map[host[1]] + '/nikeos/global/js/s_code.js';
		self.tracking_wrapper = JQ('<div class="hidden_tracking_wrapper" />').appendTo('body');
		
		//define site tracking constants -- these have to be defined as globals, but change them here:
		s_account = sitewide_tracker_obj.account;
		s_currencyCode = sitewide_tracker_obj.currency;
		s_charSet = sitewide_tracker_obj.charset;
		
		//set Logged in status & id
		self.logged_in_status = 'not logged in';
		self.logged_in_id = '';
		self.setLoggedInStatus();
		//dom in js file
		self.s_js = document.createElement('script');
		// dev testing, change following line to: ... location.host + '/nikeos/global/js/s_code.js'
		// for hardcoding: ... 'www.nike.com/nikeos/global/js/s_code.js';
		self.s_js.src = src;//'www.nike.com/nikeos/global/js/s_code.js';
		self.s_js.onload = self.load_tracker_obj;
		self.s_js.onreadystatechange = self.check_load_tracker_obj;
		//if (document.body) document.body.appendChild(self.s_js);
		document.getElementsByTagName('head')[0].appendChild(self.s_js);	// -- now appending to head so its not accidently overwritten...
	};
	self.check_load_tracker_obj = function(){
		if (self.s_js.readyState == 'loaded' || self.s_js.readyState == 'complete')
			self.load_tracker_obj();
	};
	self.load_tracker_obj = function(){
		if (!window.tracker_obj || !window.s){
			return;
		}
		//loop through `tracker_obj` and append these to the s object
		for(var p in tracker_obj){
			switch(tracker_obj[p]){
				case "FLASH_VERSION":
					s[p]=getFlashVersion();
				break;
				case "LOGGED_IN_STATUS":
					s[p]=self.logged_in_status;
				break;
				case "LOGGED_IN_ID":
					if (self.logged_in_id != ''){
						s[p]=self.logged_in_id;
					}
				break;
				default:
					s[p]=tracker_obj[p];
				break;
			}
		};
		if (typeof page_tracker_obj != 'undefined'){
			for(var p in page_tracker_obj){	
				//Site Source tracking
				if (page_tracker_obj[p] == 'SITESRC'){
					if (JQ.getURLParam('sitesrc')){
						s[p] = JQ.getURLParam('sitesrc');
					}
				} else {
					s[p]=page_tracker_obj[p];
				}
			}
		};
		if (typeof s.eVar48 == 'undefined') {
			if (s.pageName) s.eVar48 = s.pageName;
		}
		
		// check to make sure prefix is separated
		if (s.pageName) {
			if (s.pageName.match(/>/) == null) {
				if (s.pageName.match(track_site)) {
					var tmpPage = s.pageName.split(track_site);
					s.pageName = track_site + '>' + tmpPage[1];
				}
			}
		}
		// make sure track_site value has '>' for later usage.
		// value will be cleaned up before it gets passed to tracking
		if (window.track_site) {
			if (track_site.match(/>/) == null) track_site += '>';
		}

		// do a check to make sure any multiple > are reduced to one only
		if (s.pageName) s.pageName = sanitizeTracking(s.pageName);
		if (s.eVar48) s.eVar48 = sanitizeTracking(s.eVar48);if (typeof s.events == 'undefined') {
			s.events = 'event13';
		}

		if (typeof s.events == 'undefined') {
			s.events = 'event13';
		} else {
			var hasEvent = s.events.match('event13');
			if (hasEvent == null) s.events += ', event13';
		}
		if (typeof s.do_not_call == 'undefined') s.t();
		if (s_code) self.tracking_wrapper.append(s_code);
	};
	self.click = function(desc){
		if (!window.s){
			setTimeout(function(){
				self.click(desc);
			}, 100);
			return;
		}
		if (typeof desc == 'string'){
			desc = sanitizeTracking(desc);
			s.t({pageName:desc,eVar48:desc});
		}
		else if (typeof desc == 'object'){
			desc.pageName = sanitizeTracking(desc.pageName);
			desc.eVar48 = desc.pageName;
			//desc.prop3 = desc.pageName;
			if (desc.eVar12 == 'tout') {
				desc.eVar13 = desc.pageName;
			}
			s.t(desc);
		}
	};
	self.click_track = function(name,type){
		if (!window.s) return;
		s.tl(this,type || 'o',name);
	};
	self.track = function(desc){
		var site_prefix = returnSitePrefix();
		
		if (!window.s) return;
		if (typeof page_tracker_obj == 'object'){
			for(var i in page_tracker_obj){
				delete s[i];
			}
		}
		delete s.prop3;
		if (typeof desc == 'string'){
			if ((desc.split('>')[0] != site_prefix)){
				desc = site_prefix + desc;
			}
			desc = sanitizeTracking(desc);
			s.t({pageName:desc,eVar48:desc});
		} else if (typeof desc == 'object'){
			for(var i in desc){
				if ((i == 'pageName' || i == 'eVar48') && (desc[i].split('>')[0] != site_prefix)){
					desc[i] = site_prefix + desc[i];
				}
			}
			desc.pageName = sanitizeTracking(desc.pageName);
			desc.eVar48 = desc.pageName;
			if (desc.eVar12 == 'tout') {
				desc.eVar13 =desc.pageName;
				desc.prop3 = desc.pageName;
			}
			s.t(desc);
		}
	};
	self.trackClick = function(desc){
		var site_prefix = returnSitePrefix();
		if (!window.s) return;
		if (typeof desc == 'string'){
			var pageName = s.pageName;
			s.pageName = (desc.split('>')[0] != site_prefix) ? site_prefix + desc : desc;
			s.pageName = sanitizeTracking(s.pageName);
			desc = s.pageName; // pev2? 
			s.tl(this, 'o', desc);
			s.linkTrackEvents = s.events;
			s.pageName = pageName;
		} else if (typeof desc == 'object'){
			//Save a copy of previous "s" object, in case this link track remains on same page.
			var s_copy = {};
			for(var i in desc){
				s_copy[i] = s[i];
				s[i] = ((i == 'pageName') && (desc[i].split('>')[0] != site_prefix)) ? site_prefix + desc[i] : desc[i];
			}
			s.pageName = sanitizeTracking(s.pageName);
			s.eVar48 = s.pageName;
			//s.events='event13';
			
			s.linkTrackEvents = s.events;
			
			if (desc.eVar12 == 'tout') {
				s.eVar13 = s.pageName;
				s.prop3 = s.pageName;
			} else {
				s.prop3 = s.pageName;
			}
			
			//Assure that all tracking variables are passed on link track
			s_copy['linkTrackVars'] = s['linkTrackVars'];
			s.linkTrackVars = null;
			
			s.lnk = true;
			s.linkName = s.pageName;
			s.linkType = 'o';
			s.t({ events: 'event13' });
			//s.tl(this,'o',s.pageName);
			
			//Reset s to previous values (before link track)
			for(var j in s_copy) s[j] = s_copy[j]; 
		}
	};
	self.flash = function(obj){
		return escape(JSON.stringify(obj));
	};
	self.setLoggedInStatus = function(){
		if (JQ.cookie && window.Base64) {
			if (JQ.cookie('id.nike.com')){
				var decoded = Base64.decode(JQ.cookie('id.nike.com'));
				if (decoded){
					if (decoded.split(':')[1] == 'null'){
						self.logged_in_status = 'not logged in';
						if (decoded.split(':')[0] != 'null'){
							self.logged_in_id = decoded.split(':')[0];
						} else {
							self.logged_in_id = '';
						}
					} else {
						self.logged_in_status = 'logged in';
						self.logged_in_id = decoded.split(':')[0];
					}
				}
			}
		}
	};
	self.deleteProp = function(prop){
		delete s[prop];
		delete s['g_'+prop];
	};
	self.changeDevUrl = function(map) {
		blog_url_map.dev = map;
	};
	self.init();
}

//Utility Functions
function getFlashVersion() {
	var pv = deconcept.SWFObjectUtil.getPlayerVersion();
	var fvs = (pv.major == '0' && pv.minor == '0' && pv.rev == '0') ? 'No Flash Installed' : pv.major + ',' + pv.minor + ',' + pv.rev;
	var br = BrowserDetect.browser;
	var bvs = BrowserDetect.version;
	var os = BrowserDetect.OS.substring(0,3).toUpperCase();
	// return (br + ' ' + bvs + '/' + os + ' ' + fvs);	
	// @example: "Firefox 2/WIN 9,0,124";
	return (fvs);
	// @example: "9,0,124";
}


var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(input){var output="";var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i = 0;input=Base64._utf8_encode(input);while(i<input.length){chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}output=output+this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);}return output;},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i<input.length){enc1=this._keyStr.indexOf(input.charAt(i++));enc2=this._keyStr.indexOf(input.charAt(i++));enc3=this._keyStr.indexOf(input.charAt(i++));enc4=this._keyStr.indexOf(input.charAt(i++));chr1=(enc1<<2)|(enc2>>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);}if(enc4!=64){output=output+String.fromCharCode(chr3);}}output=Base64._utf8_decode(output);return output;},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c);}else if((c>127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128);}else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}}return utftext;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){string+=String.fromCharCode(c);i++;}else if((c>191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;}else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}}return string;}};
jQuery.extend({getURLParam: function(strParamName){var strReturn = "";var strHref = window.location.href;var bFound=false;var cmpstring = strParamName + "=";var cmplen = cmpstring.length;if ( strHref.indexOf("?") > -1 ){var strQueryString = strHref.substr(strHref.indexOf("?")+1);var aQueryString = strQueryString.split("&");for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){if (aQueryString[iParam].substr(0,cmplen)==cmpstring){var aParam = aQueryString[iParam].split("=");strReturn = aParam[1];bFound=true;break;}}}if (bFound==false) return null;return strReturn;}});
JQ(document).ready(init_tracking);

