


/**
 * 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
 */

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;
	var sanitizeTracking = function(varName) {
		if (typeof varName != 'undefined') return varName.replace(/>+/,'>');
	};
	this.init=function(){
		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');
		self.s_js.src= protocol + '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';
		} 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;
			if(desc.eVar12=='tout') {
				desc.eVar13=desc.pageName;
				desc.prop3=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){
		if(typeof window.track_site == 'undefined'){
			var site_prefix = (typeof window.nav_tracker_obj.prefix == 'undefined') ? '' : nav_tracker_obj.prefix;
		} else {
			var site_prefix = track_site;
		}
		if(!window.s) return;
		if(typeof page_tracker_obj == 'object'){
			for(var i in page_tracker_obj){
				delete s[i];
			}
		}
		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){
		if(typeof window.track_site == 'undefined'){
			var site_prefix = (typeof window.nav_tracker_obj.prefix == 'undefined') ? '' : nav_tracker_obj.prefix;
		} else {
			var site_prefix = track_site;
		}
		if(!window.s) return;
		if(typeof desc == 'string'){
			var pageName = s.pageName;
			s.pageName = desc;
			s[i] = (desc.split('>')[0] != site_prefix) ? site_prefix + desc[i] : desc[i];
			s.pageName = sanitizeTracking(s.pageName);
			desc = sanitizeTracking(desc);
			s.tl(this, 'o', desc);
			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';
			
			if(desc.eVar12=='tout') {
				s.eVar13=s.pageName;
				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.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);
