
//------------------------ EvaaFE (Evaa FrontEnd) -----------------------------------------
var EvaaFE = {
	onloadExecuted: false,

	onload: function(){ // Called in frontend.js (to ensure all variables have been defined)
		EvaaFE.Feedback.setup();
		EvaaFE.RegForm.setup();
		EvaaFE.onloadExecuted = true;
	}

};


//------------------------ EvaaFE.RegForm (Evaa Registration Form) ------------------------
EvaaFE.RegForm = {
	gotChanges: false,
	silenceSaveOnExitPrompt: false,
	onBeforeUnloadPrompted: false,
	inProgress: false,
	heartbeat: null,
	current_step:'',
	activeElementId:'',

	setup: function(){
		if($('Evaa_Form') == null)	{
			EvaaFE.RegForm.inProgress = false;
			return ;
		}

		if(EvaaFE.RegForm.heartbeat == null){
			EvaaFE.RegForm.heartbeat = new Evaa.Heartbeat(840000); // Send heartbeat every 14min
			EvaaFE.RegForm.heartbeat.start();
		}

		EvaaFE.RegForm.inProgress = true;
		//Registration is in progress. Observe for changes
		new Form.EventObserver('Evaa_Form', EvaaFE.RegForm.changeObserved);

	},

	end: function(){
		EvaaFE.RegForm.inProgress = false;
		EvaaFE.RegForm.gotChanges = false;
		EvaaFE.RegForm.current_step = '';
		EvaaFE.RegForm.activeElementId = '';
		if(EvaaFE.RegForm.heartbeat != null){
			EvaaFE.RegForm.heartbeat.stop();
		}
	},

	changeObserved: function(element, value){
		if(EvaaFE.RegForm.gotChanges){
			return ; // if we've already registered a change, don't do anything
		}
		EvaaFE.RegForm.preparePromptSaveOnExit();
		EvaaFE.RegForm.gotChanges = true;
	},

	preparePromptSaveOnExit: function(){
		EvaaWindow.Events.register("beforeunload", EvaaFE.RegForm.onBeforeUnload);
		EvaaWindow.Events.register("unload", EvaaFE.RegForm.unload);
	},

	promptSaveOnExit: function(){
		if(EvaaFE.RegForm.gotChanges && EvaaFE.RegForm.inProgress ){
			var discard = confirm("Your changes have not been saved yet. Discard your changes?");
			if(discard){
				EvaaFE.RegForm.silenceSaveOnExitPrompt = true;
			}
			return discard;
		}
		return true;
	},

	onBeforeUnload: function(){
		if(EvaaFE.RegForm.silenceSaveOnExitPrompt){
			return;
		}

		if(EvaaFE.RegForm.gotChanges && EvaaFE.RegForm.inProgress ){
			EvaaFE.RegForm.onBeforeUnloadPrompted = true;
			return "Your changes have not been saved yet. Leaving this page will discard your changes. ";
		}
	},

	unload: function(){
		if(EvaaFE.RegForm.silenceSaveOnExitPrompt
				|| EvaaFE.RegForm.onBeforeUnloadPrompted){ // In case we're dealing with a browser that doesn't handle the onbeforeunload event
			return true;
		}

		if(EvaaFE.RegForm.gotChanges && EvaaFE.RegForm.inProgress ){
			alert("Your changes have not been saved yet. Leaving this page will discard your changes. ");
		}
	},
	
	
	updateCompulsoryFieldsHandler: function(originalRequest){
		var compFlds = eval(originalRequest.responseText);
		
		var allFlds = document.getElementsByClassName("Evaa_FormFieldCompulsory");
		
		for (i=0; i<allFlds.length; i++){			
			if(compFlds.indexOf(allFlds[i].id) != -1){
				allFlds[i].innerHTML = "*";
			}else{
				allFlds[i].innerHTML = "";
			}
		}
		
	},
	
	showErrorFields: function(errorArr){
		var field;
		for (i=0; i<errorArr.length; i++){			
			
			field = $(errorArr[i]);
			if($(errorArr[i] + "-1") != null){
				//highlight row (radio buttons)
				Element.addClassName($("Evaa_FormRow-" + errorArr[i]), 'Evaa_Form_Error');
			}else if(field != null){
				Element.addClassName(field, 'Evaa_Form_Error');
				
			}else if($(errorArr[i] + "-PhoneNumber-CountryCode") != null) {
				Element.addClassName($(errorArr[i] + "-PhoneNumber-CountryCode"), 'Evaa_Form_Error');
				Element.addClassName($(errorArr[i] + "-PhoneNumber-AreaCode"), 'Evaa_Form_Error');
				Element.addClassName($(errorArr[i] + "-PhoneNumber-Number"), 'Evaa_Form_Error');
			}
			
			field = $("Select"+errorArr[i].replace(/-/g, ""));
			if(field != null) {
				Element.addClassName(field, 'Evaa_Form_Error');
				
			}
			
		}
	},
	
	addObserverToFieldByName: function(fieldName, fnction){
		var el = $(fieldName);

		if(el != null && el.id == fieldName){
			new Form.Element.EventObserver(el, fnction);
		}else{
			var els = document.getElementsByName(fieldName);
			if(els.length>0){
				for(var i=0; i<els.length; i++){
					new Form.Element.EventObserver(els[i], fnction);
				}
				
			}else{
				// Check whether we're dealing with a phone number here
				if($(fieldName+"-PhoneNumber-CountryCode") != null){
					//new Form.Element.EventObserver(fieldName+"-PhoneNumber-CountryCode", fnction);
					//new Form.Element.EventObserver(fieldName+"-PhoneNumber-AreaCode", fnction);
					new Form.Element.EventObserver(fieldName+"-PhoneNumber-Number", fnction);
				}
				
				
			}

		}
		
	}

}



//------------------------ EvaaFE.Feedback (Feedback mechanism) ---------------------------
EvaaFE.Feedback = {

	setup: function(){
		if($('Evaa_Feedback')==null){
			new Insertion.Top(document.body,
				'<div id="Evaa_Feedback" class="Evaa_Feedback_default" style="visibility:hidden;" onclick="EvaaFE.Feedback.clear();">' +
					'<div id="Evaa_FeedbackMessage" class="Evaa_FeedbackMessage_default"></div>' +
				'</div>');
		}
	},

	show: function(message){
		Element.update('Evaa_FeedbackMessage', message);
		if (message == ''){
			this.clear();
		}
		else{
			var feedbackFx = new Fx.Style('Evaa_Feedback', 'opacity').custom(0,1);
		}
	},

	clear: function(){
		//Hide feedback only if it is currently being shown
		if(Element.getStyle($('Evaa_Feedback'), 'opacity') > 0 &&
		   Element.getStyle($('Evaa_Feedback'), 'visibility') != 'hidden'){

		   	var feedbackFx = new Fx.Style('Evaa_Feedback', 'opacity').custom(1,0);
		}
	}
}



//------------------------ EvaaFE.Navigation (Form navigation) ----------------------------
EvaaFE.Navigation = {

	next: function(current_step){
		EvaaAJAX.Update("Evaa_Form", current_step, "_next", "_evaa_step&" + Form.serialize("Evaa_Form"));
	},

	back: function(current_step){
		EvaaAJAX.Update("Evaa_Form", current_step, "_previous", "_evaa_step&" + Form.serialize("Evaa_Form"));
	},

	cancel: function(){
		if(EvaaFE.RegForm.promptSaveOnExit()){
			EvaaFE.RegForm.end();
			window.location = '?';
		}
	},

	cancelAndGoto: function(goto_step){
		if(EvaaFE.RegForm.promptSaveOnExit()){
			EvaaFE.RegForm.end();
			EvaaAJAX.Update("Evaa_Form", goto_step, "_goto", "&_evaa_step");
		}
	},

	save: function(current_step){
		EvaaAJAX.Exec(current_step, "_step_save", "_evaa_step&" + Form.serialize("Evaa_Form"));
	},
	
	saveAndShowFeedback: function(current_step){
		Ext.get("Evaa_Form").mask("Saving...");
		EvaaAJAX.Request(EvaaFE.Navigation.saveAndShowFeedbackHandler, current_step, "_step_save", "_evaa_step&showfeedback&" + Form.serialize("Evaa_Form"));
	},
	
	saveAndExit: function(current_step){
		Ext.get("Evaa_Form").mask("Saving...");
		EvaaAJAX.Request(	function(originalRequest){
								Ext.get("Evaa_Form").unmask();
								EvaaFE.RegForm.end();
								window.location = '?signout';
							},current_step, "_step_save", "_evaa_step&" + Form.serialize("Evaa_Form"));
	},

	saveAndShowFeedbackHandler: function(originalRequest){
		Ext.get("Evaa_Form").unmask();
	},
	
		
	saveAndEndAndGoto: function(current_step, goto_step){
		EvaaAJAX.Update("Evaa_Form", current_step, "_next", "_goto=" + goto_step + "&_evaa_step&_evaa_saveandend&" + Form.serialize("Evaa_Form"));
	},

	finish: function(current_step){
		EvaaAJAX.Update("Evaa_Form", current_step, "_finish", "_evaa_step&" + Form.serialize("Evaa_Form"));
	},

	finishAndNoDashboard: function(current_step){
		EvaaAJAX.Update("Evaa_Form", current_step, "_finish", "_evaa_step&nodashboardstep" + Form.serialize("Evaa_Form"));
	},


	_goto: function(current_step, goto_step){
		EvaaAJAX.Update("Evaa_Form", current_step, "_next", "_goto=" + goto_step + "&_evaa_step&" + Form.serialize("Evaa_Form"));
	},

	load: function(participantId){
		EvaaAJAX.Update("Evaa_Form", "_StartRegistrationStep_", "_goto", "&_evaa_step&_evaa_restart_registration&participantId="+participantId);
	},

	loadAndGoto: function(participantId, goto_step){
		EvaaAJAX.Update("Evaa_Form", goto_step, "_goto", "&_evaa_step&_evaa_restart_registration&participantId="+participantId);
	},


	startNew: function(){
		EvaaAJAX.Update("Evaa_Form", "_StartRegistrationStep_", "_goto", "&_evaa_step&_evaa_restart_registration");
	},
	
	updateCompulsoryFields: function(){
		EvaaAJAX.Request(EvaaFE.RegForm.updateCompulsoryFieldsHandler, EvaaFE.RegForm.current_step, "_step_updatecompulsory", "&_evaa_step&" + Form.serialize("Evaa_Form"));
	},

	refreshStep: function(){
		var evaa_form = Ext.get("Evaa_Form"); 
		evaa_form.mask("Updating...");
		evaa_form._maskMsg.center();
		
		EvaaAJAX.Request(EvaaFE.Navigation.navigationHandler, EvaaFE.RegForm.current_step, "_step_refreshstep", "&_evaa_step&" + Form.serialize("Evaa_Form"));
	},
	
	navigationHandler: function(originalRequest){
		EvaaFE.RegForm.activeElementId = "";
		if(document.activeElement && document.activeElement.id){
			EvaaFE.RegForm.activeElementId = document.activeElement.id;
		}
		
		$("Evaa_Form").update(originalRequest.responseText);
		Ext.get("Evaa_Form").unmask();
		
		if(EvaaFE.RegForm.activeElementId != ""){
			setTimeout(function(){try{Form.Element.activate(EvaaFE.RegForm.activeElementId)}catch(e){} }, 100);
		}
	}
	
}



EvaaFE.UploadHandler = function(uploadIdentifier, uploadedFilename, error){
	if(error == ""){
		$(uploadIdentifier).value = uploadedFilename;
	}else{
		$(uploadIdentifier).value = "";
	}
}
