var currHelp=0;
var currErrorType='';
var validation;
var responses;
var fieldMap;
var errorMsg='';
var quicklink_clone;
var page_check_required=false;
var page_plan_num=0;
var current_question_id=-1;
var current_ctl=null;
var disabled_back_color='#D4D0C8';
var disabled_fore_color='black';
function setupBackend(request_print){
	if(responses){
		cloneQuickLinks();
		buildQuickLinks();
	}
	page_plan_num=document.getElementById('page_plan_num').value;
	var elem=document.getElementById('check_required');
	if(elem&&elem.value==1){page_check_required=true;}
	if(document.getElementById('read_only').value==1){lockAll();}
	else{
		if(page_plan_num>0){
			prepareValidationRules(page_plan_num);
			activateAllControls();
			validateAll(page_plan_num,true,true,page_check_required,true);
		}
	}
	bringSelectedIframeToTop(true);
	if(request_print==1){
		var session_id=document.getElementById('db_session_id').value;
		window.open('survey.php?db_session_id='+session_id+'&print=1');
	}
}
function lockAll(){
	lockControlsByTag('input');
	lockControlsByTag('select');
}
function lockControlsByTag(tag){
	var elems=document.getElementsByTagName(tag);
	for(var idx=0;idx<elems.length;idx++){
		if(elems[idx].id.substr(0,2)=='d_'){
			turnControlOnOff(elems[idx],false,true);
		}
	}
}
function formSubmit(nav_type){
	if(validateSevere(page_plan_num)){
		if(nav_type.length>0){
			document.getElementById('nav_button').value=nav_type;
		}
		document.getElementById('form1').submit();
	}else{
		document.getElementById('quicklink').selectedIndex=0;
	}
}
function cloneQuickLinks(){
	var sel=document.getElementById('quicklink');
	if(sel){
		quicklink_clone=sel.cloneNode(true);
	}
}
function buildQuickLinks(){
	if(!quicklink_clone){
		return;
	}
	var sel=document.getElementById('quicklink');
	var links=quicklink_clone.getElementsByTagName('option');
	while(sel.options.length>0){
		sel.remove(0);
	}
	var pattern1=/^(qlAll)|(qlNone1)$/;
	var pattern2='';
	var pattern3='';
	var idx=0;
	var plans=responses.surveyresponses_session['1'].MedPlansOffered;
	if(plans&&parseInt(plans.substr(0,1),10)>0){
		for(idx=1;idx<=parseInt(plans.substr(0,1),10);idx++){
			if(pattern2.length>0){
				pattern2=pattern2+'|';
			}
			pattern2=pattern2+'(qlActive'+String(idx)+')';
		}
	}
	plans=responses.surveyresponses_session['1'].RetireeMedPlansOffered;
	if(plans&&parseInt(plans.substr(0,1),10)>0){
		for(idx=1;idx<=parseInt(plans.substr(0,1),10);idx++){
			if(pattern3.length>0){
				pattern3=pattern3+'|';
			}
			pattern3=pattern3+'(qlRetiree'+String(idx)+')';
		}
	}else{
		pattern3='(qlRetiree0)';
	}
	if(pattern2.length>0){
		pattern2=new RegExp('^'+pattern2+'$');
	}else{
		pattern2=/^NA$/;
	}
	if(pattern3.length>0){
		pattern3=new RegExp('^'+pattern3+'$');
	}else{
		pattern3=/^NA$/;
	}
	for(var i=0;i<links.length;i++){
		if(links[i].className.match(pattern1)||links[i].className.match(pattern2)||links[i].className.match(pattern3)){
			sel.appendChild(links[i].cloneNode(true));
		}
	}
	sel.selectedIndex=0;
}
function showClientIDLookup(){
	document.getElementById('ClientLookupDiv').style.display='block';document.getElementById('StartSurveyDiv').style.display='none';document.getElementById('RestoreSurveyDiv').style.display='none';}
function showBlankClientID(){
	document.getElementById('ClientLookupDiv').style.display='none';
	document.getElementById('StartSurveyDiv').style.display='block';
	document.getElementById('RestoreSurveyDiv').style.display='none';
}
function showRestoreClientID(){
	document.getElementById('ClientLookupDiv').style.display='none';
	document.getElementById('StartSurveyDiv').style.display='none';
	document.getElementById('RestoreSurveyDiv').style.display='block';
}
function showUserInfo(){
	var elem=document.getElementById('UserInfo');
	if(elem){
		elem.style.display='block';
	}
}
function clearAll(){
	var elems=document.getElementsByTagName('body');clearElement(elems[0]);
}
function clearElement(elem){
	if(elem.name){
		for(var idx_tbl=0;idx_tbl<responses.length;idx_tbl++){
			for(var idx_plan=0;idx_plan<responses[tbl].length;idx_plan++){
				if(isset(responses[idx_tbl][idx_plan][str_replace('d_','',elem.name)])){
					responses[tbl][plan_num][str_replace('d_','',elem.name)]='';
				}
			}
		}
	switch(elem.type){
		case'text':
		case'select-one':
			elem.value='';
			break;
		case'radio':
		case'checkbox':
			elem.checked=false;
			break;
		}
	}
	for(var idx=0;idx<elem.childNodes.length;idx++){
		clearElement(elem.childNodes[idx]);
	}
}
function activateAllControls(){
	for(var question_id in validation){
		activateQuestion(question_id,page_plan_num);
	}
}
function activateQuestion(question_id,plan_num){
	for(var field in validation[question_id]){
		activateControl(question_id,field,plan_num);
	}
}
function activateControl(question_id,field,plan_num){
	var active;
	if(validation[question_id]&&validation[question_id][field]){
		for(var rule in validation[question_id][field]){
			var validation_type=validation[question_id][field][rule].ValidationType;
			if(validation_type=='active if compare field is value'||validation_type=='active if custom'||validation_type=='active if'){
				var tbl=validation[question_id][field][rule].TargetTable;
				if(validation_type=='active if'){
					var equation=validation[question_id][field][rule].Equation;
					active=validateActiveIf(equation);
				}else{
					active=validateActiveIfCustom(question_id,tbl,field);
				}
				turnControlNameOnOff(tbl,field,plan_num,active);
			}
		}
	}
}
function turnControlNameOnOff(tbl,field,plan_num,active){
	if(!active&&responses[tbl]&&responses[tbl][plan_num]&&responses[tbl][plan_num][field]){
		responses[tbl][plan_num][field]='';
	}
	var ctls=document.getElementsByName('d_'+field);
	for(var idx=0;idx<ctls.length;idx++){
		ctl=ctls[idx];turnControlOnOff(ctl,active,active);
	}
	return;
}
function turnControlOnOff(ctl,enabled,active){
	var backcolor='white';
	var color='black';
	if(!enabled){
		backcolor=disabled_back_color;
		color=disabled_fore_color;
	}
	if(ctl.disabled==enabled){
		ctl.disabled=!enabled;
		switch(ctl.type){
			case'text':
			case'select-one':
				if(!active){ctl.value='';}
				ctl.style.backgroundColor=backcolor;
				ctl.style.color=color;
				break;
			case'radio':
			case'checkbox':
				if(!active){ctl.checked=false;}
				break;
			default:
				alert(ctl.type);
				break;
		}
	}
}
function validateControl(event,control){
	var oldValue='';
	var field=control.name.substr(2);
	var info=fieldMap[control.name];
	var tbl=info.table;
	var question_id=info.question_id;
	var plan=page_plan_num;
	if(responses[tbl][plan][field]){
		oldValue=responses[tbl][plan][field];
	}
	responses[tbl][plan][field]='';
	if(event.type=='click'||event.type=='focus'||event.type=='change'){
		current_ctl=control;
		current_question_id=question_id;
	}else{
		current_ctl=null;
		current_question_id=-1;
	}
	if(event.type=='click'){
		if(control.checked){
			responses[tbl][plan][field]=control.value;
		}
	}else{
		var ctls=document.getElementsByName(control.name);
		for(var idx=0;idx<ctls.length;idx++){
			ctl=ctls[idx];
			if(ctl.type=='radio'||ctl.type=='checkbox'){
				if(ctl.checked===true){
					responses[tbl][plan][field]=trim(ctl.value);
					break;
				}
			}else{
				if(trim(ctl.value)!==''){
					responses[tbl][plan][field]=trim(ctl.value);
					break;
				}
			}
		}
	}
	if((field=='MedPlansOffered'||field=='RetireeMedPlansOffered')&&oldValue!=responses[tbl][plan][field]){
		buildQuickLinks();
	}
	activateAllControls();
	if(event.type=='focus'){
		validateQuestion(question_id,plan,true,true,page_check_required,true);
	}else{
		validateAll(page_plan_num,true,true,page_check_required,true);
	}
}
function setQuestionError(question_id,error_type){
	var error_icon=document.getElementById('error_'+question_id);
	var warning_icon=document.getElementById('warning_'+question_id);
	var help_icon=document.getElementById('help_'+question_id);
	if(error_type===''){
		if(warning_icon){
			warning_icon.style.display='none';
		}
		if(error_icon){
			error_icon.style.display='none';
		}
		if(help_icon){
			help_icon.style.display='block';
		}
	}else if(error_icon&&(error_type=='Error'||error_type=='Severe')){
		if(help_icon){
			help_icon.style.display='none';
		}
		if(warning_icon){
			warning_icon.style.display='none';
		}
		error_icon.style.display='block';
	}else if(warning_icon&&(!error_icon||error_icon.style.display=='none')){
		if(help_icon){
			help_icon.style.display='none';
		}
		warning_icon.style.display='block';
	}
}
function setControlError(field,error_type){
	var ctls=document.getElementsByName('d_'+field);
	var back_color='';
	var fore_color='black';
	switch(error_type){
		case'Warning':
		case'Required':
			back_color='rgb(255,255,0)';
			break;
		case'Error':
		case'Severe':
			back_color='rgb(153,0,0)';
			fore_color='white';
			break;
	}
	for(idx=0;idx<ctls.length;idx++){
		ctl=ctls[idx];
		if(!ctl.disabled&&(ctl.type=='text'||ctl.type=='select-one')){
			ctl.style.backgroundColor=back_color;ctl.style.color=fore_color;
		}
	}
}
function getQuestionErrorIDs(question_id,plan_num,checkSevere,checkError,checkRequired,checkWarning){
	var values;
	var error_ids=[];
	var highest_error_type='';
	for(var field in validation[question_id]){
		values=getControlErrorIDs(question_id,field,plan_num,checkSevere,checkError,checkRequired,checkWarning);
		if(values.error_ids.length>0){
			for(var err in values.error_ids){
				error_ids[error_ids.length]=values.error_ids[err];
			}
		}
	}
	return error_ids;
}
function getControlErrorIDs(question_id,field,plan_num,checkSevere,checkError,checkRequired,checkWarning){
	var error=false;
	var error_ids=[];
	var highest_error_type='';
	if(validation[question_id]&&validation[question_id][field]){
		for(var rule_idx in validation[question_id][field]){
			result=true;
			rule=validation[question_id][field][rule_idx];
			var error_type=rule.ErrorType;
			if(rule.TriggerOnQuestion==1||current_question_id!=question_id){
				if((checkSevere&&error_type=='Severe')||(checkError&&error_type=='Error')||(checkRequired&&error_type=='Required')||(checkWarning&&error_type=='Warning')){
					result=validateRule(rule,plan_num);
					if(!result){
						error_ids[error_ids.length]=rule.FieldValidationID;
						switch(error_type){
							case'Severe':
								highest_error_type=error_type;
								break;
							case'Error':
								if(highest_error_type!='Severe'){
									highest_error_type=error_type;
								}
								break;
							case'Required':
								if(highest_error_type!='Severe'&&highest_error_type!='Error'){
									highest_error_type=error_type;
								}
								break;
							default:
								highest_error_type=error_type;
								break;
						}
					}
				}
			}
		}
	}
	return{'ErrorType':highest_error_type,'error_ids':error_ids};
}
function showHelp(event,question_id){
	if(document.getElementById('userDialog').style.display!='none'){
		return;
	}
	var plan_num=document.getElementById('page_plan_num').value;
	var error_list='';
	var error_ids=getQuestionErrorIDs(question_id,plan_num,true,true,page_check_required,true);
	for(var idx=0;idx<error_ids.length;idx++){
		if(error_list.length>0){
			error_list+=',';
		}
		error_list+=error_ids[idx];
	}
	var session_id=document.getElementById('db_session_id').value;
	var url='get_help.php?question_id='+question_id+'&error_ids='+error_list+'&plan_num='+page_plan_num+'&db_session_id='+session_id;
	var help=document.getElementById('helpWindow');
	if(help.style.display=='block'&&currHelp==question_id){
		help.style.display='none';
	}else{
		help.style.display='block';
		help.src=url;
		if(event.clientX<(document.body.clientWidth/2)){
			help.style.left=(event.clientX+20)+'px';
		}else{
			help.style.left=(event.clientX-370)+'px';
		}
		help.style.top=event.clientY+'px';
		currHelp=question_id;
	}
}
function showError(message){
	var divTag=document.getElementById('errorWindow');
	var pTag=document.getElementById('errorMsg');
	errorMsg=errorMsg+'<br />'+message;
	if(divTag){
		divTag.style.display='block';
		if(pTag){
			pTag.innerHTML=errorMsg;
		}
	}
}
function closeHelp(){
	var divTag=document.getElementById('helpWindow');
	divTag.style.display='none';
}
function showSaveOptions(event){
	var frm=document.getElementById('userDialog');
	var shd=document.getElementById('shield');
	closeHelp();
	if(frm&&frm.style.display=='none'){
		frm.style.display='block';
		frm.src='save_options.php?page_num='+document.getElementById('page_num').value+'&db_session_id='+document.getElementById('db_session_id').value;
		frm.style.left=(event.clientX-(parseInt(frm.style.width,10)/2))+'px';
		frm.style.top=(event.clientY-100)+'px';
		shd.style.display='block';
	}
}
function save(save_option){
	var save_action=document.getElementById('save_action');
	save_action.value=save_option;
	closeUserDialog();
	formSubmit('save');
}
function quit(){
	closeUserDialog();
	formSubmit('quit');
}
function closeUserDialog(){
	document.getElementById('userDialog').style.display='none';
	document.getElementById('shield').style.display='none';
}
function adjustIFrameSize(frm){
	if(frm){
		var textHeight=100;
		frm.style.height=textHeight+'px';
		if(frm.contentWindow.document&&frm.contentWindow.document.body.scrollHeight){
			textHeight=frm.contentWindow.document.body.scrollHeight;
		}else if(frm.contentDocument&&frm.contentDocument.body.offsetHeight){
			textHeight=frm.contentDocument.body.offsetHeight;
		}
		frm.style.height=textHeight+'px';
	}
}
function isInt(x){
	var regex=/^(\d*)$/;
	return x.match(regex);
}
