/*
 * NOTE: Depends on prototype and util.js currently
 */
var CounterPixel = function() {

	/**
	 * Private variables
	 */
	
	/**
	 * @private string Primary tracking server URL
	 */
	var cpPath1 = null;
	/**
	 * @private string Secondary tracking server URL
	 */
	var cpPath2 = null;
	/**
	 * @private string Omniture SiteCatalyst account 
	 */
	var omnitureAccount = null;
	
	/*
	document.observe("dom:loaded", init);

	function init() {
		// Tracks all external links
		$$('a[href]').findAll(isExternal).each(function(el) {
			//logAttribute("Having external link to ", el);
			el.observe('click', trackExternal);
		});
		
		// Tracks clicks, i.e. NoPVs on JS buttons
		$$('a[rel^=trackClick:]').each(function(el) {
			el.observe('click', trackRel);
		});
		
		// Tracks downloads, basically clicks, but additionally the context menu too
		$$('a[rel^=trackDownload:]').each(function(el) {
			el.observe('click', trackRel);
			el.observe('contextmenu', trackRel); // NOTE: This does not work in Opera
		});
	}
	
	function isExternal(el) {
		if (el.target == '_blank') {
			return true;
		}
		if (el.href.startsWith('http://') || el.href.startsWith('https://')) {
			if (!el.href.match(document.location.hostname)) {
				//el.target = '_blank'; // Force external links to open in new window
				return true;
			}
		}
		return false;
	}

	function trackExternal() {
		var link = this.href.replace(/\//g, "|");
		var label = this.title.strip();
		if(label == '') {
			label = this.innerHTML.stripTags();
		}
		//log("Label '" + label + "' has link '" + link + "'");
		var path = '/ext/local';
		if(label != '') {
			path = path + '/' + encodeURI(label);  
		}
		path = path + '/' + encodeURI(link);
		//log("Having path: " + path);
		CounterPixel.track(path);
	}
	
	function trackRel() {
		var path = this.readAttribute('rel');
		var index = path.indexOf('://');
		if (index > 0 && (index + 3) < path.length) {
			path = path.substring((index + 3), path.length);
		}
		//log("Having path: " + path);
		CounterPixel.track(path);
	}
	 */

	function wait(milis) {
		var date = new Date();
		var curDate = null;
		do {
			curDate = new Date();
		}
		while(curDate - date < milis);
	}
	
	/**
	 * @note This returns an object literal containing all the following
	 * methods. These (and these alone) can access the private vars declared
	 * above. Something like CounterPixel.cpPath1 does not access the var but
	 * rather create a new one.
	 */
	return {

		/**
		 * Sets the path variables used for tracking. 
		 * 
		 * @method initCpPaths 
		 * @param string path1
		 * @param string path2
		 */
		initCpPaths : function(path1, path2) {
			if (!cpPath1 && !cpPath2) {
				cpPath1 = path1;
				cpPath2 = path2;
			}
		},
		
		/**
		 * Sets the Omniture SiteCatalyst accountName 
		 */
		initOmniture : function(reportSuiteId) {
			if (!omnitureAccount) {
				omnitureAccount = reportSuiteId;
			}
		},

		/**
		* Tracks the specified path
		*
		* @method track 
		* @param string path
		*/
		track : function(path) {
			var now = new Date();
			var logpixel1 = new Image();
			var logpixel2 = new Image();
			if (cpPath1 && cpPath2) {
				if (!path.startsWith('/')) {
					path = '/' + path;
				}
				logpixel1.src = cpPath1 + path + '?' + now.getTime();
				logpixel2.src = cpPath2 + path + '?' + now.getTime();
				//log("Pixel: " + logpixel1.src);
				wait(100);
			}
			
			// Omniture hook
			this.trackOmniture(path);			
		},
		
		/**
		 * Tracks the specified path in Omniture
		 */
		trackOmniture : function(path) {
			/*
			var movie = AMV.getFlashObject('flashmovie');
			if (movie && !movie.s_oid) {
				movie.s_oid = 'flashmovie';
			}
			*/
			
			if (omnitureAccount && s_gi) {
				var extension = Utils.getExtension(path);
				//log("extension: '" + extension + "'");
				
				// Get Omniture object
				var s = s_gi(omnitureAccount);
				
				// Track nopvs
				if (extension == 'nopv') {
					var obj = new Object();
					obj.href = Utils.stripExtension(path); 
					s.tl(obj,'o', obj.href);
				}
				// Track pvs
				else {
					path = Utils.stripExtension(path);

					// Set values
					vars = new Object();
				    vars.pageName = path;

				    vars.hier1 = path;
					var pathComponents = path.split('/');
				    vars.channel = pathComponents[1];

					var hierarchyDepth = Math.min(pathComponents.length, 5);
					for (var i = 1; i < hierarchyDepth; i++) {
						vars['prop' + i] = pathComponents[i + 1];
					}
					
					/*
					log("Omniture [channel=" + vars.channel + ", pageName=" + vars.pageName 
							+ ", hier1=" + vars.hier1 + ", prop14=" + vars.prop14 + "]");
					*/

					// Track PV
					var s_code=s.t(vars);
					if(s_code) {
						document.write(s_code);
					}

					// Set new pageName
					s.pageName = vars.pageName;
				}
			}
						
		},
		
		resetOmniture : function(s) {
			this.resetOmnitureBasics(s);
			this.resetOmnitureOthers(s);
		},

		resetOmnitureBasics : function(s) {
			// Reset Basics
			s.pageName = '';
			//s.referrer = '';
			s.server = '';
			s.channel = '';
			s.pageType = '';
			s.prop1 = ''; s.prop2 = ''; s.prop3 = ''; s.prop4 = ''; s.prop5 = '';
			//s.prop6 = ''; s.prop7 = ''; s.prop8 = ''; s.prop9 = ''; s.prop10 = ''; s.prop11 = ''; s.prop12 = ''; s.prop13 = ''; s.prop14 = ''; s.prop15 = ''; s.prop16 = ''; s.prop17 = ''; s.prop18 = ''; s.prop19 = ''; s.prop20 = ''; s.prop21 = ''; s.prop22 = ''; s.prop23 = ''; s.prop24 = ''; s.prop25 = ''; s.prop26 = ''; s.prop27 = ''; s.prop28 = ''; s.prop29 = ''; s.prop30 = ''; s.prop31 = ''; s.prop32 = ''; s.prop33 = ''; s.prop34 = ''; s.prop35 = ''; s.prop36 = ''; s.prop37 = ''; s.prop38 = ''; s.prop39 = ''; s.prop40 = ''; s.prop41 = ''; s.prop42 = ''; s.prop43 = ''; s.prop44 = ''; s.prop45 = ''; s.prop46 = ''; s.prop47 = ''; s.prop48 = ''; s.prop49 = ''; s.prop50 = '';
			
			// Reset Conversion Variables
			//s.visitorID = '';
			s.campaign = '';
			s.state = '';
			s.zip = '';
			s.events = '';
			s.products = '';
			s.purchaseID = '';			
			s.transactionID = '';
			s.eVar1 = ''; s.eVar2 = ''; s.eVar3 = ''; s.eVar4 = ''; s.eVar5 = '';
			//s.eVar6 = ''; s.eVar7 = ''; s.eVar8 = ''; s.eVar9 = ''; s.eVar10 = ''; s.eVar11 = ''; s.eVar12 = ''; s.eVar13 = ''; s.eVar14 = ''; s.eVar15 = ''; s.eVar16 = ''; s.eVar17 = ''; s.eVar18 = ''; s.eVar19 = ''; s.eVar20 = ''; s.eVar21 = ''; s.eVar22 = ''; s.eVar23 = ''; s.eVar24 = ''; s.eVar25 = ''; s.eVar26 = ''; s.eVar27 = ''; s.eVar28 = ''; s.eVar29 = ''; s.eVar30 = ''; s.eVar31 = ''; s.eVar32 = ''; s.eVar33 = ''; s.eVar34 = ''; s.eVar35 = ''; s.eVar36 = ''; s.eVar37 = ''; s.eVar38 = ''; s.eVar39 = ''; s.eVar40 = ''; s.eVar41 = ''; s.eVar42 = ''; s.eVar43 = ''; s.eVar44 = ''; s.eVar45 = ''; s.eVar46 = ''; s.eVar47 = ''; s.eVar48 = ''; s.eVar49 = ''; s.eVar50 = ''; 
			
			// Reset Hierarchy Variables
			s.hier1 = ''; s.hier2 = ''; s.hier3 = ''; s.hier4 = ''; s.hier5 = '';
		},
		
		resetOmnitureOthers : function(s) {
			s.list1 = ''; s.list2 = ''; s.list3 = '';
			s.linkURL = '';
			s.linkName = '';
			s.linkType = '';
			s.linkTrackVars = '';
			s.linkTrackEvents = '';
		},
		
		/**
		 * Tracks flash embedding failures
		 *
		 * @method track 
		 * @param boolean notInstalled Pass true if flash is not installed on the client
		 */
		trackFlashEmbedFailure : function(notInstalled) {
			if (notInstalled) {
				this.track('/user_agent/no_flash.html');
			}
			else {
				this.track('/user_agent/wrong_flash.html');
			}
		},

		/**
		 * Tries to determine the user's screen resolution, installed flash plugin
		 * version and browser being used. The latter is only tracked if a proper
		 * version could be determined, the others are always tracked.
		 *
		 * @method trackUserAgent 
		 */
		trackUserAgent : function() {
			var playerVersion = swfobject.getFlashPlayerVersion();
			var flashVersion = playerVersion.major + '.' + playerVersion.minor
					+ '.' + playerVersion.release;
			
			var browser = false;
			if (Prototype.Browser.IE) {
				browser = 'Internet_Explorer_' + navigator.appVersion.substr(
						navigator.appVersion.indexOf('MSIE')+5, 3);
			}
			else if (Prototype.Browser.Gecko) {
				browser = 'Firefox_' + navigator.userAgent.substr(
						navigator.userAgent.indexOf('Firefox')+8, 3);
			}
			else if (Prototype.Browser.Opera) {
				browser = 'Opera_' + navigator.appVersion.substr(0,3);
			}
			else if (Prototype.Browser.WebKit) {
				browser = 'Safari_' + navigator.appVersion.substr(
						navigator.appVersion.indexOf('Version')+8, 3);
			}
			
			// Screen resolution
			this.track('/user_agent/screenresolution/' + screen.width + 'x'
					+ screen.height + '.nopv');
			
			// Flash Player Version
			this.track('/user_agent/flashversion/' + flashVersion + '.nopv');

			// Browser
			if (browser != false) {
				this.track('/user_agent/browser/' + browser + '.nopv');
			}
		}

	}

}();

