epiton.cache={};
epiton.cache.NSMap=function(){
	var _private={
		cookieName:"djcs_epiton",
		store:{},
		cache:{},
		writeCookie:function(){
			var val=epiton.utils.Json.serialize(_private.store);
			if(val){val=_ck=epiton.codecs.Base64.encode(val);}
			epiton.utils.Cookie.set(_private.cookieName,val,null,"/",epiton.context.Browser.getCookieSld());
		},
		readCache:function(){
			var _ck=epiton.utils.Cookie.get(_private.cookieName);
			if(_ck){
				_ck=epiton.codecs.Base64.decode(_ck);
				if(epiton.utils.Json.isJson(_ck)){
					_private.store=eval("("+_ck+")");
					_private.cache=eval("("+_ck+")");
				}
			}
		},
		getOrCreateNamespace:function(ns){
			var nsm=_private.cache[ns];
			if(!nsm){
				nsm=_private.cache[ns]={};
			}
			return nsm;
		}
	}
	
	var _public={
		commitNamespace:function(ns){
			var cobj=_private.cache[ns];
			if(cobj){
				_private.store[ns]=epiton.utils.Object.clone(cobj);
			}else{
				delete(_private.store[ns]);
			}
			_private.writeCookie();
		},
		setNamespaceValue:function(ns,name,value){
			var nsm=_private.getOrCreateNamespace(ns);
			if(value){
				nsm[name]=value;
			}else{
				delete(nsm[name]);
			}
		},
		revertNamespace:function(ns){
			var robj=_private.store[ns];
			if(robj){
				_private.cache[ns]=_private.clone(robj);
			}else{
				delete(_private.cache[ns]);
			}
		},
		getNamespaceValue:function(ns,key){
			var nsv=_private.cache[ns];
			if(nsv){
				nsv=nsv[key];
				if(nsv){return nsv;}
			}
			return null;
		},
		clearNamespace:function(ns){
			delete(_private.cache[ns]);
		},
		initialize:function(){
			_private.readCache();
		}
		
	}
	return _public;
}();

epiton.preInitOnReady(epiton.cache.NSMap.initialize);
epiton.classloader.setLoaded("cache");
