﻿CookieStateListener = function () {
	// Debug message
	function debug(msg) {
		try {
			if (!document.all && console) {
				console.log(msg);
			}
		} catch (err) {}
	}

	function persistPortlet(articleId, portlet) {
		if (portlet) {
			var value = portlet.ismin + ',' + portlet.v + ',' + portlet.c + ',' + portlet.r;
			var name = getIndexKey(articleId, portlet);
			setCookie(name, value);
		}
	}

	function setCookie(name, value) {
		var date = new Date();
		date.setTime(date.getTime() + (30 * 24 * 60 * 60 * 1000));
		var expires = "; expires=" + date.toGMTString();
		document.cookie = name + "=" + value + expires + "; path=/";
	}

	function deleteCookie(name) {
		var date = new Date();
		var expires = "; expires=" + date.toGMTString();
		document.cookie = name + "='';" + expires + "; path=/";
	}

	// Retrieve all the cookies
	function getAllCookies(articleId) {
		var cookies = {};
		var temp = document.cookie.split(';');
		for (i = 0; i < temp.length; i++) {
			var parts = temp[i].trim().split('=');
			if (parts[0].indexOf(articleId + "|") == 0) {
				cookies[parts[0]] = parts[1];
			}
		}
		return cookies;
	}

	function clearAllCookies(articleId) {
		var cookies = document.cookie.split(';');
		for (i = 0; i < cookies.length; i++) {
			var parts = cookies[i].trim().split('=');
			if (parts[0].indexOf(articleId + "|") == 0) {
				deleteCookie(parts[0]);
			}
		}
	}

	function getIndexKey(articleId, portlet) {
		return articleId + "|" + portlet.aid;
	}

	return {
		RestoreState: function (articleId, portlets) {
			var cookies = getAllCookies(articleId);
			for (var idx = 0; idx < portlets.length; idx++) {
				var portlet = portlets[idx];
				var key = getIndexKey(articleId, portlet);
				if (cookies[key]) {
					var bits = cookies[key].split(",");
					portlet.ismin = bits[0] == "true";
					portlet.v = bits[1];
					portlet.c = bits[2];
					portlet.r = bits[3];

					delete cookies[key];
				}
			}

			portlets = portlets.sort(function sortparts(a, b) {
				if (a.c < b.c) {
					return -1;
				} else if (a.c > b.c) {
					return 1;
				} else {
					return a.r - b.r;
				}
			});
		},

		Update: function (articleId, portlet, okcallback, failurecallback) {
			persistPortlet(articleId, portlet);
			if (okcallback) {
				okcallback(null,
					{ result: portlet.uid }
				);
			}
		},

		ResetState: function (articleId) {
			clearAllCookies(articleId);
		}
	}
}

