You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1526 lines
						
					
					
						
							58 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							1526 lines
						
					
					
						
							58 KiB
						
					
					
				
								#!/usr/bin/perl
							 | 
						|
								#
							 | 
						|
								# $Id: tqrs.pl,v 1.42 2006/11/08 21:40:29 ddoughty Exp $
							 | 
						|
								#
							 | 
						|
								# Source File: tqrs.pl
							 | 
						|
								
							 | 
						|
								# Get config
							 | 
						|
								require 'sitecfg.pl';
							 | 
						|
								require 'testlib.pl';
							 | 
						|
								require 'sbalib.pl';
							 | 
						|
								require 'tstatlib.pl';
							 | 
						|
								
							 | 
						|
								&app_initialize;
							 | 
						|
								
							 | 
						|
								print "Content-Type: text/html\n\n";
							 | 
						|
								
							 | 
						|
								if (&get_session($FORM{'tid'})) {
							 | 
						|
									################################################################
							 | 
						|
									# REMEDIATION FIX
							 | 
						|
									# Clear the remediation
							 | 
						|
									$FORM{'remediateonpost'} = "";
							 | 
						|
									################################################################
							 | 
						|
									$FORM{'submit'}=~ tr/+/ /;
							 | 
						|
									&LanguageSupportInit();
							 | 
						|
								
							 | 
						|
									## DED 2005-11-09
							 | 
						|
									#  Check for rotating IP
							 | 
						|
									&get_test_profile( $SESSION{'clid'}, $FORM{'tstid'});
							 | 
						|
									if ($TEST{'tstalwrotip'} ne 'Y' && $SESSION{'ipaddr'} ne $ENV{'REMOTE_ADDR'} ) {
							 | 
						|
									       &logger::logwarn("SESSION{'ipaddr'} ($SESSION{'ipaddr'}) !== ENV{'REMOTE_ADDR'} ($ENV{'REMOTE_ADDR'}) for session ID $FORM{'tid'} on test ID $FORM{'tstid'}");
							 | 
						|
										&show_illegal_access_warning("user");
							 | 
						|
										exit();
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									&get_test_sequence( $SESSION{'clid'}, $SESSION{'uid'}, $FORM{'tstid'});
							 | 
						|
								
							 | 
						|
								# Test to see if the Pre-test Survey has been completed.
							 | 
						|
								# It will not be given a second time.
							 | 
						|
								# HBI - 2009/01/05
							 | 
						|
									my $trash3 = join($pathsep, $testcomplete, "$SESSION{'clid'}.$SESSION{'uid'}.$TEST_SESSION{'profb'}");
							 | 
						|
									if (-e $trash3) {
							 | 
						|
										$TEST_SESSION{'profb'} = "" ;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									@tsbt = ( 	$TEST_SESSION{'dscl'}, $TEST_SESSION{'profb'}, $TEST_SESSION{'tstid'},
							 | 
						|
												$TEST_SESSION{'profa'}, $TEST_SESSION{'srvy'} );
							 | 
						|
									$tlastsubtest = 2;
							 | 
						|
									for (0 .. $#tsbt) {
							 | 
						|
										if ($tsbt[$_] ne '') {$tlastsubtest = $_ ;}
							 | 
						|
									}
							 | 
						|
									($tstate,$tsubtest,$tqno) = split(/\./, $TEST_SESSION{'state'});
							 | 
						|
								#&dbgprint("Tstate= $tstate Tsubtest= $tsubtest \n");
							 | 
						|
								        &log_test_stats();
							 | 
						|
									if (($FORM{'submit'} eq "$xlatphrase[6]") || ($FORM{'submit'} eq "$xlatphrase[5]")) {
							 | 
						|
										my $anonflags = join(';',$SESSION{'anonymity'},"$tsubtest.$tsbt[$tsubtest].$FORM{'anonsubmit'}");
							 | 
						|
										&set_session($SESSION{'tid'},"anonymity",$anonflags);
							 | 
						|
									}
							 | 
						|
								####################################################
							 | 
						|
								# TIME EXPIRED					   #
							 | 
						|
								# This is no longer used, replaced by texp.pl      #
							 | 
						|
								####################################################
							 | 
						|
									if ($tstate eq $TEST_STATES{'_TERMINATED'}) {
							 | 
						|
								## TERMINATED BY ADMIN
							 | 
						|
										&terminated_by_administrator();
							 | 
						|
										&make_anonymous();
							 | 
						|
									} elsif ($tstate eq $TEST_STATES{'_PAUSED_BY_USER'}) {
							 | 
						|
										if ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
								## RESUME BUTTON
							 | 
						|
											&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Resume $TEST{'id'}", $FORM{'tmreset'});
							 | 
						|
											($tstate,$tsubtest,$tqno) = split(/\./, $TEST_SESSION{'state'});
							 | 
						|
											&get_client_profile($TEST_SESSION{'clid'});
							 | 
						|
								## v support for wilcard login
							 | 
						|
								# (replaced)
							 | 
						|
								#			&get_candidate_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'});
							 | 
						|
								# (with)
							 | 
						|
											if ($SESSION{'taclid'} eq '') {
							 | 
						|
												&get_candidate_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'});
							 | 
						|
											} else {
							 | 
						|
												&get_tacl_profile();
							 | 
						|
											}
							 | 
						|
								## ^ support for wilcard login
							 | 
						|
											$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
											&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
											my @resps = split('&', $SUBTEST_RESPONSES{$tsubtest});
							 | 
						|
											@stqids = split(/&/, $SUBTEST_QUESTIONS{$tsubtest});
							 | 
						|
											$TEST_SESSION{'noq'} = $#stqids;
							 | 
						|
											### DED 3/9/05 Check for review mode
							 | 
						|
											if ($#resps == $TEST_SESSION{'noq'}) {
							 | 
						|
												$FORM{'review'} = $tqno;
							 | 
						|
											}
							 | 
						|
											@resp = ();
							 | 
						|
											if ($TEST{'emlstartopt'} eq 'Y' && $TEST{'ntfy'} ne '') {
							 | 
						|
										                if ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
													&send_resume_notification();
							 | 
						|
												} else {
							 | 
						|
													&send_start_notification();
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											if ($TEST{'emlstartropt'} eq 'Y' && &get_a_key("cnd.$CLIENT{'clid'}", $CANDIDATE{'createdby'}, "registrar") eq 'Y') {
							 | 
						|
												$registrareml = &get_a_key("cnd.$CLIENT{'clid'}", $CANDIDATE{'createdby'}, "eml");
							 | 
						|
												if ($registrareml ne '') {
							 | 
						|
													if ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
														&send_resume_notification($registrareml);
							 | 
						|
													} else {
							 | 
						|
														&send_start_notification($registrareml);
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											if (($TEST{'seq'} eq 'std') || ($TEST{'seq'} eq 'svy') || $TEST{'seq'} eq 'dmg') {
							 | 
						|
												$tstate = $TEST_STATES{'_IN_PROGRESS'};
							 | 
						|
												$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
												$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
												if ($TEST{'seq'} eq 'svy') {
							 | 
						|
													$tqno=0; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
													&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
													&show_single_form_test();
							 | 
						|
												} elsif ($TEST{'seq'} eq 'dmg' && $TEST{'group'} eq 'Y') {
							 | 
						|
														if ($TEST{'cnl'} eq '1') {
							 | 
						|
															$tqno=1;
							 | 
						|
														} else {
							 | 
						|
															$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
														}
							 | 
						|
														$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
														&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
														&show_group($tsubtest, $tqno);
							 | 
						|
												} else { 	# must be std
							 | 
						|
													if ($TEST{'cnl'} eq '1') {
							 | 
						|
														$tqno=1;
							 | 
						|
													} else {
							 | 
						|
														$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
													}
							 | 
						|
													$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
													&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
													&show_question($tsubtest, $tqno);
							 | 
						|
												}
							 | 
						|
											} elsif ($TEST{'seq'} eq 'cfa') {
							 | 
						|
												&resume_cfa();
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											$TEST_SESSION{'navbuttons'}=&set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
											&show_template("illentry");
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										&get_client_profile($TEST_SESSION{'clid'});
							 | 
						|
								## v support for wilcard login
							 | 
						|
								# (replaced)
							 | 
						|
								#		&get_candidate_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'});
							 | 
						|
								# (with)
							 | 
						|
										if ($SESSION{'taclid'} eq '') {
							 | 
						|
											&get_candidate_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'});
							 | 
						|
										} else {
							 | 
						|
											&get_tacl_profile();
							 | 
						|
										}
							 | 
						|
								## ^ support for wilcard login
							 | 
						|
										### DED 11/1/2002 Changed from subtst to tstid so notify
							 | 
						|
										###		  check will work
							 | 
						|
										&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'tstid'});
							 | 
						|
										### DED 8/19/2002 Replaced following line to promote_test_seq
							 | 
						|
										###	when doing a survey before the test
							 | 
						|
										#if ($FORM{'submit'} eq "$xlatphrase[548]" || $FORM{'submit'} eq "$xlatphrase[550]" )
							 | 
						|
										if ($FORM{'submit'} eq "$xlatphrase[548]" || $FORM{'submit'} eq "$xlatphrase[550]" || $FORM{'submit'} eq "$xlatphrase[551]" || $FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
								## START OR REVIEW CFA BUTTON OR RESUME
							 | 
						|
											&promote_test_sequence( $testpending, $testinprog, $TEST_STATES{'_PENDING'});
							 | 
						|
											if ($FORM{'submit'} eq "$xlatphrase[548]" || $FORM{'submit'} eq "$xlatphrase[551]") {
							 | 
						|
												$starttime = &format_date_time("dd-mmm-yyyy hh:nn:ss GMT", "1", "0");
							 | 
						|
												&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Start $TEST{'id'}", $starttime);
							 | 
						|
											} elsif ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
												&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Resume $TEST{'id'}");
							 | 
						|
											} else {
							 | 
						|
												&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Review CFA $TEST{'id'}");
							 | 
						|
											}
							 | 
						|
											if ($TEST{'emlstartopt'} eq 'Y' && $TEST{'ntfy'} ne '') {
							 | 
						|
								                       		### hkh 03/04 differentiate start & resume bug#76
							 | 
						|
										              	if ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
													&send_resume_notification();
							 | 
						|
												} else {
							 | 
						|
													&send_start_notification();
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
											if ($TEST{'emlstartropt'} eq 'Y' && &get_a_key("cnd.$CLIENT{'clid'}", $CANDIDATE{'createdby'}, "registrar") eq 'Y') {
							 | 
						|
												$registrareml = &get_a_key("cnd.$CLIENT{'clid'}", $CANDIDATE{'createdby'}, "eml");
							 | 
						|
												if ($registrareml ne '') {
							 | 
						|
													if ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
														&send_resume_notification($registrareml);
							 | 
						|
													} else {
							 | 
						|
														&send_start_notification($registrareml);
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										### DED 11/01/2002 Moved 2 lines from above so notify works
							 | 
						|
										$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
										&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
										($tstate,$tsubtest,$tqno) = split(/\./, $TEST_SESSION{'state'});
							 | 
						|
										if ($tstate eq $TEST_STATES{'_PENDING'}) {
							 | 
						|
											$tstate = $TEST_STATES{'_IN_PROGRESS'};
							 | 
						|
											$tsubtest = 0;
							 | 
						|
											while ($tsbt[$tsubtest] eq '' && $tsubtest < 5) {$tsubtest++;}
							 | 
						|
											$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
											if ($tsubtest < 5) {
							 | 
						|
												&get_subtest_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
												$TEST_SESSION{'tmreset'} = $SUBTEST{'maxtmfmt'};
							 | 
						|
											}
							 | 
						|
											$tstate = $TEST_STATES{'_IN_PROGRESS'};
							 | 
						|
											$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
											$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
											@stqids = split(/&/, $SUBTEST_QUESTIONS{$tsubtest});
							 | 
						|
											$TEST_SESSION{'noq'} = $#stqids;
							 | 
						|
											if ($tsubtest eq 0) {
							 | 
						|
												$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
												&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
												$TEST_SESSION{'navbuttons'}=&set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
												if ($SUBTEST{'cfa'} eq '') {
							 | 
						|
													@dscllines = &get_data("$TEST_SESSION{'subtest'}.$TEST_SESSION{'clid'}");
							 | 
						|
													$dscltext = "";
							 | 
						|
													foreach $dsclline (@dscllines) {
							 | 
						|
														$dsclline =~ s/\r//g;
							 | 
						|
														$dsclline =~ s/\n//g;
							 | 
						|
														$dscltext = join('<BR>', $dscltext, $dsclline);
							 | 
						|
													}
							 | 
						|
													$TEST_SESSION{'agreement'} = $dscltext;
							 | 
						|
												} else {
							 | 
						|
													$TEST_SESSION{'agreement'} = $SUBTEST{'cfa'};
							 | 
						|
												}
							 | 
						|
												&show_template("agreement");
							 | 
						|
											} else {
							 | 
						|
												&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
												if ($TEST{'seq'} eq 'svy') {
							 | 
						|
													$tqno=0; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
													&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
													&show_single_form_test();
							 | 
						|
												} elsif ($TEST{'seq'} eq 'dmg' && $TEST{'group'} eq 'Y') {
							 | 
						|
														$tqno=1; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
														$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
														&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
														&show_group($tsubtest, $tqno);
							 | 
						|
												} else {
							 | 
						|
								#
							 | 
						|
								# Worksheet printing support
							 | 
						|
								#
							 | 
						|
													if ($TEST{'Ins'} ne '') {
							 | 
						|
														$tqno=0; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
														$QUESTION{'id'} = "0";
							 | 
						|
														&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
														&show_test_worksheets($TEST_SESSION{'clid'}, $TEST{'id'});
							 | 
						|
													} else {
							 | 
						|
														$tqno=1; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
														$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
														&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
														&show_question($tsubtest, $tqno);
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										} elsif ($tstate eq $TEST_STATES{'_IN_PROGRESS'}) {
							 | 
						|
											&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
								################################################################
							 | 
						|
								# REMEDIATION FIX
							 | 
						|
								# do a little magic to remediate the last question if
							 | 
						|
								# remediation is on posting of answer
							 | 
						|
								#	if the done button was submitted, then change to next button
							 | 
						|
								#	if the OK button was submitted and this is the last question
							 | 
						|
								#		then change it to the done button.
							 | 
						|
								################################################################
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:190 Done button\n");
							 | 
						|
											if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
												if (($FORM{'submit'} eq "$xlatphrase[5]") || ($FORM{'submit'} eq "$xlatphrase[6]")) {
							 | 
						|
								## DONE : CONTINUE BUTTONS
							 | 
						|
													if ($FORM{'RemediationOKButton'} ne "") {
							 | 
						|
														$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
														&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
														$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
														&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
														&put_question_response($tsubtest, $tqno);
							 | 
						|
								
							 | 
						|
														$FORM{'remediateonpost'} = &remediate_question($tsubtest,$tqno);
							 | 
						|
														$FORM{'remediateonpost'} .= "<input type=hidden name=\"RemediationOKButton\" value=\"$FORM{'submit'}\">";
							 | 
						|
														if ($FORM{'remediated'} ne "Y") {
							 | 
						|
								## CHANGE TO NEXT BUTTON
							 | 
						|
															$FORM{'submit'} = "$xlatphrase[3]";
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:206 Done button\n");
							 | 
						|
														}
							 | 
						|
														$FORM{'RemediationOKButton'} = "";
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													if ($FORM{'submit'} eq "$xlatphrase[566]") {
							 | 
						|
								## OK BUTTON - returning from remediation on posting of last question answer
							 | 
						|
														unless ($FORM{'RemediationOKButton'} eq "") {$FORM{'submit'} = $FORM{'RemediationOKButton'};}
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:214 $FORM{'submit'} $FORM{'RemediationOKButton'}\n");
							 | 
						|
													}
							 | 
						|
														$FORM{'RemediationOKButton'} = "";
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
								################################################################
							 | 
						|
											if ($FORM{'submit'} eq "$xlatphrase[488]") {
							 | 
						|
								## I DECLINE BUTTON
							 | 
						|
												$tstate=$TEST_STATES{'_IN_PROGRESS'};
							 | 
						|
												$tsubtest=0; $tqno=0;
							 | 
						|
												$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
												&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
												&promote_test_sequence($testinprog, $testcomplete, $TEST_STATES{'_DECLINED'});
							 | 
						|
												$TEST_SESSION{'navbuttons'} = &set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
												if ($TEST{'ntfy'} ne '') {
							 | 
						|
													&send_declined_notification();
							 | 
						|
												}
							 | 
						|
												&show_template("tdecline");
							 | 
						|
											} elsif ($FORM{'submit'} eq "$xlatphrase[542]") {
							 | 
						|
								## PAUSE BUTTON
							 | 
						|
												### DED 11/27/04 Save question before pausing
							 | 
						|
												### DED 09/16/05 do put_several if dmg & group
							 | 
						|
												if ($TEST{'seq'} eq 'dmg' && $TEST{'group'} eq 'Y') {
							 | 
						|
													$tmptqno = $tqno;
							 | 
						|
													&put_several_questions($tqno);
							 | 
						|
													# Reload last ques info
							 | 
						|
													$tqno = $tmptqno;
							 | 
						|
													$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
													&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
												} else {
							 | 
						|
													$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
													&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
													&put_question_response($tsubtest, $tqno);
							 | 
						|
												}
							 | 
						|
												&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Pause $TEST{'id'}");
							 | 
						|
												$tstate=$TEST_STATES{'_PAUSED_BY_USER'};
							 | 
						|
												$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
												$SUBTEST_SUMMARY{$tsubtest} = "Paused By User\&$FORM{'tmreset'}";
							 | 
						|
												&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
												$TEST_SESSION{'navbuttons'} = &set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
												if ($TEST{'emlpauseopt'} eq 'Y' && $TEST{'ntfy'} ne '') {
							 | 
						|
								                                	&send_pause_notification();
							 | 
						|
												}
							 | 
						|
												if ($TEST{'emlpauseropt'} eq 'Y' && &get_a_key("cnd.$CLIENT{'clid'}", $CANDIDATE{'createdby'}, "registrar") eq 'Y') {
							 | 
						|
													$registrareml = &get_a_key("cnd.$CLIENT{'clid'}", $CANDIDATE{'createdby'}, "eml");
							 | 
						|
													if ($registrareml ne '') {
							 | 
						|
														&send_pause_notification($registrareml);
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												&show_template("tpause");
							 | 
						|
											} elsif ($FORM{'submit'} eq "$xlatphrase[5]") {
							 | 
						|
								## DONE BUTTON
							 | 
						|
												$endtime = &format_date_time("dd-mmm-yyyy hh:nn:ss GMT", "1", "0");
							 | 
						|
												$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
												&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
												### DED 9/13/2005 Changed
							 | 
						|
												#if ( $tsubtest > 2 || $TEST{'scr'} eq '3' || $TEST{'emlcndopt'} ne 'Y') 
							 | 
						|
												### to
							 | 
						|
												if ( $tsubtest > 2 || $TEST{'scr'} eq '3' || !($TEST{'emlcndopt'} eq 'Y' || $TEST{'remt'} ne '0')) {
							 | 
						|
													if (($TEST{'seq'} eq 'svy') || ($TEST{'seq'} eq 'dmg')) {
							 | 
						|
														$TEST_SESSION{'message'} = "$xlatphrase[657]";
							 | 
						|
													} else {
							 | 
						|
														$TEST_SESSION{'message'} = "$xlatphrase[658]";
							 | 
						|
													}
							 | 
						|
													$tetmplt = "tend";
							 | 
						|
												} else {
							 | 
						|
													$tetmplt = "tsubend";
							 | 
						|
												}
							 | 
						|
												&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Complete $TEST{'id'}", "$endtime");
							 | 
						|
												if (($TEST{'seq'} eq 'svy') || ($TEST{'seq'} eq 'dmg' && $TEST{'group'} eq 'Y')) {
							 | 
						|
													$TEST{'bars'} = "N";
							 | 
						|
													&single_form_test_done();
							 | 
						|
												} else {
							 | 
						|
													if ($TEST{'emlcndopt'} ne 'Y') { $TEST{'bars'} = "N";}
							 | 
						|
													&test_is_done();
							 | 
						|
												}
							 | 
						|
												&make_anonymous();
							 | 
						|
											} elsif ($FORM{'submit'} eq "$xlatphrase[6]") {
							 | 
						|
								## CONTINUE BUTTON
							 | 
						|
												$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
												&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
												&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Section $TEST{'id'} Complete");
							 | 
						|
												if ($TEST{'seq'} eq 'svy') {
							 | 
						|
													&single_form_test_continue();
							 | 
						|
												} else {
							 | 
						|
													&test_continue();
							 | 
						|
												}
							 | 
						|
											} else {
							 | 
						|
												if ($FORM{'submit'} eq "$xlatphrase[487]") {
							 | 
						|
								## I ACCEPT BUTTON
							 | 
						|
								#&dbgprint("I ACCEPT BUTTON\n");
							 | 
						|
													$SUBTEST_RESPONSES{'0'} = $FORM{'submit'};
							 | 
						|
								#&dbgprint("\t$tsbt{'subtest'}:$tsubtest:$tqno\n");
							 | 
						|
													$tsubtest++;
							 | 
						|
													while ($tsbt[$tsubtest] eq '' && $tsubtest < 5) {$tsubtest++;}
							 | 
						|
													if ($tsubtest < 5) {
							 | 
						|
														$TEST_SESSION{'tmreset'} = $TEST{'maxtmfmt'};
							 | 
						|
													}
							 | 
						|
													$tqno=1;
							 | 
						|
								#&dbgprint("\t$tsbt{'subtest'}:$tsubtest:$tqno\n");
							 | 
						|
													&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
													$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
													&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
													### DED 2/22/05 Have to log after 
							 | 
						|
													#   get_test_profile so will log 
							 | 
						|
													#   correct subtest
							 | 
						|
													&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Start $TEST{'id'}");
							 | 
						|
								#&dbgprint("\tget_test_profile($TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'})\n");
							 | 
						|
												} elsif ($FORM{'submit'} eq "$xlatphrase[547]") {
							 | 
						|
								## RESUME BUTTON
							 | 
						|
												my @resps = split('&', $SUBTEST_RESPONSES{$tsubtest});
							 | 
						|
												@stqids = split(/&/, $SUBTEST_QUESTIONS{$tsubtest});
							 | 
						|
												$TEST_SESSION{'noq'} = $#stqids;
							 | 
						|
												### DED 3/9/05 Check for review mode
							 | 
						|
												if ($#resps == $TEST_SESSION{'noq'}) {
							 | 
						|
													$FORM{'review'} = $tqno;
							 | 
						|
												}
							 | 
						|
												@resp = ();
							 | 
						|
													&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
													&show_question($tsubtest, $tqno, $ntqno);
							 | 
						|
												} else {
							 | 
						|
								## ??? BUTTON
							 | 
						|
								#print STDERR "BUTTON:$FORM{'submit'}\n";
							 | 
						|
													$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
													&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
													if ($tqno ne 0) {
							 | 
						|
														$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
														&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
								################################################################
							 | 
						|
								# REMEDIATION FIX
							 | 
						|
								# don't do put_question_response
							 | 
						|
								# if returning from remediation display
							 | 
						|
								################################################################
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:305 tqno:$tqno FREM:$FORM{'remediated'}\n");
							 | 
						|
														if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
															if ($FORM{'remediated'} ne "Y") {
							 | 
						|
																&put_question_response($tsubtest, $tqno);
							 | 
						|
															}
							 | 
						|
														} else {
							 | 
						|
															if ($TEST{'seq'} eq 'dmg' && $TEST{'group'} eq 'Y') {
							 | 
						|
																&put_several_questions($tqno);
							 | 
						|
																# Reload last ques info
							 | 
						|
																$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
																&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
															} else {
							 | 
						|
																&put_question_response($tsubtest, $tqno);
							 | 
						|
															}
							 | 
						|
														}
							 | 
						|
								################################################################
							 | 
						|
													}
							 | 
						|
													&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
												}
							 | 
						|
												if ($tsubtest < 5) {
							 | 
						|
													@stqids = split(/&/, $SUBTEST_QUESTIONS{$tsubtest});
							 | 
						|
													$TEST_SESSION{'noq'} = $#stqids;
							 | 
						|
													$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
													&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
													if (($TEST{'seq'} eq 'std') || ($TEST{'seq'} eq 'svy') || ($TEST{'seq'} eq 'dmg')) {
							 | 
						|
														if (($FORM{'submit'} eq $xlatphrase[543])
							 | 
						|
															|| ($FORM{'submit'} eq $xlatphrase[544])) {
							 | 
						|
								## REVIEW BUTTON
							 | 
						|
															$tqno = &find_next_marked($tsubtest, $tqno);
							 | 
						|
															$ntqno = &find_next_marked($tsubtest, $tqno);
							 | 
						|
														} elsif ($FORM{'submit'} eq "$xlatphrase[93]") {
							 | 
						|
								## BEGIN BUTTON
							 | 
						|
															$tqno++;
							 | 
						|
														} elsif ($FORM{'submit'} eq "$xlatphrase[566]") {
							 | 
						|
								## OK BUTTON - returning from remediation on posting of answer
							 | 
						|
															$tqno++;
							 | 
						|
														} elsif ($FORM{'submit'} eq "$xlatphrase[3]") {
							 | 
						|
								## NEXT BUTTON
							 | 
						|
								
							 | 
						|
															if (($TEST{'Ins'} ne '') && ($tsubtest == 2)
							 | 
						|
																&& ($TEST{'seq'} ne 'svy') && ($tqno == 0)) {
							 | 
						|
																#
							 | 
						|
																# Worksheet printing support
							 | 
						|
																#
							 | 
						|
																$tqno=0; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
																$QUESTION{'id'} = "0";
							 | 
						|
																&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
																&show_test_worksheets($TEST_SESSION{'clid'}, $TEST{'id'});
							 | 
						|
															} else {
							 | 
						|
																### DED 9/17/02  Support for Fork (mca) questions
							 | 
						|
																if ($QUESTION{'qtp'} eq 'mca') {
							 | 
						|
																@qnxt = split(/\;/, $QUESTION{'qnxt'});
							 | 
						|
																if ($TEST{'group'} eq 'Y') {
							 | 
						|
								                                                               		$nextq = $qnxt[$FORM{"q$tqno-qrs"}];
							 | 
						|
												      				} else {
							 | 
						|
								                                                               		$nextq = $qnxt[$FORM{'qrs'}];
							 | 
						|
								                                                       		}
							 | 
						|
																	for (1 .. $#stqids) {
							 | 
						|
																		if ($stqids[$_] eq $nextq) {
							 | 
						|
																			$tqno = $_;
							 | 
						|
								#&dbgprint("MCA: nextq:$nextq tqno:$tqno\n");
							 | 
						|
																		}
							 | 
						|
																	}
							 | 
						|
																} else {
							 | 
						|
								### Support for question grouping on dmg surveys
							 | 
						|
																	if ($TEST{'group'} eq 'Y') {
							 | 
						|
								                                                                        	$tqno=$FORM{'qno'};
							 | 
						|
								                                                                	}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								################################################################
							 | 
						|
								# REMEDIATION FIX
							 | 
						|
								# don't increment question_no unless
							 | 
						|
								# returning from remediation display
							 | 
						|
								################################################################
							 | 
						|
								#									if ($tqno ne $TEST_SESSION{'noq'}) {$tqno++;}
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:360 nextq:$nextq tqno:$tqno FREM:$FORM{'remediated'}\n");
							 | 
						|
																	if ($tqno ne $TEST_SESSION{'noq'}) {
							 | 
						|
																		if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
																			if ($FORM{'remediated'} eq "Y" || $tqno == 0) {
							 | 
						|
																				$tqno++;
							 | 
						|
																			} else {
							 | 
						|
																				$FORM{'remediateonpost'} = &remediate_question($tsubtest,$tqno);
							 | 
						|
																				if ($FORM{'remediated'} eq "Y") {
							 | 
						|
																					$tqno++;
							 | 
						|
																				}
							 | 
						|
																			}
							 | 
						|
																		} else { $tqno++; }
							 | 
						|
								#my $remfixdbglen=length($FORM{'remediateonpost'});
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:371 tqno:$tqno FREM:$remfixdbglen\n");
							 | 
						|
																	}
							 | 
						|
								################################################################
							 | 
						|
																}
							 | 
						|
															}
							 | 
						|
														} elsif ($FORM{'submit'} eq "$xlatphrase[7]") {
							 | 
						|
								## BACK BUTTON
							 | 
						|
															if ($tqno ne 1 ) {$tqno--;}
							 | 
						|
														} elsif ($FORM{'submit'} eq "$xlatphrase[779]") {
							 | 
						|
								## JUMP TO BUTTON
							 | 
						|
															if ($FORM{'review'} eq "nextreview") {
							 | 
						|
																# Next in review list
							 | 
						|
																$tqno = &find_next_marked($tsubtest, $tqno);
							 | 
						|
																$ntqno = &find_next_marked($tsubtest, $tqno);
							 | 
						|
															} elsif ($FORM{'review'} eq "nextunanswered") {
							 | 
						|
																# Next unanswered
							 | 
						|
																$tqno = &find_next_unanswered($tsubtest, $tqno);
							 | 
						|
																$ntqno = &find_next_unanswered($tsubtest, $tqno);
							 | 
						|
															} else {
							 | 
						|
																$tqno=$FORM{'review'};
							 | 
						|
															}
							 | 
						|
														} elsif (($TEST{'Ins'} ne '') && ($tsubtest == 2)
							 | 
						|
																&& ($TEST{'seq'} ne 'svy')) {
							 | 
						|
														#
							 | 
						|
														# Worksheet printing support
							 | 
						|
														#
							 | 
						|
															$tqno=0; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
															$QUESTION{'id'} = "0";
							 | 
						|
															&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
															&show_test_worksheets($TEST_SESSION{'clid'}, $TEST{'id'});
							 | 
						|
														} else {
							 | 
						|
															$tqno=$tqno;
							 | 
						|
														}
							 | 
						|
								#&dbgprint("Test State Info:$tstate.$tsubtest.$tqno\n");
							 | 
						|
														$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
														$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
														if ($TEST{'seq'} eq 'svy') {
							 | 
						|
															$tqno=0; $TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
															&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
															&show_single_form_test();
							 | 
						|
														} elsif ($TEST{'seq'} eq 'dmg' && $TEST{'group'} eq 'Y') {
							 | 
						|
															$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
								                                                      	$SUBTEST_SUMMARY{$tsubtest} = "Time Remaining\&$FORM{'tmreset'}";
							 | 
						|
								                                                       	&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
								                                                       	&show_group($tsubtest, $tqno, $ntqno);
							 | 
						|
								                                               	} else {
							 | 
						|
								
							 | 
						|
															$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
								#&dbgprint("show_question($tsubtest,$tqno,$ntqno\n");
							 | 
						|
								################################################################
							 | 
						|
								# REMEDIATION FIX
							 | 
						|
								# do put_test_sequence and show question
							 | 
						|
								# unless remediation on posting
							 | 
						|
								################################################################
							 | 
						|
								#							$SUBTEST_SUMMARY{$tsubtest} = "Time Remaining\&$FORM{'tmreset'}";
							 | 
						|
								#							&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
								#							&show_question($tsubtest, $tqno, $ntqno);
							 | 
						|
								my $remfixdbglen=length($FORM{'remediateonpost'});
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:410 nextq:$nextq tqno:$tqno FSBMT:$FORM{'submit'} FREM:$remfixdbglen\n");
							 | 
						|
															if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
																if (($FORM{'submit'} eq $xlatphrase[566]) || ($FORM{'remediateonpost'} eq "")) {
							 | 
						|
																	$SUBTEST_SUMMARY{$tsubtest} = "Time Remaining\&$FORM{'tmreset'}";
							 | 
						|
																	&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
																	&show_question($tsubtest, $tqno, $ntqno);
							 | 
						|
																} else {
							 | 
						|
																	$QUESTION{'qno'} = $tqno;
							 | 
						|
																	&show_template("qrem");
							 | 
						|
																}
							 | 
						|
															} else {
							 | 
						|
																$SUBTEST_SUMMARY{$tsubtest} = "Time Remaining\&$FORM{'tmreset'}";
							 | 
						|
																&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
																&show_question($tsubtest, $tqno, $ntqno);
							 | 
						|
															}
							 | 
						|
								################################################################
							 | 
						|
														}
							 | 
						|
													} elsif ($TEST{'seq'} eq 'cfa') {
							 | 
						|
														&resume_cfa();
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													$TEST_SESSION{'navbuttons'}=&set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
													&show_template("tend");
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
											# test is completed
							 | 
						|
											$TEST_SESSION{'navbuttons'}=&set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
											&show_template("tend");
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub resume_cfa() {
							 | 
						|
									$tstate = $TEST_STATES{'_IN_PROGRESS'};
							 | 
						|
									$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
									$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									$TEST_SESSION{'navbuttons'}=&set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
									#&dbgprint("SubtCFA= $SUBTEST{'cfa'} TestCFA= $TEST{'cfa'} Tid= $TEST{'id'}\n");
							 | 
						|
								
							 | 
						|
									if ($TEST{'cfa'} eq '') {
							 | 
						|
										@dscllines = &get_data("$TEST_SESSION{'subtest'}.$TEST_SESSION{'clid'}");
							 | 
						|
										$dscltext = "";
							 | 
						|
										foreach $dsclline (@dscllines) {
							 | 
						|
											$dsclline =~ s/\r//g;
							 | 
						|
											$dsclline =~ s/\n//g;
							 | 
						|
											$dscltext = join('<BR>', $dscltext, $dsclline);
							 | 
						|
										}
							 | 
						|
										$TEST_SESSION{'agreement'} = $dscltext;
							 | 
						|
									} else {
							 | 
						|
										$TEST_SESSION{'agreement'} = $TEST{'cfa'};
							 | 
						|
									}
							 | 
						|
									&show_template("agreement");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# v sac anonymous submission support
							 | 
						|
								# sub make_anonymous - moved to testlib.pl 1/10/04 DED
							 | 
						|
								# ^ sac anonymous submission support
							 | 
						|
								
							 | 
						|
								# sub single_form_test_done - moved to testlib.pl 06/24/2006 DED
							 | 
						|
								# sub put_several_questions - moved to testlib.pl 06/24/2006 DED
							 | 
						|
								# sub check_for_custom_exit_file - moved to testlib.pl 06/24/2006 DED
							 | 
						|
								
							 | 
						|
								sub show_single_form_test {
							 | 
						|
									# show all questions on same page
							 | 
						|
									$notemplate = 1;
							 | 
						|
									$TEST{'heading'} = "<H1>$TEST{'desc'}</H1>";
							 | 
						|
									$TEST{'questions'} = "";
							 | 
						|
									$questhtml = "";
							 | 
						|
									$TEST_SESSION{'noq'}=$TEST{'noq'};
							 | 
						|
									for (1 .. $TEST{'noq'}) {
							 | 
						|
										$tqno = $_;
							 | 
						|
										$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
										&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
										$QUESTION{'anslist'}="";
							 | 
						|
										$qhtml = &show_question($tsubtest, $tqno);
							 | 
						|
										$question_row_html = "<TR>
							 | 
						|
								<TD align=\"left\">
							 | 
						|
								<HR>
							 | 
						|
								$QUESTION{'illustration'}<BR>
							 | 
						|
								<FONT SIZE=4>
							 | 
						|
								$_. $QUESTION{'qtx'}
							 | 
						|
								</FONT><BR>
							 | 
						|
								\ \;<BR>
							 | 
						|
								$QUESTION{'anslist'}<BR>
							 | 
						|
								</TD>
							 | 
						|
								</TR>\n";
							 | 
						|
										$qhtml=$QUESTION{'promptcomments'};
							 | 
						|
										$srch="=\"qcucmt";
							 | 
						|
										$repl="=\"q$_-qcucmt";
							 | 
						|
										$qhtml =~ s/$srch/$repl/g;
							 | 
						|
										if ($qhtml =~ /<TR>/) {
							 | 
						|
											$question_row_html = join('', $question_row_html, $qhtml, "\n");
							 | 
						|
										} else {
							 | 
						|
											$question_row_html = join('', $question_row_html, "<TR><TD>", $qhtml, "</TD></TR>\n");
							 | 
						|
										}
							 | 
						|
										$srch="=\"qrs";
							 | 
						|
										$repl="=\"q$_-qrs";
							 | 
						|
										$question_row_html =~ s/$srch/$repl/g;
							 | 
						|
										$questhtml = join('', $questhtml, $question_row_html);
							 | 
						|
									}
							 | 
						|
									$notemplate = 0;
							 | 
						|
									$question_row_html = "<TR>
							 | 
						|
								<TD align=\"left\">
							 | 
						|
								<HR>
							 | 
						|
								\ \;<BR>
							 | 
						|
								</TD>
							 | 
						|
								</TR>\n";
							 | 
						|
									$questhtml = join('', $questhtml, $question_row_html);
							 | 
						|
									$TEST{'questions'} = $questhtml;
							 | 
						|
									%QUESTION={};
							 | 
						|
									&show_template("qsvy");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_group {
							 | 
						|
									my $gtqno = $_[1];
							 | 
						|
									if ($#_ == 2) {
							 | 
						|
										my $gntqno = $_[2];
							 | 
						|
									}
							 | 
						|
									# group questions by subject area
							 | 
						|
									$notemplate = 1;
							 | 
						|
									# find subject area of current question
							 | 
						|
									&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
									($group_subj, $trash) = split(/\./, $QUESTION{'subj'});
							 | 
						|
									if ($TEST{'showsubj'} eq 'Y') {
							 | 
						|
										&get_subjarea($SESSION{'clid'}, $TEST{'id'}, $group_subj);
							 | 
						|
										$SUBJAREA{'desc'} =~ tr/+/ /;
							 | 
						|
										$TEST{'heading'} = "<H2>$TEST{'desc'}: $SUBJAREA{'desc'}</H2>";
							 | 
						|
									} else {
							 | 
						|
										$TEST{'heading'} = "<H2>$TEST{'desc'}</H2>";
							 | 
						|
									}
							 | 
						|
									# get question list based on subject area
							 | 
						|
									# ASSUME questions were grouped by subject area when testfile created
							 | 
						|
									$TEST{'questions'} = "";
							 | 
						|
									$questhtml = "";
							 | 
						|
									$TEST_SESSION{'noq'}=$TEST{'noq'};
							 | 
						|
									for $tqno ($gtqno .. $TEST{'noq'}) {
							 | 
						|
										$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
										&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
										($subj, $trash) = split(/\./, $QUESTION{'subj'});
							 | 
						|
										if ($subj ne $group_subj) { last; }  # Stop at end of subjarea
							 | 
						|
										$QUESTION{'anslist'}="";
							 | 
						|
										$qhtml = &show_question($tsubtest, $tqno);
							 | 
						|
										if ($CLIENT{'clid'} eq "tas") {
							 | 
						|
											$picalign = "right";
							 | 
						|
										}
							 | 
						|
										if ($picalign eq "right") {
							 | 
						|
											$question_row_html = "<TR>
							 | 
						|
								<TD colspan=2>
							 | 
						|
								<HR>
							 | 
						|
								</TD>
							 | 
						|
								</TR>
							 | 
						|
								<TR>
							 | 
						|
								<TD align=\"left\">";
							 | 
						|
										} else {
							 | 
						|
											$question_row_html = "<TR>
							 | 
						|
								<TD align=\"left\">
							 | 
						|
								<HR>
							 | 
						|
								$QUESTION{'illustration'}<BR>";
							 | 
						|
										}
							 | 
						|
										if ($TEST{'showsubj'} eq 'Y') {
							 | 
						|
											$question_row_html .= "<FONT SIZE=2><B>Question: ".$tqno."</B><BR><BR></FONT>\n";
							 | 
						|
										}
							 | 
						|
										$question_row_html .= "
							 | 
						|
								<FONT SIZE=4>
							 | 
						|
								$QUESTION{'qtx'}
							 | 
						|
								</FONT><BR>
							 | 
						|
								\ \;<BR>
							 | 
						|
								$QUESTION{'anslist'}<BR>
							 | 
						|
								</TD>";
							 | 
						|
										if ($picalign eq "right") {
							 | 
						|
											$question_row_html .= "
							 | 
						|
								<TD align=\"right\">
							 | 
						|
								$QUESTION{'illustration'}
							 | 
						|
								</TD>";
							 | 
						|
										}
							 | 
						|
										$question_row_html .= "
							 | 
						|
								</TR>\n";
							 | 
						|
										$qhtml=$QUESTION{'promptcomments'};
							 | 
						|
										$srch="=\"qcucmt";
							 | 
						|
										$repl="=\"q$tqno-qcucmt";
							 | 
						|
										$qhtml =~ s/$srch/$repl/g;
							 | 
						|
										if ($qhtml =~ /<TR>/) {
							 | 
						|
											$question_row_html = join('', $question_row_html, $qhtml, "\n");
							 | 
						|
										} else {
							 | 
						|
											$question_row_html = join('', $question_row_html, "<TR><TD>", $qhtml, "</TD></TR>\n");
							 | 
						|
										}
							 | 
						|
										$srch="=\"qrs";
							 | 
						|
										$repl="=\"q$tqno-qrs";
							 | 
						|
										$question_row_html =~ s/$srch/$repl/g;
							 | 
						|
										$questhtml = join('', $questhtml, $question_row_html);
							 | 
						|
									}
							 | 
						|
									$notemplate = 0;
							 | 
						|
									$question_row_html = "<TR>";
							 | 
						|
									if ($picalign eq "right") {
							 | 
						|
										$question_row_html .= "<TD colspan=2>";
							 | 
						|
									} else {
							 | 
						|
										$question_row_html .= "<TD align=\"left\">";
							 | 
						|
									}
							 | 
						|
									$question_row_html .= "
							 | 
						|
								<HR>
							 | 
						|
								\ \;<BR>
							 | 
						|
								</TD>
							 | 
						|
								</TR>\n";
							 | 
						|
									$questhtml = join('', $questhtml, $question_row_html);
							 | 
						|
									$TEST{'questions'} = $questhtml;
							 | 
						|
									&show_template("qgrp");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub test_continue {
							 | 
						|
									$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
									&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
									if (($TEST{'seq'} eq 'svy') || ($TEST{'seq'} eq 'dmg')) {
							 | 
						|
										$TEST_SESSION{'message'} = "$xlatphrase[657]";
							 | 
						|
										$tetmplt = "tend";
							 | 
						|
									} else {
							 | 
						|
										$tetmplt = "tsubend";
							 | 
						|
										if ( $tsubtest > 2 || $TEST{'scr'} eq '3' || $TEST{'emlcnd'} ne 'Y') {
							 | 
						|
											$TEST_SESSION{'message'} = "$xlatphrase[658]";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
									&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
									if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
										if ($FORM{'remediated'} ne "Y") {
							 | 
						|
											&put_question_response($tsubtest, $tqno);
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										&put_question_response($tsubtest, $tqno);
							 | 
						|
									}
							 | 
						|
									&get_subtest_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
									my $passfailflag=&summarize_test($tsubtest);
							 | 
						|
									$FORM{'remediation'} = &remediate_summary($tsubtest);
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									$TEST{'customexit'}=&check_for_custom_exit_file($passfailflag);
							 | 
						|
									$tqno=0; $tsubtest++;
							 | 
						|
									while ($tsbt[$tsubtest] eq '' && $tsubtest < 5) {$tsubtest++;}
							 | 
						|
									if ($tsubtest < 5) {
							 | 
						|
										$TEST_SESSION{'tmreset'} = $TEST{'maxtmfmt'};
							 | 
						|
									}
							 | 
						|
									$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
									$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
									&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'id'});
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									$TEST_SESSION{'navbuttons'}="<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[3]\">";
							 | 
						|
									&show_template($tetmplt);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub single_form_test_continue {
							 | 
						|
									# all questions on same page
							 | 
						|
									&get_subtest_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
									$TEST_SESSION{'noq'}=$SUBTEST{'noq'};
							 | 
						|
									for (keys %FORM) {
							 | 
						|
										if ($_ =~ /q[0-9]/ ) {
							 | 
						|
											($tqno, $tqidx) = split(/\-/, $_);
							 | 
						|
											$tqno =~ s/q//g;
							 | 
						|
											if ($tqidx eq 'qrs') {
							 | 
						|
												$FORM{'qrs'} = $FORM{$_};
							 | 
						|
											} else {
							 | 
						|
												$tqidx =~ s/qrs//g;
							 | 
						|
											}
							 | 
						|
											$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
											&get_question_definition($SUBTEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
											&put_question_response($tsubtest, $tqno);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$TEST_SESSION{'message'} = "$xlatphrase[655]<BR>$xlatphrase[656]<BR>\n";
							 | 
						|
									my $passfailflag="u";
							 | 
						|
									if ($SUBTEST{'seq'} eq 'svy') {
							 | 
						|
										&summarize_survey($tsubtest);
							 | 
						|
										$TEST{'bars'} = "N";
							 | 
						|
									} else {
							 | 
						|
										if ($TEST{'emlcndopt'} ne 'Y') { $TEST{'bars'} = "N";}
							 | 
						|
										$passfailflag=&summarize_test($tsubtest);
							 | 
						|
									}
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
								# v sac support for custom exit message
							 | 
						|
									$TEST{'customexit'}=&check_for_custom_exit_file($passfailflag);
							 | 
						|
								# ^ sac support for custom exit message
							 | 
						|
									$tqno=0; $tsubtest++;
							 | 
						|
									while ($tsbt[$tsubtest] eq '' && $tsubtest < 5) {$tsubtest++;}
							 | 
						|
									if ($tsubtest < 5) {
							 | 
						|
										$TEST_SESSION{'tmreset'} = $TEST{'maxtmfmt'};
							 | 
						|
									}
							 | 
						|
									$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
									$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
									&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'id'});
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									if ($TEST{'ntfy'} ne '') {
							 | 
						|
										&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'id'});
							 | 
						|
										&send_testresults("2","$endtime");
							 | 
						|
									}
							 | 
						|
									&send_custom_exit_email($passfailflag);
							 | 
						|
									$TEST_SESSION{'navbuttons'}="<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[3]\">";
							 | 
						|
									$tetmplt = "tsubend";
							 | 
						|
									&show_template($tetmplt);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub test_is_done {
							 | 
						|
									$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
									&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
								################################################################
							 | 
						|
								# REMEDIATION FIX
							 | 
						|
								# do put_question_response unless already 
							 | 
						|
								# done for remediation on posting
							 | 
						|
								################################################################
							 | 
						|
								#	&put_question_response($tsubtest, $tqno);
							 | 
						|
									if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
										if ($FORM{'remediated'} ne "Y") {
							 | 
						|
											&put_question_response($tsubtest, $tqno);
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										&put_question_response($tsubtest, $tqno);
							 | 
						|
									}
							 | 
						|
								################################################################
							 | 
						|
									&get_subtest_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
								#	&summarize_test($tsubtest);
							 | 
						|
									my $passfailflag=&summarize_test($tsubtest);
							 | 
						|
									$FORM{'remediation'} = &remediate_summary($tsubtest);
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
								# v sac support for custom exit message
							 | 
						|
									$TEST{'customexit'}=&check_for_custom_exit_file($passfailflag);
							 | 
						|
								# ^ sac support for custom exit message
							 | 
						|
									$tstate = $TEST_STATES{'_COMPLETED'};
							 | 
						|
									$tsubtest=0; $tqno=0;
							 | 
						|
									$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									&promote_test_sequence($testinprog, $testcomplete, $TEST_STATES{'_COMPLETED'});
							 | 
						|
									if ($TEST{'ntfy'} ne '') {
							 | 
						|
										&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'id'});
							 | 
						|
										&send_testresults("2","$endtime");
							 | 
						|
									}
							 | 
						|
									&send_custom_exit_email($passfailflag);
							 | 
						|
									$TEST_SESSION{'navbuttons'}="<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[769]\" onClick=\"cancel_test()\">";
							 | 
						|
									&show_template($tetmplt);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub terminated_by_administrator {
							 | 
						|
									$tmsg = "$xlatphrase[659]<BR>\n";
							 | 
						|
									$tmsg = join('', $tmsg, "$xlatphrase[660]<BR>\n");
							 | 
						|
									&promote_test_sequence($testinprog, $testcomplete, "5");
							 | 
						|
									$TEST_SESSION{'message'} = $tmsg;
							 | 
						|
									$TEST_SESSION{'navbuttons'} = &set_subtest_nav_buttons($tstate, $tsubtest);
							 | 
						|
									&show_template("tend");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub time_expired_ending_test {
							 | 
						|
									####################################################
							 | 
						|
									# This is no longer used, replaced by texp.pl      #
							 | 
						|
									####################################################
							 | 
						|
									$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
									&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
									if ( $tsubtest > 2 || $TEST{'scr'} eq '3' || $TEST{'emlcnd'} ne 'Y') {
							 | 
						|
										$TEST_SESSION{'message'} = "xlatphrase[658]";
							 | 
						|
										$tetmplt = "tend";
							 | 
						|
									} else {
							 | 
						|
										$tetmplt = "tsubend";
							 | 
						|
									}
							 | 
						|
									#$QUESTION{'id'} = &get_question_id($tsubtest, $tqno);
							 | 
						|
									#&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
									#&put_question_response($tsubtest, $tqno);
							 | 
						|
									&get_subtest_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
									&summarize_test($tsubtest);
							 | 
						|
									&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
									$tqno=0; $tsubtest++;
							 | 
						|
									while ($tsbt[$tsubtest] eq '' && $tsubtest < 5) {$tsubtest++;}
							 | 
						|
									if ($tsubtest < 5) {
							 | 
						|
										$TEST_SESSION{'tmreset'} = $TEST{'maxtmfmt'};
							 | 
						|
										$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
										$TEST_SESSION{'subtest'} = $tsbt[$tsubtest];
							 | 
						|
										&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'id'});
							 | 
						|
										&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
										$TEST_SESSION{'navbuttons'}="<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[3]\">";
							 | 
						|
									} else {
							 | 
						|
										&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'subtest'});
							 | 
						|
										$tstate = $TEST_STATES{'_TIME_EXPIRED'};
							 | 
						|
										$tsubtest=0; $tqno=0;
							 | 
						|
										$TEST_SESSION{'state'} = "$tstate.$tsubtest.$tqno";
							 | 
						|
										&put_test_sequence($testinprog, $TEST_SESSION{'clid'}, $TEST_SESSION{'uid'}, $TEST_SESSION{'id'});
							 | 
						|
										&promote_test_sequence($testinprog, $testcomplete, $TEST_STATES{'_COMPLETED'});
							 | 
						|
										&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Test Complete $TEST{'id'}", $endtime);
							 | 
						|
										if ($TEST{'ntfy'} ne '') {
							 | 
						|
											&get_test_profile( $TEST_SESSION{'clid'}, $TEST_SESSION{'id'});
							 | 
						|
											&send_testresults("2","$endtime");
							 | 
						|
										}
							 | 
						|
										&send_custom_exit_email($passfailflag);
							 | 
						|
										$TEST_SESSION{'navbuttons'}="<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[769]\" onClick=\"cancel_test()\">";
							 | 
						|
									}
							 | 
						|
									$TEST_SESSION{'message'} = "$xlatphrase[654]";
							 | 
						|
									&show_template($tetmplt);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_question {
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "Test Question $TEST{'id'} $QUESTION{'id'}");
							 | 
						|
									&get_question_definition($TEST{'id'}, $CLIENT{'clid'}, $QUESTION{'id'});
							 | 
						|
								
							 | 
						|
									$QUESTION{'qno'} = $tqno;
							 | 
						|
									$QUESTION{'qtx'} =~ s/\;/<BR>/g;
							 | 
						|
									$QUESTION{'qtx'} =~ s/\n/<BR>/g;
							 | 
						|
									$QUESTION{'qtx'}=&merg_exhibit_in_text($QUESTION{'qtx'});
							 | 
						|
									$QUESTION{'qrm'} =~ s/\;/<BR>/g;
							 | 
						|
								
							 | 
						|
								# v sac added support for optional comments
							 | 
						|
								# (replaced)
							 | 
						|
								#	$prvresp=&get_previous_response($_[0], $_[1]);
							 | 
						|
								# (with)
							 | 
						|
									my $trash=&get_previous_response($_[0], $_[1]);
							 | 
						|
									($prvresp,$prevcmts)=split(/::/, $trash);
							 | 
						|
									if ($prvresp =~ /^\'/ ) {
							 | 
						|
										$QUESTION{'marked'} = " CHECKED";
							 | 
						|
										$prvresp =~ s/\'//; 
							 | 
						|
									}
							 | 
						|
									my $srch="><\/TEXTAREA>";
							 | 
						|
									my $repl=">$prevcmts<\/TEXTAREA>";
							 | 
						|
									if ($QUESTION{'qcmtprmpt'} eq 'Y') {
							 | 
						|
										$QUESTION{'promptcomments'} =~ s/$srch/$repl/;
							 | 
						|
									}
							 | 
						|
								# ^ sac added support for optional comments
							 | 
						|
								
							 | 
						|
									if ($TEST{'remt'} eq '3') {
							 | 
						|
										$QUESTION{'qrmwq'} = join('', "\ \;<BR>\n", $QUESTION{'qrm'});
							 | 
						|
									}
							 | 
						|
									if ($QUESTION{'qtp'} eq 'tf' ) {
							 | 
						|
										$optTrue = ($prvresp eq $QUESTION{'qca'}) ? "checked" : "" ;
							 | 
						|
										$optFalse = ($prvresp eq $QUESTION{'qia'}) ? "checked" : "" ;
							 | 
						|
								##sac v added code to make TRUE/YES always the first answer
							 | 
						|
										if ((uc($QUESTION{'qca'}) eq 'TRUE') || (uc($QUESTION{'qca'}) eq 'YES')) {
							 | 
						|
											$outline = "<input type=\"radio\" name=\"qrs\" value=\"$QUESTION{'qca'}\" $optTrue>$QUESTION{'qca'}<BR>\n";
							 | 
						|
											$outline = join('', $outline, "<input type=\"radio\" name=\"qrs\" value=\"$QUESTION{'qia'}\" $optFalse>$QUESTION{'qia'}<BR>\n");
							 | 
						|
										} else {
							 | 
						|
											$outline = "<input type=\"radio\" name=\"qrs\" value=\"$QUESTION{'qia'}\" $optFalse>$QUESTION{'qia'}<BR>\n";
							 | 
						|
											$outline = join('', $outline, "<input type=\"radio\" name=\"qrs\" value=\"$QUESTION{'qca'}\" $optTrue>$QUESTION{'qca'}<BR>\n");
							 | 
						|
										}
							 | 
						|
								##sac ^ added code to make TRUE/YES always the first answer
							 | 
						|
								
							 | 
						|
										$QUESTION{'anslist'} = $outline;
							 | 
						|
								##wac v 01/03/02 T/F appears in answer list of MCM question, need to clear $outline
							 | 
						|
										$outline="";
							 | 
						|
								##wac ^
							 | 
						|
										$tmpfile = "qtf";
							 | 
						|
									} elsif ($QUESTION{'qtp'} eq 'esa' ) {
							 | 
						|
								## sac v 03/28/02 changed input box length calculation to the longest of the multiple options
							 | 
						|
								# (replaced)
							 | 
						|
								#		$anlen = (length($QUESTION{'qca'}) * 2);
							 | 
						|
								#		$anlen = ($anlen < 5) ? 5 : $anlen;
							 | 
						|
								# (with)
							 | 
						|
										my @esaanswers = split(/\;/,$QUESTION{'qca'});
							 | 
						|
										$anslen=5;
							 | 
						|
										foreach $anslist (@esaanswers) {
							 | 
						|
											if ($anslen < length($anslist)) {
							 | 
						|
												$anslen = length($anslist);
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										$anslen += 5;
							 | 
						|
								## sac ^ 03/28/02 changed input box length calculation to the longest of the multiple options
							 | 
						|
										$anslist = "<input type=\"text\" name=\"qrs\" VALUE=\"$prvresp\" SIZE=$anlen>";
							 | 
						|
										if ($QUESTION{'qtx'} =~ /<box>/ ) {
							 | 
						|
											$QUESTION{'qtx'} =~ s/<box>/$anslist/g;
							 | 
						|
											$QUESTION{'anslist'} = "";
							 | 
						|
										} else {
							 | 
						|
											$QUESTION{'anslist'} = "$anslist\n";
							 | 
						|
										}
							 | 
						|
										$tmpfile = "qesa";
							 | 
						|
									} elsif ($QUESTION{'qtp'} eq 'mch' ) {
							 | 
						|
										&build_matching_answer_list($_[0], $_[1], $prvresp);
							 | 
						|
										$tmpfile = "qmch";
							 | 
						|
									} elsif ($QUESTION{'qtp'} eq 'ord' ) {
							 | 
						|
										&build_ordered_answer_list($_[0], $_[1], $prvresp);
							 | 
						|
										$tmpfile = "qord";
							 | 
						|
									} elsif ($QUESTION{'qtp'} eq 'nrt' ) {
							 | 
						|
										$nrtmaxlen = $QUESTION{'qca'};
							 | 
						|
										$nrtcols = 50;
							 | 
						|
										$nrtrows = $nrtmaxlen/$nrtcols;
							 | 
						|
										$nrtrows = ($nrtrows > 5) ? 5 : $nrtrows;
							 | 
						|
										$QUESTION{'anslist'} = "<textarea name=\"qrs\" ROWS=\"$nrtrows\" COLS=\"$nrtcols\" onKeyPress=\"ta_onKeyPress(this.form)\" wrap=\"on\">$prvresp</TEXTAREA>\n";
							 | 
						|
										$tmpfile = "qnrt";
							 | 
						|
									} elsif ($QUESTION{'qtp'} eq 'mtx' ) {
							 | 
						|
										&build_matrix_answer_list($_[0], $_[1], $prvresp, "CHECKBOX");
							 | 
						|
										$tmpfile = "qmtx";
							 | 
						|
									} elsif ($QUESTION{'qtp'} eq 'mtr' ) {
							 | 
						|
										&build_matrix_answer_list($_[0], $_[1], $prvresp, "RANK");
							 | 
						|
										$tmpfile = "qmtr";
							 | 
						|
									} else {
							 | 
						|
										if (($QUESTION{'qtp'} eq 'mcs' ) || ($QUESTION{'qtp'} eq 'mca')) {
							 | 
						|
											$inptyp = "RADIO";
							 | 
						|
											$tmpfile = "qmcs";
							 | 
						|
										} elsif ($QUESTION{'qtp'} eq 'lik' ) {
							 | 
						|
											$inptyp = "RADIO";
							 | 
						|
											$tmpfile = "qlik";
							 | 
						|
										} elsif ($QUESTION{'qtp'} eq 'mcm' ) {
							 | 
						|
											$inptyp = "CHECKBOX";
							 | 
						|
											$tmpfile = "qmcm";
							 | 
						|
										} elsif ($QUESTION{'qtp'} eq 'plc' ) {
							 | 
						|
											$tmpfile = "qplc";
							 | 
						|
										} else{
							 | 
						|
											$Error = 1;
							 | 
						|
										}
							 | 
						|
										if ($QUESTION{'anslay'} eq "h") {
							 | 
						|
											$inptyp .= ":".$QUESTION{'anslay'};
							 | 
						|
										}
							 | 
						|
										&build_answer_list($_[0], $_[1], $inptyp, $prvresp);
							 | 
						|
									}
							 | 
						|
									$TEST_SESSION{'navbuttons'} = &set_nav_buttons($_[0], $_[1], $_[2]);
							 | 
						|
									unless ($notemplate) {
							 | 
						|
										@lines = &get_template($tmpfile);
							 | 
						|
										foreach $line (@lines) {
							 | 
						|
											$line = &xlatline($line);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub set_subtest_nav_buttons {
							 | 
						|
									if ($_[0] eq $TEST_STATES{'_PENDING'}) {
							 | 
						|
										$navbuttons = "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[487]\" onClick=\"return btn_pause(this)\">";
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[488]\"> onClick=\"return btn_pause(this)\">");
							 | 
						|
								        } elsif ($_[0] eq $TEST_STATES{'_IN_PROGRESS'}) {
							 | 
						|
										$btnvalue = ($_[1] eq $tlastsubtest) ? "$xlatphrase[545]" : "$xlatphrase[6]";
							 | 
						|
										$navbuttons = "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$btnvalue\" onClick=\"return btn_pause(this)\">";
							 | 
						|
										if ($TEST{'tpp'} eq 'Y') {
							 | 
						|
											$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[542]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										$TEST_SESSION{'cancel'} = "onSubmit='cancel_test()'";
							 | 
						|
										$navbuttons = "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[769]\">";
							 | 
						|
									}
							 | 
						|
									return $navbuttons;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub set_nav_buttons {
							 | 
						|
									$navbuttons = "<INPUT TYPE=HIDDEN NAME=\"skipok\" VALUE=\"$TEST{'qsk'}\">\n";
							 | 
						|
									### If skip set, show "mark for review" checkbox
							 | 
						|
									if ($TEST{'qsk'} eq 'Y' && $_[1] !=0) {
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=CHECKBOX NAME=\"marked\"$QUESTION{'marked'}> <B>$xlatphrase[546]</B><BR>\ \;<BR>\n");
							 | 
						|
									}
							 | 
						|
									if ($TEST{'qpv'} eq 'Y' && $_[1] > 1) {
							 | 
						|
								## BACK BUTTON
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[7]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
									}
							 | 
						|
									if ($TEST{'tpp'} eq 'Y' && $_[1] != 0) {
							 | 
						|
								## PAUSE BUTTON
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[542]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
									}
							 | 
						|
									if ($_[1] > 0) {
							 | 
						|
										my $phrase = $xlatphrase[779];
							 | 
						|
										if ($_[1] eq $TEST_SESSION{'noq'} || $QUESTION{'exitpt'} eq 'Y') {
							 | 
						|
								### LAST QUESTION
							 | 
						|
											if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
								### REMEDIATION hidden indicator to let the OK button know which
							 | 
						|
								### button to default to after remediation.
							 | 
						|
												$navbuttons .= "<input type=hidden name=\"RemediationOKButton\" value=\"$xlatphrase[3]\"> \ \;\ \;\ \;";
							 | 
						|
											}
							 | 
						|
								## DONE : CONTINUE BUTTONS
							 | 
						|
											$btnvalue = ($_[0] eq $tlastsubtest) ? "$xlatphrase[5]" : "$xlatphrase[6]";
							 | 
						|
										} elsif ($FORM{'review'}) {
							 | 
						|
								#print STDERR "REVIEW\n";
							 | 
						|
								## REVIEW MODE 
							 | 
						|
											### If Previous, add NEXT button
							 | 
						|
											if ($TEST{'qpv'} eq 'Y') {
							 | 
						|
												$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[3]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
											}
							 | 
						|
											### In Review mode, always a Done or Continue button
							 | 
						|
											$btnvalue = ($_[0] eq $tlastsubtest) ? "$xlatphrase[5]" : "$xlatphrase[6]";
							 | 
						|
										} else {
							 | 
						|
								## NEXT BUTTON
							 | 
						|
											$btnvalue = "$xlatphrase[3]";
							 | 
						|
										}
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$btnvalue\" onClick=\"return btn_pause(this)\">");
							 | 
						|
									}
							 | 
						|
									### DED 6/28/04 Display Review dropdown if test is std 
							 | 
						|
									###     and (skip ok or previous button)
							 | 
						|
									###     and (end of test or dropdown with last question)
							 | 
						|
									if ($TEST{'seq'} eq 'std' && ($TEST{'qsk'} eq 'Y' || $TEST{'qpv'} eq 'Y') && ($_[1] eq $TEST_SESSION{'noq'} || $FORM{'review'})) {
							 | 
						|
								## REVIEW DROPDOWN 
							 | 
						|
										my $dropdown = &build_review_dropdown($_[0]);
							 | 
						|
										$navbuttons = join('          ', $navbuttons, $dropdown);
							 | 
						|
									}
							 | 
						|
									return $navbuttons;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub old_set_nav_buttons {
							 | 
						|
								### DED 7/1/04 Rearranged nav button logic in new function to accomodate
							 | 
						|
								###            review dropdown
							 | 
						|
									$navbuttons = "<INPUT TYPE=HIDDEN NAME=\"skipok\" VALUE=\"$TEST{'qsk'}\">\n";
							 | 
						|
									my $phrase = $xlatphrase[543];
							 | 
						|
									if ($FORM{submit} =~ /$phrase/) {
							 | 
						|
								## REVIEW BUTTON
							 | 
						|
										if ($_[1] ne $TEST_SESSION{'noq'}) {
							 | 
						|
											$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=CHECKBOX NAME=\"marked\"> <B>$xlatphrase[546]</B><BR>\ \;<BR>\n");
							 | 
						|
										}
							 | 
						|
										if ($_[1] > 0 && $_[1] ne $_[2]) {
							 | 
						|
											if ($SUBTEST_RESPONSES{$_[0]} =~ /\&\'/ ) {
							 | 
						|
								## REVIEW NEXT BUTTON
							 | 
						|
												$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[544]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										$btnvalue = ($_[0] eq $tlastsubtest) ? "$xlatphrase[5]" : "$xlatphrase[6]";
							 | 
						|
								## DONE : CONTINUE BUTTONS
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$btnvalue\" onClick=\"return btn_pause(this)\">");
							 | 
						|
									} else {
							 | 
						|
										# didn't hit Review
							 | 
						|
										if ($TEST{'qsk'} eq 'Y' && $_[1] !=0) {
							 | 
						|
								#hkh bug#37 do not display phrase 546 if DONE is the only button
							 | 
						|
											if ($_[1] eq $TEST_SESSION{'noq'}) {
							 | 
						|
												if ($TEST{'qpv'} eq 'Y' && $_[1] > 1) {
							 | 
						|
													$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=CHECKBOX NAME=\"marked\"> <B>$xlatphrase[546]</B><BR>\ \;<BR>\n");
							 | 
						|
												} else {
							 | 
						|
								#hkh bug#37 if user did not leave any questions unanswered and did not click to review any questions
							 | 
						|
													if ($SUBTEST_RESPONSES{$_[0]} =~ /\&\'/ ) {
							 | 
						|
														$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=CHECKBOX NAME=\"marked\"> <B>$xlatphrase[546]</B><BR>\ \;<BR>\n");
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											} else {
							 | 
						|
												$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=CHECKBOX NAME=\"marked\"> <B>$xlatphrase[546]</B><BR>\ \;<BR>\n");
							 | 
						|
												}
							 | 
						|
										}
							 | 
						|
										if ($TEST{'qpv'} eq 'Y' && $_[1] > 1) {
							 | 
						|
								## BACK BUTTON
							 | 
						|
											$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[7]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
										}
							 | 
						|
										if ($TEST{'tpp'} eq 'Y' && $_[1] != 0) {
							 | 
						|
								## PAUSE BUTTON
							 | 
						|
											$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[542]\" onClick=\"return btn_pause(this)\">");
							 | 
						|
										}
							 | 
						|
										if ($_[1] > 0) {
							 | 
						|
								## DONE : CONTINUE BUTTONS
							 | 
						|
											$btnvaluetrue = ($_[0] eq $tlastsubtest) ? "$xlatphrase[5]" : "$xlatphrase[6]";
							 | 
						|
								## NEXT BUTTON
							 | 
						|
											$btnvalue = ($_[1] eq $TEST_SESSION{'noq'}) ? $btnvaluetrue : "$xlatphrase[3]";
							 | 
						|
											if ($btnvalue eq $btnvaluetrue) {
							 | 
						|
								################################################################
							 | 
						|
								# REMEDIATION FIX
							 | 
						|
								# Add the hidden indicator to let the OK button know which
							 | 
						|
								# button to default to after remediation.
							 | 
						|
								################################################################
							 | 
						|
												if (($TEST{'seq'} eq 'std') && ($TEST{'remt'} eq '1')) {
							 | 
						|
													$navbuttons .= "<input type=hidden name=\"RemediationOKButton\" value=\"$xlatphrase[3]\"> \ \;\ \;\ \;";
							 | 
						|
								#&dbgprint("REMEDIATION FIX:tqrs:1057 navbuttons:$navbuttons\n");
							 | 
						|
												}
							 | 
						|
								################################################################
							 | 
						|
											}
							 | 
						|
										} else {
							 | 
						|
								## NEXT BUTTON
							 | 
						|
											$btnvalue = "$xlatphrase[3]";
							 | 
						|
										}
							 | 
						|
										$navbuttons = join('          ', $navbuttons, "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$btnvalue\" onClick=\"return btn_pause(this)\">");
							 | 
						|
										### DED 6/28/04 Display Review dropdown if skip ok
							 | 
						|
										###     and (end of test or jumped to question from dropdown)
							 | 
						|
										if (($TEST{'qsk'} eq 'Y') && ((($_[1] eq $TEST_SESSION{'noq'}) && ($TEST{'seq'} ne 'dmg')) || $FORM{'review'})) {
							 | 
						|
								## REVIEW DROPDOWN 
							 | 
						|
											my $dropdown = &build_review_dropdown($_[0]);
							 | 
						|
											$navbuttons = join('          ', $navbuttons, $dropdown);
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return $navbuttons;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub build_review_dropdown {
							 | 
						|
									my $tsubtest = $_[0];
							 | 
						|
									my $dropdown = "<nobr>";
							 | 
						|
									my ($marked, $unanswered) = &find_marked_unanswered($tsubtest);
							 | 
						|
								#print STDERR "tsubtest: $tsubtest marked: $marked unanswered: $unanswered questionlist: $TEST{'questionlist'} tqno: $tqno\n";
							 | 
						|
									### DED 12/08/04 Activate Jump to button on selection
							 | 
						|
									$dropdown .= "<SELECT name=\"review\" onChange=\"this.form.submit[this.form.submit.length-1].click()\">\n";
							 | 
						|
									if ($marked && ($marked =~ /:.:.:/ || (":$tqno:" ne $marked))) {
							 | 
						|
											$dropdown .= "<OPTION value=\"nextreview\">$xlatphrase[780]</OPTION>\n";
							 | 
						|
									}
							 | 
						|
									if ($unanswered && ($unanswered =~ /:.:.:/ || (":$tqno:" ne $unanswered))) {
							 | 
						|
										$dropdown .= "<OPTION value=\"nextunanswered\">$xlatphrase[781]</OPTION>\n";
							 | 
						|
									}
							 | 
						|
									$dropdown .= &build_question_dropdown_list($tsubtest, $marked, $unanswered);
							 | 
						|
									$dropdown .= "</SELECT>\n";
							 | 
						|
									$dropdown .= "<INPUT TYPE=SUBMIT NAME=\"submit\" VALUE=\"$xlatphrase[779]\" onClick=\"return btn_pause(this)\"></nobr>\n";
							 | 
						|
									
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub build_answer_list {
							 | 
						|
									@albls = set_answer_labels($QUESTION{'qalb'});
							 | 
						|
									$qca = $QUESTION{'qca'};
							 | 
						|
									$qca =~ s/\r/\n/g;
							 | 
						|
									$qca =~ s/\n\n/\n/g;
							 | 
						|
									@qansopt = split(/\n/, $qca);
							 | 
						|
									$qia = $QUESTION{'qia'};
							 | 
						|
									$qia =~ s/\r/\n/g;
							 | 
						|
									$qia =~ s/\n\n/\n/g;
							 | 
						|
									@qia = split(/\n/, $qia);
							 | 
						|
									foreach $qia (@qia) { push @qansopt, $qia; }
							 | 
						|
									@qia=();
							 | 
						|
								
							 | 
						|
									@qans=split(/&/, $SUBTEST_ANSWERS{$_[0]});
							 | 
						|
									($cans, $scoring) = split(/::/, $qans[$_[1]]);
							 | 
						|
									@qansord=split(/\?/, $cans);
							 | 
						|
									@qans=();
							 | 
						|
									shift @qansord;
							 | 
						|
									$outline="";
							 | 
						|
									$iord=0;
							 | 
						|
									$counter=0;
							 | 
						|
									if ($_[2] eq 'RADIO:h') {
							 | 
						|
										$colspan = $#qansord+3;
							 | 
						|
										$outline  = "<TABLE cellspacing=10>\n";
							 | 
						|
										$outline .= "	<TR><TD colspan=$colspan>\n";
							 | 
						|
										$outline .= "		<TABLE width=100%>\n";
							 | 
						|
										$outline .= "			<TR><TD align=left>$QUESTION{'left_be'}</TD>";
							 | 
						|
										$outline .= "<TD align=right>$QUESTION{'right_be'}</TD></TR>\n";
							 | 
						|
										$outline .= "		</TABLE>\n";
							 | 
						|
										$outline .= "	</TD></TR>\n";
							 | 
						|
										$outline .= "	<TR><TD> </TD>";
							 | 
						|
										foreach $qansord (@qansord) {
							 | 
						|
											($qidx, $trash)=split(/=/, $qansord);
							 | 
						|
											$qans = $qansopt[$qidx];
							 | 
						|
											if ($QUESTION{'qalb'} ne "x") {
							 | 
						|
												$qlbl = $albls[$iord++].")";
							 | 
						|
											} else {
							 | 
						|
												$qlbl = "";
							 | 
						|
											}
							 | 
						|
											$outline .= "<TD align=center>$qlbl $qans</TD>";
							 | 
						|
										}
							 | 
						|
										$outline .= "<TD> </TD></TR>\n";
							 | 
						|
										$outline .= "	<TR><TD> </TD>";
							 | 
						|
									} else {
							 | 
						|
										# setup table to format answers
							 | 
						|
										$outline .= "<TABLE>\n";
							 | 
						|
									}
							 | 
						|
									foreach $qansord (@qansord) {
							 | 
						|
										($qidx, $trash)=split(/=/, $qansord);
							 | 
						|
										$qans = $qansopt[$qidx];
							 | 
						|
										if ($QUESTION{'qalb'} ne "x") {
							 | 
						|
											$qlbl = $albls[$iord++].")";
							 | 
						|
										}
							 | 
						|
										$akey = "qrs$counter";
							 | 
						|
										if ($_[2] eq 'RADIO') {
							 | 
						|
											$optselected = ($_[3] =~ /$counter/ ) ? "CHECKED" : "";
							 | 
						|
											$repl = "<TR valign=top><TD align=right><INPUT TYPE=$inptyp NAME=\"qrs\" VALUE=\"$counter\" $optselected></TD><TD align=center>$qlbl</TD><TD align=left>$qans</TD></TR>\n";
							 | 
						|
										} elsif ($_[2] eq 'RADIO:h') {
							 | 
						|
											$optselected = ($_[3] =~ /$counter/ ) ? "CHECKED" : "";
							 | 
						|
											$repl = "<TD align=center><INPUT TYPE=RADIO NAME=\"qrs\" VALUE=\"$counter\" $optselected></TD>";
							 | 
						|
										} else {
							 | 
						|
											$optselected = ($_[3] =~ /$counter/ ) ? "CHECKED" : "";
							 | 
						|
											$repl = "<TR><TD align=right><INPUT TYPE=$inptyp NAME=\"qrs$counter\" VALUE=\"$counter\" $optselected></TD><TD align=center>$qlbl</TD><TD align=left>$qans</TD></TR>\n";
							 | 
						|
										}
							 | 
						|
										$outline = join('', $outline, $repl);
							 | 
						|
										$counter++;
							 | 
						|
									}
							 | 
						|
									if ($_[2] eq 'RADIO:h') {
							 | 
						|
										$outline .= "<TD> </TD></TR>\n";
							 | 
						|
										$outline .= "<TR><TD colspan=$colspan>\n";
							 | 
						|
										$outline .= "	<TABLE width=100%>\n";
							 | 
						|
										$outline .= "		<TR>";
							 | 
						|
										my @sub_text = split('::', $QUESTION{'sub_text'});
							 | 
						|
										foreach (@sub_text) {
							 | 
						|
											my $width = 100 / ($#sub_text + 1);
							 | 
						|
											$outline .= "		<TD width=$width% align=center>$_</TD>";
							 | 
						|
										}
							 | 
						|
										$outline .= "		</TR>";
							 | 
						|
										$outline .= "	</TABLE>\n";
							 | 
						|
										$outline .= "</TD></TR>\n";
							 | 
						|
										@subtext=();
							 | 
						|
									}
							 | 
						|
									$outline .= "</TABLE>\n"; 
							 | 
						|
									$QUESTION{'anslist'} = $outline;
							 | 
						|
									$outline="";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub build_matrix_answer_list {
							 | 
						|
									$outline="";
							 | 
						|
								
							 | 
						|
									# Split qia into row and col headers
							 | 
						|
									$qia = $QUESTION{'qia'};
							 | 
						|
									$qia =~ s/\r/\n/g;
							 | 
						|
									$qia =~ s/\n\n/\n/g;
							 | 
						|
									@qia = split(/::/, $qia);
							 | 
						|
									if ($qia[0] =~ /\n/) {
							 | 
						|
										@qrowhdr = split(/\n/, $qia[0]);
							 | 
						|
										@qcolhdr = split(/\n/, $qia[3]);
							 | 
						|
										$qrowcount = $qia[1];
							 | 
						|
										$qcolcount = $qia[2];
							 | 
						|
									} else {
							 | 
						|
										$qrowcount = $qia[0];
							 | 
						|
										$qcolcount = $qia[1];
							 | 
						|
										@qlbllist = split(/\n/, $qia[2]);
							 | 
						|
									}
							 | 
						|
									@qia = ();
							 | 
						|
								
							 | 
						|
									if ($_[3] eq "CHECKBOX") {
							 | 
						|
								
							 | 
						|
										# Mark previous selections with "CHECKED"
							 | 
						|
								        	@optvalues = split(/\?/, $_[2]);
							 | 
						|
										shift @optvalues;
							 | 
						|
										$i=0;
							 | 
						|
										foreach $row (0 .. $qrowcount-1)
							 | 
						|
										{
							 | 
						|
											foreach $col (0 .. $qcolcount-1)
							 | 
						|
											{
							 | 
						|
												if ($optvalues[$i] != "xxx")
							 | 
						|
												{
							 | 
						|
													$chmatrix[$row][$col]="CHECKED";
							 | 
						|
												}
							 | 
						|
												else
							 | 
						|
												{
							 | 
						|
													$chmatrix[$row][$col]="";
							 | 
						|
												}
							 | 
						|
												$i++;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										# Mark previous selections with "SELECTED"
							 | 
						|
								        	@optvalues = split(/\?/, $_[2]);
							 | 
						|
										shift @optvalues;
							 | 
						|
										$i=0;
							 | 
						|
										foreach $row (0 .. $qrowcount-1)
							 | 
						|
										{
							 | 
						|
											foreach $col (0 .. $qcolcount-1)
							 | 
						|
											{
							 | 
						|
												$rank = $optvalues[$i];
							 | 
						|
												foreach $irank (0 .. $QUESTION{'ranknum'}) 
							 | 
						|
												{
							 | 
						|
													if ($irank eq $rank)
							 | 
						|
													{
							 | 
						|
														$chmatrix[$i][$irank]="SELECTED";
							 | 
						|
													}
							 | 
						|
													else
							 | 
						|
													{
							 | 
						|
														$chmatrix[$i][$irank]="";
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
												$i++;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									# Build matrix html
							 | 
						|
									$outline="<table border=2>\n";
							 | 
						|
									if ($#qlbllist == -1) {
							 | 
						|
										$outline .= "  <tr>\n  <td> </td>";
							 | 
						|
										foreach (0 .. $#qcolhdr) {
							 | 
						|
											$outline .= "<td>$qcolhdr[$_]</td>";
							 | 
						|
										}
							 | 
						|
										$outline .= "</tr>\n";
							 | 
						|
									}
							 | 
						|
									$i=0;
							 | 
						|
									foreach $row (0 .. $qrowcount-1) {
							 | 
						|
										$outline .= "<tr>";
							 | 
						|
										if ($#qlbllist == -1) {
							 | 
						|
											$outline .= "<td>$qrowhdr[$row]</td>";
							 | 
						|
										}
							 | 
						|
										foreach $col (0 .. $qcolcount-1) {
							 | 
						|
											if ($#qlbllist == -1) {
							 | 
						|
												$outline .= "<td align=center>";
							 | 
						|
											} else {
							 | 
						|
												$outline .= "<td>";
							 | 
						|
												$outline .= "<table border=0 width=100%><tr><td align=left>$qlbllist[$i]</td><td align=right>";
							 | 
						|
											}
							 | 
						|
											if ($_[3] eq "CHECKBOX") {
							 | 
						|
												$outline .= "<input type=checkbox name=\"qrs$row$col\" value=\"1\" $chmatrix[$row][$col]>";
							 | 
						|
											} else {
							 | 
						|
												$outline .= "<select name=\"qrs$row$col\">";
							 | 
						|
												$outline .= "<option value='' $chmatrix[$i][0]>\ \;</option>";
							 | 
						|
												$outline .= &build_number_select_list($QUESTION{'rankmin'},$QUESTION{'rankmax'},$QUESTION{'rankstep'});
							 | 
						|
												$outline .= "</select>";
							 | 
						|
											}
							 | 
						|
											if ($#qlbllist != -1) {
							 | 
						|
												$outline .= "</td></tr></table>";
							 | 
						|
											}
							 | 
						|
											$outline .= "</td>";
							 | 
						|
											$i++;
							 | 
						|
										}
							 | 
						|
										$outline .= "</tr>\n";
							 | 
						|
									}
							 | 
						|
									$outline .= "</table>\n";
							 | 
						|
									@qrowhdr = ();
							 | 
						|
									@qcolhdr = ();
							 | 
						|
									@qlbllist = ();
							 | 
						|
									@chmatrix = ();
							 | 
						|
								
							 | 
						|
									$QUESTION{'anslist'} = $outline;
							 | 
						|
									$QUESTION{'numans'} = $i;
							 | 
						|
									$QUESTION{'rowcount'} = $qrowcount;
							 | 
						|
									$QUESTION{'colcount'} = $qcolcount;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub build_ordered_answer_list {
							 | 
						|
									$qca = $QUESTION{'qca'};
							 | 
						|
									$qca =~ s/\r/\n/g;
							 | 
						|
									$qca =~ s/\n\n/\n/g;
							 | 
						|
									@qansopt = split(/\n/, $qca);
							 | 
						|
								
							 | 
						|
									@qans=split(/&/, $SUBTEST_ANSWERS{$_[0]});
							 | 
						|
									($cans, $scoring) = split(/::/, $qans[$_[1]]);
							 | 
						|
									@qansord=split(/\./, $cans);
							 | 
						|
									@qans=();
							 | 
						|
									shift @qansord;
							 | 
						|
									$iord=0;
							 | 
						|
									foreach $qansord (@qansord) {
							 | 
						|
										push @qlblans, $qansopt[$qansord];
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
								        @optvalues = split(/\?/, $_[2]);
							 | 
						|
									shift @optvalues;
							 | 
						|
									$counter=0;
							 | 
						|
									$outline = "<TABLE>\n";
							 | 
						|
									foreach $qans (@qlblans) {
							 | 
						|
										$optvalue = $optvalues[$counter];
							 | 
						|
										if ($optvalue eq 'xxx') { $optvalue="";}
							 | 
						|
										$repl = "<TR valign=top><TD align=right><INPUT TYPE=TEXT SIZE=\"2\" NAME=\"qrs$counter\" VALUE=\"$optvalue\"></TD><TD align=left>$qans</TD></TR>\n";
							 | 
						|
										$outline = join('', $outline, $repl);
							 | 
						|
										$counter++;
							 | 
						|
									}
							 | 
						|
									$outline .= "</TABLE>\n";
							 | 
						|
									@qlblans=(); @qans=(); @qresps=();
							 | 
						|
									$QUESTION{'anslist'} = $outline;
							 | 
						|
									$outline="";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub build_matching_answer_list {
							 | 
						|
									@albls = set_answer_labels($QUESTION{'qalb'});
							 | 
						|
									$qca = $QUESTION{'qca'};
							 | 
						|
									$qca =~ s/\r/\n/g;
							 | 
						|
									$qca =~ s/\n\n/\n/g;
							 | 
						|
									@qansopt = split(/\n/, $qca);
							 | 
						|
									$qia = $QUESTION{'qia'};
							 | 
						|
									$qia =~ s/\r/\n/g;
							 | 
						|
									$qia =~ s/\n\n/\n/g;
							 | 
						|
									@qia = split(/\n/, $qia);
							 | 
						|
								
							 | 
						|
									@qans=split(/&/, $SUBTEST_ANSWERS{$_[0]});
							 | 
						|
									($cans, $scoring) = split(/::/, $qans[$_[1]]);
							 | 
						|
									@qansord=split(/\./, $cans);
							 | 
						|
									@qans=();
							 | 
						|
									shift @qansord;
							 | 
						|
									$iord=0;
							 | 
						|
								
							 | 
						|
								        @optvalues = split(/\?/, $_[2]);
							 | 
						|
									shift @optvalues;
							 | 
						|
									$counter=0;
							 | 
						|
									$outline = "<TABLE border=0>\n";
							 | 
						|
									foreach $qansord (@qansord) {
							 | 
						|
										$qlbl = "<B>".$albls[$iord++].")</B> ";
							 | 
						|
										$qans = $qia[$qansord];
							 | 
						|
										$optvalue = $optvalues[$counter];
							 | 
						|
										if ($optvalue eq 'xxx') { $optvalue="";}
							 | 
						|
										$repl = "<TR valign=top>
							 | 
						|
								<TD align=\"left\">
							 | 
						|
									<INPUT TYPE=TEXT SIZE=\"2\" NAME=\"qrs$counter\" VALUE=\"$optvalue\">\ \;</TD><TD>$qansopt[$counter]</TD>
							 | 
						|
								<TD align=\"left\" width=80>\ \;\ \;</TD>
							 | 
						|
								<TD align=\"right\">$qlbl</TD>
							 | 
						|
								<TD align=\"left\">
							 | 
						|
									$qans
							 | 
						|
								</TD>
							 | 
						|
								</TR>\n";
							 | 
						|
										$outline = join('', $outline, $repl);
							 | 
						|
										$counter++;
							 | 
						|
									}
							 | 
						|
									$outline = join('', $outline, "</TABLE>\n");
							 | 
						|
									@qlblans=(); @qans=();
							 | 
						|
									$QUESTION{'anslist'} = $outline;
							 | 
						|
									$outline="";
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 |