/**
 * 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 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;
	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 = '';
		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);
	};
	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){
				s[p]=page_tracker_obj[p];
			}
		};
		if(typeof s.do_not_call == 'undefined'){
			//setTimeout(s.t, 50);
			s.t();
		}
		if(s_code){
			self.tracking_wrapper.append(s_code);
		}
	};
	self.click=function(desc){
		if(!window.s){
			return;
		}
		if(typeof desc == 'string'){
			s.t({pageName:desc});
		}
		else if(typeof desc == 'object'){
			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'){
			if(typeof window.nav_tracker_obj.prefix == 'undefined'){
				var site_prefix = '';
			} else {
				var site_prefix = nav_tracker_obj.prefix;
			}
		} else {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;
			}
			s.t({pageName: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];
				}
			}
			s.t(desc);
		}
	};
	self.trackClick=function(desc){
		if(typeof window.track_site == 'undefined'){
			if(typeof window.nav_tracker_obj.prefix == 'undefined'){
				var site_prefix = '';
			} else {
				var site_prefix = nav_tracker_obj.prefix;
			}
		} else {site_prefix = track_site;}
		if(!window.s){
			return;
		}
		if(typeof desc == 'string'){
			var pageName = s.pageName;
			s.pageName = desc;
			if(desc.split('>')[0] != site_prefix){
				s[i] = site_prefix + desc[i];
			} else {
				s[i] = desc[i];
			}
			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];
				if((i == 'pageName' || i == 'eVar48') && (i.split('>')[0] != site_prefix)){
					s[i] = site_prefix + desc[i];
				} else {
					s[i] = desc[i];
				}
			}
			
			//Assure that all tracking variables are passed on link track
			s_copy['linkTrackVars'] = s['linkTrackVars'];
			s.linkTrackVars = null;

			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];
					}
				} else {
					self.logged_in_status = 'not logged in';
					self.logged_in_id = '';
				}
			}
		}
	};
	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;}};

JQ(document).ready(init_tracking);
