epiton.gui.Demographics=function(){
	var _private={
		queryForQuestions:function(readyCallBack){
			function onQuestionsReady(xhReq){
				if (xhReq.readyState == 4&&xhReq.status==200) {
					if(readyCallBack){
						readyCallBack(xhReq.responseText);
					}
				}
			}
			epiton.utils.Ajax.get("/epiton/views/demographics/questions.html",onQuestionsReady);
		},
		queryForUserDemographics:function(uuid,readyCallBack){
			if(uuid){
				function onDemosReady(xhReq){
					if (xhReq.readyState == 4&&xhReq.status==200) {
						if(readyCallBack){
							readyCallBack(xhReq.responseText);
						}
					}
				}
				epiton.utils.Ajax.get("/epiton/services/demographics/references/uuid/"+uuid+".json",onDemosReady);
			}
		},
		submitDemographics:function(map,onSubmit){
			var errors=_private.validateMap(map);
			if(!errors){
				var tok=_private.getFormUuidToken(map);
				if(tok){
					tok="uuidToken/"+epiton.codecs.Url.encode(tok);
				}else{
					tok=epiton.userinfo.UserInfo.getUuid();
					if(tok){
						tok="uuid/"+epiton.codecs.Url.encode(tok);
					}
				}
				epiton.utils.Ajax.post("/epiton/services/demographics/references/"+tok,onSubmit,epiton.utils.Json.serialize(map));
			}
		},
		getOptionUuidToken:function(options){
			if(options['uuidToken']){
				return options['uuidToken'];
			}
			return null;
		},
		getIsOptionPrefill:function(options){
			var opt=options['prefill'];
			if(opt&&opt=="true"){
				return true;
			}
			return false;
		},
		getFormUuidToken:function(map){
			if(map&&map['uuidToken']){
				return map['uuidToken'];
			}
			return null;
		},
		createFormUuidTokenNode:function(val){
			var ntok=epiton.utils.Dom.createNode("input","uuidToken");
			epiton.utils.Dom.setElementValue(ntok,val);
			ntok.type='hidden';
			ntok.id="uuidToken";
			return ntok;
		},
		validateMap:function(map){
			return null;
		}
	}
	var _public={
		renderIntoDiv:function(divId,options){
			function renderQuestionsToDiv(content){
				var ndiv=document.createElement('div');
				ndiv.innerHTML=content;
				
				var u=epiton.userinfo.UserInfo.getUuidUrlEncoded();
				
				if(options){
					var opt=_private.getOptionUuidToken(options);
					if(opt){
						var ntok=_private.createFormUuidTokenNode(opt);
						ndiv.appendChild(ntok);
					}
					
					if(_private.getIsOptionPrefill(options)){
						function demoReady(text){
							var demomap=eval("("+text+")");
							epiton.utils.Dom.setDivInputsFromMap(divId,demomap);
						}
						_private.queryForUserDemographics(u,demoReady);
					}
				}
				
				epiton.utils.Dom.renderIntoDiv(divId,ndiv.innerHTML);
			}
			_private.queryForQuestions(renderQuestionsToDiv);
		},
		submitFromDiv:function(divId,onSuccess,onFail){
			var map=epiton.utils.Dom.getDivInputsAsMap(divId);
			function onFinish(req){
				if (req.readyState == 4) {
					if(req.status==200){
						if(onSuccess){
							onSuccess();
						}
					}else{
						if(req.responseText){
							try{
								var map=eval("("+req.responseText+")");
								onFail(map);
							}catch(e){
								onFail();
							}
						}else{
							onFail();
						}
					}
				}
			}
			_private.submitDemographics(map,onFinish);
		}
	}
	return _public;
}();

epiton.classloader.setLoaded("gui.demographics");