epiton.userinfo={};
epiton.userinfo.UserInfo=function(){
	var ns="userinfo";
	var timestamp="tms";
	var cacheMillis=1800000; //30 mins
	//var cacheMillis=10000; //10 seconds
	var _private={
		isLoaded:false,
		keys:{},
		roles:null,
		localUuid:null,
		isHandledAsFakeLogin:function(){
			if(this.localUuid=="none"){
				this.keys['uuid']='none';
				this.keys['session']='none';
				return true;
			}
			return false;
		},
		isUuidMapMatch:function(map){
			if((map&&map["uuid"])&&epiton.codecs.Url.decode(map["uuid"])==this.localUuid){
				return true;
			}
			return false;
		},
		parseLocalCookie:function(cval){
			var unpr = cval.split(":");
			if (unpr.constructor == Array && unpr.length == 3) {
				if (unpr[0] == "V1") {
					return unpr[1];
				}
			}
			return undefined;
		},
		getLocalUuid:function(){
			var _jsc=epiton.utils.Cookie.get('wsjlocal');
			if(_jsc){
				_jsc=epiton.codecs.Base64.decode(_jsc);
				if(_jsc){
					_jsc=this.parseLocalCookie(_jsc);
					if(_jsc){
						return _jsc;
					}
				}
			}
			return undefined;
		},
		setKeys:function(map){
			if(map){
				this.keys=map;
				//url decode values
				for (var p in this.keys) {
					this.keys[p]=epiton.codecs.Url.decode(this.keys[p]);
				}
				
				var r=this.keys['roles'];
				if(r){
					this.roles=r.split(',');
				}
				
				this.isLoaded=true;
			}
		},
		setJsonCache:function(map){
			if(!map) return;
			var jmapd=epiton.utils.Object.clone(map);
			epiton.cache.NSMap.setNamespaceValue(ns,ns,jmapd);
			epiton.cache.NSMap.setNamespaceValue(ns,timestamp,(new Date()).getTime());
			epiton.cache.NSMap.commitNamespace(ns);
		},
		isJsonCacheExpired:function(map){
			var tms=epiton.cache.NSMap.getNamespaceValue(ns,timestamp);
			tms=parseInt(tms);
			var tmdif=((new Date()).getTime()-tms);
			if(tmdif>=cacheMillis){
				return true;
			}
			return false;
		},
		getJsonCache:function(){
			var ju=epiton.cache.NSMap.getNamespaceValue(ns,ns);
			if(ju){
				if(_private.isUuidMapMatch(ju)){
					return ju;
				}else{
					epiton.cache.NSMap.clearNamespace(ns);
					epiton.cache.NSMap.commitNamespace(ns);
				}
			}
			
			return null;
		},
		finalCheck:function(){
			if(_private.isLoaded==false){
				var tms=epiton.cache.NSMap.getNamespaceValue(ns,ns);
				this.setJsonCache(tms);
				this.setKeys(tms);
			}
		},
		loadUserInfo:function(){
			epiton.classloader.require("userinfo.json");
			function onUserInfoReady(xhReq){
				if (xhReq.readyState == 4) {
					if(xhReq.status==200){
						var jmap=eval("("+xhReq.responseText+")");
						_private.setJsonCache(jmap);
						_private.setKeys(jmap);
					}else{
						_private.finalCheck();
					}
					epiton.classloader.setRequireLoaded("userinfo.json");
				}
			}
			epiton.utils.Ajax.get("/auth/userinfo.json?rnd="+new Date().getTime().toString()+'R'+Math.floor(Math.random()*99999999999999999),onUserInfoReady);
		},
		needsReset:function(){
			return (_private.localUuid!=_public.getUuid()||!_public.getUuid());
		}
	}
	var _public={
		initialize:function(){
			//set Local Uuid
			_private.localUuid=_private.getLocalUuid();
			if(_private.localUuid){
				if(!_private.isLoaded){
					var nsc=_private.getJsonCache();
					if(!nsc||_private.isJsonCacheExpired(nsc)||_private.needsReset()){ //load ajax json
						_private.loadUserInfo();
					}else{ //load cache json
						_private.setKeys(nsc);
					}
				}else if(_private.needsReset()){
					_private.loadUserInfo();
				}
				//end load json details
			}
		},
		getFirstName:function(){
			return _private.keys["first_name"];
		},
		getLastName:function(){
			return _private.keys["last_name"];
		},
		getUserName:function(){
			var uname=_private.keys["user"];
			return uname;
		},
		getSessionId:function(){
			return _private.keys["session"];
		},
		getUuid:function(){
			return _private.keys["uuid"];
		},
		getUuidUrlEncoded:function(){
			var u=epiton.userinfo.UserInfo.getUuid();
			if(u){
				u=epiton.codecs.Url.encode(u);
				return u;
			}
			return null;
		},
		getEmailAddress:function(){
			return _private.keys["email"];
		},
		getCallsign:function(){
			if(_public.getFirstName() && _public.getFirstName()!="null" && _public.getLastName() != "null" && _public.getLastName() ){
				return _public.getFirstName() + " " + _public.getLastName();
			}else{
				return _public.getUserName();
			}
		},
		isLoggedIn:function(){
			return _private.keys["session"]!=undefined;
		},
		hasRole:function(role){
			return (_private.roles)&&(_private.roles.indexOf(role)>=0);
		},
		test:function(role){
			alert(_private.roles);
			alert(_private.roles.indexOf(role));
			alert(_private.roles.indexOf);
		},
		testUuid:function(){
			alert("privateUuid:"+_private.localUuid);
			alert("publicUuid:"+_public.getUuid());
			alert("isLoaded:"+_private.isLoaded);
			alert("cache:"+_private.getJsonCache());
		}
	}
	return _public;
}();
// assures that the userinfo.json logical item loaded via ajax is loaded before renders occur.

epiton.initOnReady(epiton.userinfo.UserInfo.initialize);

epiton.classloader.setLoaded("userinfo");
