
function CookieManager() { }
CookieManager.prototype = {
	cookiesParsed: false,
	IFILMCookiesParsed: false,
	unparsedcookie: null,
	cookiePairs: [],
	cookies: {},
	IFILMCookies: {},
	JSONCookies: {},
	sessionCookies: {},
	CONSTANTS: {
		DELIMITER: "%!%",
		ASSIGNER: "~!~",
		PARAMOBJ: { "max-age": (60*60*24*365), path: "/", domain: "spike.com" }
	},
	
	get: function(name) {
		if(!this.cookiesParsed) { this.parse() };
		return this.cookies[name] || null;
	},

	getIFILMCookie: function(name) {
		if(!this.IFILMCookiesParsed) { this.parseIFILMCookies(); }
		return this.IFILMCookies[name];
	},

	set: function(name, value, cookieParamObject) {
		if(!this.cookiesParsed) { this.parse(); }
		this.cookies[name] = value;
		var cookieStr = name + "=" + encodeURIComponent(value);
		var pObj = (cookieParamObject) ? cookieParamObject : this.CONSTANTS.PARAMOBJ;
		for(var x in pObj) { 
			cookieStr += "; " + x + "=" + pObj[x];
		}
		document.cookie = cookieStr;		
		
	},
	
	remove: function(name) {
		this.set(name, "", { "max-age": 0 });
	},

	setIFILMCookie: function(name, value) {
		if(!this.IFILMCookiesParsed) { this.parseIFILMCookies(); }
		this.IFILMCookies[name] = value;
		var cookieAr = [];
		for(var x in this.IFILMCookies) {
			if(this.IFILMCookies[x]) {
				cookieAr.push(x + this.CONSTANTS.ASSIGNER + this.IFILMCookies[x]);
			}
		}
		var cookieString = cookieAr.join(this.CONSTANTS.DELIMITER);
		this.set("ifilmMetaCookie", cookieString);
		
	},
	
	removeIFILMCookie: function(name) {
		this.setIFILMCookie(name, null);
	},

	parse: function() {
		this.unparsedcookie = document.cookie;
		this.cookiePairs = document.cookie.split("; ");
		for(var x=0; x<this.cookiePairs.length; x++) {
			var curCookie = this.cookiePairs[x].split("=");
			this.cookies[decodeURIComponent(curCookie[0])] = decodeURIComponent(curCookie[1]);
		}
		this.cookiesParsed = true;
	},

	parseIFILMCookies: function() {
		var IFILMCookie = this.get("ifilmMetaCookie");
		var metaFrags = IFILMCookie.split(this.CONSTANTS.DELIMITER);
		for(var x=0; x<metaFrags.length; x++) {
			if(metaFrags[x] != "") {
				var curMetaFrag = metaFrags[x].split(this.CONSTANTS.ASSIGNER);
				this.IFILMCookies[curMetaFrag[0]] = curMetaFrag[1];
			}
		}
		this.IFILMCookiesParsed = true;
	},
	
	getSessionParam: function() {
		return { path: "/", domain: "spike.com"};
	},
	
	setSessionCookie: function(name, value) {
		this.sessionCookies[name] = value;
		if(this.sessionCookies[name]) {
			this.set(name, this.sessionCookies[name], this.getSessionParam());
		}
		safelog(this.sessionCookies[name], "info", "cookieManager.setSessionCookie");
	},
	
	getSessionCookie: function(name) {
		this.sessionCookies[name] = this.get(name);
		safelog(name + ": " + this.sessionCookies[name], "info", "cookieManager.getSessionCookie");
		return this.sessionCookies[name];
	},
	
	getIFILMChip: function(chipName, cookieName) {
		var atCookie = cookieName || "ifilm_session";
		var cookieObjStr = this.getSessionCookie(atCookie);

		this.JSONCookies[atCookie] = JSONConverter.parse(cookieObjStr) || {};
		return this.JSONCookies[atCookie][chipName] || "";
	},
	
	setIFILMChip: function(chipName, chipVal, cookieName) {
		var atCookie = cookieName || "ifilm_session";
		var cookieObjStr = this.getSessionCookie(atCookie);
		if(!this.JSONCookies[atCookie]) { 
			this.JSONCookies[atCookie] = JSONConverter.parse(cookieObjStr) || {};
		}
		this.JSONCookies[atCookie][chipName] = chipVal;
		this.setSessionCookie(atCookie, JSONConverter.convert(this.JSONCookies[atCookie]));
	},
	getJSONCookieInOldFormat: function(name) {
		var cookieObjStr = this.get(name);
		if(!cookieObjStr) { return ""; }
		var cookieObj = JSONConverter.parse(cookieObjStr);
		var cookieF = ""
		for(var x in cookieObj) {
			if(cookieF != "") { cookieF += "_DH_" }
			cookieF += x + "_CP_" + cookieObj[x];
		}
		return cookieF;
	}
}

var JSONConverter = {
	parse: function(str) {
		try {
			var parseObj = new Function("return " + str);
			return parseObj();
		} catch(e) { return {}; }
	},
	convert: function(obj) {
		if(obj instanceof Number || typeof obj == "number" || obj instanceof Boolean || typeof obj == "boolean") { safelog("converting " + obj + " from number", "info", "JSONConverter"); return obj; safelog("converting " + obj + " to number"); }
		if(obj instanceof String || typeof obj == "string") { safelog("converting " + obj + " from String", "info", "JSONConverter"); return JSONConverter.stringToJSON(obj) }
		if(obj instanceof Array)  { safelog("converting " + obj + " from Array", "info", "JSONConverter"); return JSONConverter.arrayToJSON(obj) }
		if(obj instanceof Date)   { safelog("converting " + obj + " from Date", "info", "JSONConverter");  return JSONConverter.dateToJSON(obj) }
		if(obj == null || obj instanceof RegExp) { return null };
		return JSONConverter.objectToJSON(obj);
	},
	objectToJSON: function(obj) {
		safelog("converting " + obj + " from object", "info", "JSONConverter"); 
		var JSONStr = "{";
		var propAr = [];
		for(var prop in obj) {
			var propStr = '"'+prop+'":';
			propStr += JSONConverter.convert(obj[prop]);
			propAr.push(propStr);
			
		}
		JSONStr += propAr.join(", ");
		JSONStr += "}";
		return JSONStr;
	},
	arrayToJSON: function(ar) {
		try {
			var jsonar = [];
			var arLim = ar.length;
			for(var x=0; x<arLim; x++) {
				jsonar.push(JSONConverter.convert(ar[x]));
			}
			return "[" + jsonar.join(",") + "]";
		} catch(e) { safelog(e, "error", "JSONConverter.arrayToJSON"); }
	},
	stringToJSON: function(str) {
		try {
			return '"' + str.replace(new RegExp('"', "g"), '\\"') + '"'; 
		} catch(e) { safelog(e, "error", "JSONConverter.stringToJSON"); }
	},
	dateToJSON: function(date) {
		function f(n) {
			return n < 10 ? '0' + n : n;
		}
	
		return '"' + date.getFullYear() + '-' +
			f(date.getMonth() + 1) + '-' +
			f(date.getDate()) + 'T' +
			f(date.getHours()) + ':' +
			f(date.getMinutes()) + ':' +
			f(date.getSeconds()) + '"';	
	}
}

function getIFILMChip(cookieName, chipName) {
	safelog("getting IFILM session cookie chip: " + chipName, "info", "getIFILMChip");
	var atCookie = cookieName || false;
	return IFILM.cookieManager.getIFILMChip(chipName, atCookie);
}

function setIFILMChip(cookieName, chipName, chipValue) {
	safelog("setting IFILM session cookie chip: " + chipName + " to " + chipValue, "info", "getIFILMChip");
	var atCookie = cookieName || false
	IFILM.cookieManager.setIFILMChip(chipName, chipValue, atCookie);
}


var IFILM = IFILM || {
	cookieManager: new CookieManager()
}