
	iona.state = (function(){
		var _ = {};
		var cookieName = "iona_state";
		var state;
		
		var init = function(){
			state = getCookie() || [];
		};
		
		var getCookie = function(){
			var ret;
			if(localStorageEnabled()) {
				ret = localStorage[cookieName];
			} else {
				for(var i=0; $.cookie(cookieName+"_"+i); i++)
					ret.push($.cookie(cookieName+"_"+i));
				ret = ret.join('');
			}
			if(!ret || ret.length == 0)
				return false;
			return parse(ret);
		};
		
		var updateCookie = function(){
			clearCookies();
			var data = stringify(state);
			data = data.replace(/[\n\r]+/gi,"\\n" );
			
			if(localStorageEnabled()) {
				localStorage[cookieName] = data;
			} else {
				var dataChunks = [];
				var countPerChunk = 1000;
				var chunk;
				var i=0;
				while(data.length > 0) {
					chunk = data.slice(0, countPerChunk);
					data = data.slice(countPerChunk);
					$.cookie(cookieName+"_"+i, chunk, {path:"/"});
					i++;
				}
			}
		};
		
		var clearCookies = function() {
			for(var i=0; $.cookie(cookieName+"_"+i); i++)
				$.cookie(cookieName+"_"+i, null, {path:"/"});
		};
		
		_.getState = function(){
			return state;
		};
		
		_.setState = function(d){
			state = d;
			updateCookie();
		};
		
		var stringify = function (d) {
			var ret = [];
			var hasObject = false;
			if (typeof d == "object" && d.constructor.toString().indexOf("Array") != -1) {
				ret.push("[");
				for (var i = 0; i < d.length; i++) {
					hasObject = true;
					ret.push(stringify(d[i]), ",");
				}
				if (hasObject)
					ret.pop();
				ret.push("]");
			} else if (typeof d == "object") {
				ret.push("{");
				for (var p in d) {
					hasObject = true;
					ret.push("\"", p, "\":", stringify(d[p]), ",");
				}
				if (hasObject) ret.pop();
					ret.push("}");
			} else if (typeof d == "string") {
				ret.push("\"", d.replace(/\"/g, "\\\""), "\"");
			} else {
				ret.push(d);
			}
			return ret.join('');
		};
		
		var parse = function (str) {
			var ret = eval("(" + str + ")");
			return ret;
		};
		
		var localStorageEnabled = function() {
			try {
				return 'localStorage' in window && window['localStorage'] !== null;
			} catch(e) {
				return false;
			}
		};

		init();
		return _;
	})();
