if (!ContextManager) {
	var ContextManager = {
		/**
		* Populate ContextManager with properties supplied by backend
		*/
		init : function(paramOb) {
			var k;
			for (var k in paramOb) {
				ContextManager[k] = paramOb[k];
			}
			// start session 
			var d = new Date();
			var start = d.getTime();
			var dur = 240000;
			// 4 min = 240000 ms
			ContextManager.session = {	
				duration : dur,
				startTime : start
			};
		},
		/**
		* Given a param string, update any relevant Context properties
		*/
		updateProperties : function(params) {
			var paramOb = ContextManager.parseParamString(params);
			//
			for (var k in paramOb) {
				switch(k) {
					// handle special INV cases
					case 'make':
					case 'model':
					case 'trim':
					case 'search':
					case 'bodyType':
					case 'minMileage':
					case 'maxMileage':
					case 'minMonthlyPayment':
					case 'maxMonthlyPayment':
					case 'minPrice':
					case 'maxPrice':
					case 'minYear':
					case 'maxYear':
						ContextManager.updateInventoryProperties(k, paramOb);
						break;
					default:
						if (paramOb[k] != undefined) {
							ContextManager[k] = paramOb[k];
						}
				}
			}
		},
		updateInventoryProperties : function(k, paramOb) {
			switch(k) {
				case 'make':
				case 'model':
				case 'trim':
				case 'bodyType':
					if (paramOb[k] != undefined) {
						ContextManager[k] = (paramOb[k] == "" || paramOb[k] == "all") ? 'All' : paramOb[k];
					}
					break;
				case 'search':
					ContextManager.search = paramOb.search;
					break;
				case 'minMileage':
				case 'maxMileage':
					ContextManager.mileageRange = paramOb.minMileage + '-' + paramOb.maxMileage;
					break;
			}
			ContextManager.paymentRange = (paramOb.minMonthlyPayment) ? paramOb.minMonthlyPayment + '-' + paramOb.maxMonthlyPayment : 'unspecified';
			ContextManager.priceRange = (paramOb.minPrice) ? paramOb.minPrice + '-' + paramOb.maxPrice : 'unspecified';
			ContextManager.yearRange = (paramOb.minYear) ? paramOb.minYear + '-' + paramOb.maxYear : 'All';
		},
		//
		parseParamString : function(params) {
			var i, temp;
			// split the params
			var pArray = params.split("&");
			// hash to store result
			var pHash = {};
			// parse each param in the array and put it in the hash
			for (i=0; i < pArray.length; i++) {
				temp = pArray[i].split("=");
				// test for multiple values with the search key, as in 'search=new&search=preowned'
				if ((pHash[temp[0]]) && (temp[0] == 'search')) {
					pHash[temp[0]] = 'All';
				} else {
					pHash[temp[0]] = ContextManager.URLEncode(unescape(temp[1]));
				}
			}
			return pHash; 
		},
		/**
		* URLEncode provides more accurate encoding than native Javascript functions.
		*/
		URLEncode : function(str) {
			// The Javascript escape and unescape functions do not correspond
			// with what browsers actually do...
			var SAFECHARS = "0123456789" +					// Numeric
							"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
							"abcdefghijklmnopqrstuvwxyz" +
							"-_.!~*'()";					// RFC2396 Mark characters
			var HEX = "0123456789ABCDEF";

			var encoded = "";
			for (var i = 0; i < str.length; i++ ) {
				var ch = str.charAt(i);
				if (ch == " ") {
					encoded += "+";				// x-www-urlencoded, rather than %20
				} else if (SAFECHARS.indexOf(ch) != -1) {
					encoded += ch;
				} else {
					var charCode = ch.charCodeAt(0);
					if (charCode > 255) {
						/*
						alert( "Unicode Character '" 
								+ ch 
								+ "' cannot be encoded using standard URL encoding.\n" +
								  "(URL encoding only supports 8-bit characters.)\n" +
								  "A space (+) will be substituted." );
						*/
						encoded += "+";
					} else {
						encoded += "%";
						encoded += HEX.charAt((charCode >> 4) & 0xF);
						encoded += HEX.charAt(charCode & 0xF);
					}
				}
			} // for
			return encoded;
		},
		
		// functions to generate a GUID
		/**
		* Return 4-char random string
		*/
		S4 : function() {
			return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
		},
		/**
		* Get a 12-char event ID suffix: used for Cobalt pixel tag
		*/
		generateEventIdSuffix : function() {
			return ContextManager.generateUid(12);
		},
		/**
		* Get a full 44-char event ID
		*/
		generateEventId : function() {
			return ContextManager.generateUid(44);
		},
		/**
		* Generate a UID of variable length.
		*/
		generateUid : function(length) {
			var i;
			var unit = 4;
			var st = "";
			// determine # of iterations - each unit is 4 chars
			var count = Math.ceil(length/unit);
			for (i=1; i<=count; i++) {
				st += ContextManager.S4();
			}
			return st.substr(0,length);
		}
		// END : functions to generate a GUID
	};
}




