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.
		
		
		
		
		
			
		
			
				
					
					
						
							1229 lines
						
					
					
						
							36 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							1229 lines
						
					
					
						
							36 KiB
						
					
					
				
								#!/usr/bin/perl
							 | 
						|
								#
							 | 
						|
								# Source File: likert_wall.pl
							 | 
						|
								#
							 | 
						|
								
							 | 
						|
								# Get config
							 | 
						|
								require 'sitecfg.pl';
							 | 
						|
								require 'testlib.pl';
							 | 
						|
								require 'tstatlib.pl';
							 | 
						|
								require 'questionslib.pl';
							 | 
						|
								
							 | 
						|
								my $last_index, $HBI_Debug ;
							 | 
						|
								$HBI_Debug = 0 ; # Controls output of Debugging Data.
							 | 
						|
								$FORM{'frm'}="";
							 | 
						|
								
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
								
							 | 
						|
								&app_initialize;
							 | 
						|
								
							 | 
						|
								if ($FORM{'cbexport'} eq 'xport') {
							 | 
						|
									print "Content-Disposition: attachment;filename=report.txt\n\n";
							 | 
						|
									$bDisplay = 0;
							 | 
						|
								} else {
							 | 
						|
									print "Content-Type: text/html\n\n";
							 | 
						|
									$bDisplay = 1;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# LIKERT Scale Test Reports by Candidate
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
								
							 | 
						|
								if (&get_session($FORM{'tid'})) {
							 | 
						|
									&LanguageSupportInit();
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
								
							 | 
						|
									$REPORT{'rptid'}="";
							 | 
						|
									@rptdefs = &get_data("reports.$SESSION{'clid'}");
							 | 
						|
									@lbls = split(/&/, $rptdefs[0]);
							 | 
						|
									foreach $rptdef (@rptdefs) {
							 | 
						|
										chomp ($rptdef);
							 | 
						|
										@flds = split(/&/, $rptdef);
							 | 
						|
										if ($flds[0] eq $FORM{'rptno'}) {
							 | 
						|
											for $i (0 .. $#lbls) {
							 | 
						|
												$REPORT{$lbls[$i]} = $flds[$i];
							 | 
						|
												$i++;
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									if ($FORM{'frm'} == '1') {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
										&show_index_candidates;
							 | 
						|
									} else {
							 | 
						|
										if ($FORM{'frm'} == '2') {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
											&show_index_tests;
							 | 
						|
										} else {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
											if ($FORM{'frm'} == '3') {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
												&show_detail;
							 | 
						|
											} else {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
												if ($FORM{'frm'} == '4') {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
													&show_filter_options;
							 | 
						|
												} else {
							 | 
						|
								if ($HBI_Debug) {warn "Likert.pl running" ;}
							 | 
						|
													print "<HTML>\n";
							 | 
						|
													print "<HEAD></HEAD>\n";
							 | 
						|
													print "<BODY BACKGROUND=\"$SYSTEM{'BACKGROUND'}\" BGCOLOR=\"$SYSTEM{'BGCOLOR'}\"
							 | 
						|
									TEXT=\"$SYSTEM{'TEXT'}\" LINK=\"$SYSTEM{'LINK'}\"
							 | 
						|
									VLINK=\"$SYSTEM{'VLINK'}\" ALINK=\"$SYSTEM{'ALINK'}\">
							 | 
						|
								</BODY>\n";
							 | 
						|
													print "</HTML>\n";
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_index_candidates {
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "Exec Report $FORM{'rptno'}");
							 | 
						|
									&get_client_profile($SESSION{'clid'});
							 | 
						|
								
							 | 
						|
									print "<HTML>
							 | 
						|
								<HEAD>
							 | 
						|
									<TITLE>$REPORT{'rptid'} - $REPORT{'rptdesc'}</TITLE>
							 | 
						|
									<SCRIPT language=\"JavaScript\">
							 | 
						|
								<!--
							 | 
						|
								window.onload=onWdwLoad;
							 | 
						|
								function onWdwLoad() {
							 | 
						|
									document.rptform1.cndnamesort.selectedIndex = -1;
							 | 
						|
									document.rptform1.cndidsort.selectedIndex = -1;
							 | 
						|
								}
							 | 
						|
								function right(e) {
							 | 
						|
									if (navigator.appName == 'Netscape' && (e.which == 3 || e.which == 2)) {
							 | 
						|
										alert(\"$xlatphrase[473]\");
							 | 
						|
										return false;
							 | 
						|
									} else {
							 | 
						|
										if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3)) {
							 | 
						|
											alert(\"$xlatphrase[473]\");
							 | 
						|
											return false;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return true;
							 | 
						|
								}
							 | 
						|
								function nameSelect(f) {
							 | 
						|
									var w=top.detail.rptdtl003.document.location;
							 | 
						|
									f.cndidsort.selectedIndex = -1;
							 | 
						|
									if (f.cndnamesort.selectedIndex != -1) {
							 | 
						|
										w.replace(\"$urlroot/likert_wall.pl?lang=$SESSION{'lang'}&tid=$SESSION{'tid'}&frm=0\");
							 | 
						|
										i=f.cndnamesort.selectedIndex;
							 | 
						|
										f.cndid.value=f.cndnamesort.options[i].value;
							 | 
						|
										f.submit();
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								function idSelect(f) {
							 | 
						|
									var w=top.detail.rptdtl003.document.location;
							 | 
						|
									f.cndnamesort.selectedIndex = -1;
							 | 
						|
									if (f.cndidsort.selectedIndex != -1) {
							 | 
						|
										w.replace(\"$urlroot/likert_wall.pl?lang=$SESSION{'lang'}&tid=$SESSION{'tid'}&frm=0\");
							 | 
						|
										i=f.cndidsort.selectedIndex;
							 | 
						|
										f.cndid.value=f.cndidsort.options[i].value;
							 | 
						|
										f.submit();
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								document.onmousedown=right;
							 | 
						|
								document.onmouseup=right;
							 | 
						|
								if (document.layers) window.captureEvents(Event.MOUSEDOWN);
							 | 
						|
								if (document.layers) window.captureEvents(Event.MOUSEUP);
							 | 
						|
								window.onmousedown=right;
							 | 
						|
								window.onmouseup=right;
							 | 
						|
								// -->
							 | 
						|
									</SCRIPT>
							 | 
						|
								</HEAD>
							 | 
						|
								<BODY BACKGROUND=\"$SYSTEM{'BACKGROUND'}\" BGCOLOR=\"$SYSTEM{'BGCOLOR'}\"
							 | 
						|
									TEXT=\"$SYSTEM{'TEXT'}\" LINK=\"$SYSTEM{'LINK'}\"
							 | 
						|
									VLINK=\"$SYSTEM{'VLINK'}\" ALINK=\"$SYSTEM{'ALINK'}\">
							 | 
						|
								<FORM name=\"rptform1\" action=\"$cgiroot/likert_wall.pl\" METHOD=GET target=\"rpttidx003\">
							 | 
						|
								<CENTER>
							 | 
						|
								<TABLE cellpadding=0 cellspacing=0 border=0 width=100\%>
							 | 
						|
								<input type=hidden name=\"tid\" value=\"$SESSION{'tid'}\">
							 | 
						|
								<input type=hidden name=\"frm\" value=\"2\">
							 | 
						|
								<input type=hidden name=\"rptno\" value=\"$FORM{'rptno'}\">
							 | 
						|
								<input type=hidden name=\"cndid\" value=\"\">
							 | 
						|
								<TR>
							 | 
						|
									<TD ALIGN=\"center\">
							 | 
						|
										<nobr>
							 | 
						|
										<FONT COLOR=\"$SYSTEM{'HEADERCOLOR'}\">
							 | 
						|
										<B>$REPORT{'rptid'} - $REPORT{'rptdesc'}</B><BR>
							 | 
						|
										</FONT>
							 | 
						|
								";
							 | 
						|
								
							 | 
						|
									my @clrecs = &get_client_cnd_list($CLIENT{'clid'});
							 | 
						|
									my @clnamesort=();
							 | 
						|
									my @clidsort=();
							 | 
						|
									my $namesort;
							 | 
						|
									my $idsort;
							 | 
						|
									my $mycreator;
							 | 
						|
									my $imaregistrar = &get_a_key("cnd.$SESSION{'clid'}", $SESSION{'uid'}, "registrar");
							 | 
						|
									for (1 .. $#clrecs) {
							 | 
						|
										$clrecs[$_] =~ s/\n//g;
							 | 
						|
										@cndrecs = split(/&/, $clrecs[$_]);
							 | 
						|
										$id = $cndrecs[0];
							 | 
						|
										$nmf = $cndrecs[3];
							 | 
						|
										$nmm = $cndrecs[4];
							 | 
						|
										$nml = $cndrecs[5];
							 | 
						|
										$mycreator = $cndrecs[15];
							 | 
						|
										
							 | 
						|
											unless (($id eq '') || ($nml eq '')) {
							 | 
						|
												$namesort=join('&',$nml,$nmf,$nmm,$id);
							 | 
						|
												if ($imaregistrar eq 'Y') {
							 | 
						|
													if ($SESSION{'uid'} eq $mycreator) {
							 | 
						|
														push @clnamesort, $namesort;
							 | 
						|
													}
							 | 
						|
												} else {
							 | 
						|
													push @clnamesort, $namesort;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
									}
							 | 
						|
									@clrecs = sort @clnamesort;
							 | 
						|
									@clnamesort=();
							 | 
						|
									print "Name:<SELECT name=\"cndnamesort\" onChange=\"return nameSelect(this.form)\">\n";
							 | 
						|
									print "<OPTION value=\"-1\"> </OPTION>\n";
							 | 
						|
									for (0 .. $#clrecs) {
							 | 
						|
										($nml, $nmf, $nmm, $id) = split(/&/, $clrecs[$_]);
							 | 
						|
										$idsort=join('&',$id,$nml,$nmf,$nmm);
							 | 
						|
										push @clidsort, $idsort;
							 | 
						|
										print "<OPTION value=\"$id\">$nml, $nmf $nmm ($id)</OPTION>\n";
							 | 
						|
									}
							 | 
						|
									print "</SELECT>\n";
							 | 
						|
									@clrecs = sort @clidsort;
							 | 
						|
									@clidsort=();
							 | 
						|
									print "\ ID:<SELECT name=\"cndidsort\" onChange=\"return idSelect(this.form)\">\n";
							 | 
						|
									print "<OPTION value=\"-1\"> </OPTION>\n";
							 | 
						|
									for (0 .. $#clrecs) {
							 | 
						|
										($id,$nml,$nmf,$nmm) = split(/&/, $clrecs[$_]);
							 | 
						|
										print "<OPTION value=\"$id\">$id - $nml, $nmf $nmm\n";
							 | 
						|
									}
							 | 
						|
									print "</SELECT>\n";
							 | 
						|
									@clrecs=();
							 | 
						|
									print "</nobr>
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								</TABLE>
							 | 
						|
								</FORM>
							 | 
						|
								</CENTER>
							 | 
						|
								</BODY>
							 | 
						|
								</HTML>
							 | 
						|
								";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_index_tests {
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "Exec Report $FORM{'rptno'}");
							 | 
						|
									&get_client_profile($SESSION{'clid'});
							 | 
						|
									&get_candidate_profile( $SESSION{'clid'}, $FORM{'cndid'});
							 | 
						|
								
							 | 
						|
									my $style = "SELECT {\"width: 200px;height: 200px;font-size: 8pt;\"}";
							 | 
						|
									print "<HTML>
							 | 
						|
								<HEAD>
							 | 
						|
									<TITLE>$REPORT{'rptid'} - $REPORT{'rptdesc'}</TITLE>
							 | 
						|
									<STYLE>
							 | 
						|
								<!--
							 | 
						|
								$style
							 | 
						|
								-->
							 | 
						|
									</STYLE>
							 | 
						|
									<SCRIPT language=\"JavaScript\">
							 | 
						|
								<!--
							 | 
						|
								window.onload=onWdwLoad;
							 | 
						|
								function onWdwLoad() {
							 | 
						|
									document.rptform1.tstid.selectedIndex = -1;
							 | 
						|
								}
							 | 
						|
								function right(e) {
							 | 
						|
									if (navigator.appName == 'Netscape' && (e.which == 3 || e.which == 2)) {
							 | 
						|
										alert(\"This source and all graphics are proprietary and may not be viewed or copied.\");
							 | 
						|
										return false;
							 | 
						|
									} else {
							 | 
						|
										if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3)) {
							 | 
						|
											alert(\"This source and all graphics are proprietary and may not be viewed or copied.\");
							 | 
						|
											return false;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return true;
							 | 
						|
								}
							 | 
						|
								function testSelect(f) {
							 | 
						|
									if (f.tstsel.selectedIndex != -1) {
							 | 
						|
										f.submit();
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								function clearOptions(f) {
							 | 
						|
									var i,s,u,c;
							 | 
						|
									u=\"\";
							 | 
						|
									c=0;
							 | 
						|
									f.multiple.value=\"0\";
							 | 
						|
									for (i=0; i < f.tstsel.options.length; i++) {
							 | 
						|
										if (f.tstsel.options[i].selected) {
							 | 
						|
											if (u != \"\") {
							 | 
						|
												u += \",\";
							 | 
						|
												f.multiple.value=\"1\";
							 | 
						|
											}
							 | 
						|
											u += f.tstsel.options[i].value;
							 | 
						|
											c++;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									f.tstid.value=u;
							 | 
						|
									if (c == 0) {
							 | 
						|
										top.detail.rptdtl003.document.location.replace(\"$urlroot/likert_wall.pl?lang=$SESSION{'lang'}&tid=$SESSION{'tid'}&frm=0\");
							 | 
						|
										return false;
							 | 
						|
									} else {
							 | 
						|
										f.submit();
							 | 
						|
										return true;
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								document.onmousedown=right;
							 | 
						|
								document.onmouseup=right;
							 | 
						|
								if (document.layers) window.captureEvents(Event.MOUSEDOWN);
							 | 
						|
								if (document.layers) window.captureEvents(Event.MOUSEUP);
							 | 
						|
								window.onmousedown=right;
							 | 
						|
								window.onmouseup=right;
							 | 
						|
								// -->
							 | 
						|
									</SCRIPT>
							 | 
						|
								</HEAD>
							 | 
						|
								<BODY BACKGROUND=\"$SYSTEM{'BACKGROUND'}\" BGCOLOR=\"$SYSTEM{'BGCOLOR'}\"
							 | 
						|
									TEXT=\"$SYSTEM{'TEXT'}\" LINK=\"$SYSTEM{'LINK'}\"
							 | 
						|
									VLINK=\"$SYSTEM{'VLINK'}\" ALINK=\"$SYSTEM{'ALINK'}\">
							 | 
						|
								<FORM name=\"rptform1\" action=\"$cgiroot/likert_wall.pl\"
							 | 
						|
									METHOD=GET target=\"rptdtl003\">
							 | 
						|
								<CENTER>
							 | 
						|
								<TABLE cellpadding=0 cellspacing=0 border=0 width=100\%>
							 | 
						|
								<input type=hidden name=\"tid\" value=\"$SESSION{'tid'}\">
							 | 
						|
								<input type=hidden name=\"frm\" value=\"4\">
							 | 
						|
								<input type=hidden name=\"rptno\" value=\"$FORM{'rptno'}\">
							 | 
						|
								<input type=hidden name=\"cndid\" value=\"$FORM{'cndid'}\">
							 | 
						|
								<input type=hidden name=\"clid\" value=\"$CLIENT{'clid'}\">
							 | 
						|
								<input type=hidden name=\"tstid\" value=\"\">
							 | 
						|
								<input type=hidden name=\"multiple\" value=\"0\">
							 | 
						|
								<TR>
							 | 
						|
									<TD ALIGN=\"center\">
							 | 
						|
										<nobr>
							 | 
						|
										<FONT COLOR=\"$SYSTEM{'HEADERCOLOR'}\" SIZE=2>
							 | 
						|
										<B>$CANDIDATE{'nml'}, $CANDIDATE{'nmf'} $CANDIDATE{'nmm'}</B><BR>
							 | 
						|
										</FONT>
							 | 
						|
										<nobr>
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								<TR>
							 | 
						|
									<TD ALIGN=\"center\">
							 | 
						|
								";
							 | 
						|
									my @trecs = &get_test_list($CLIENT{'clid'});
							 | 
						|
									my @tmptrecs = ();
							 | 
						|
									for (1 .. $#trecs) {
							 | 
						|
										($id, $desc) = split(/&/, $trecs[$_]);
							 | 
						|
										$trecs[$_] = join('&', "$desc", "$id");
							 | 
						|
										push @tmptrecs, $trecs[$_];
							 | 
						|
									}
							 | 
						|
									@trecs = sort @tmptrecs;
							 | 
						|
									print "\t\t<SELECT name=\"tstsel\" size=\"8\" multiple Height=200 Width=200 onChange=\"return clearOptions(this.form)\">\n";
							 | 
						|
									for (0 .. $#trecs) {
							 | 
						|
										($desc,$id) = split(/&/, $trecs[$_]);
							 | 
						|
										$testscompleted = CountHistoricTests($testcomplete,$CLIENT{'clid'},$id,$FORM{'cndid'});
							 | 
						|
										if ($testscompleted == 0) {
							 | 
						|
											$testscompleted = CountTestFilesByCnd($testcomplete,$CLIENT{'clid'},$id,$FORM{'cndid'});
							 | 
						|
										}
							 | 
						|
										$testsinprogress = CountTestFilesByCnd($testinprog, $CLIENT{'clid'},$id,$FORM{'cndid'});
							 | 
						|
										$testspending = CountTestFilesByCnd($testpending, $CLIENT{'clid'},$id,$FORM{'cndid'});
							 | 
						|
										if (($testsinprogress != 0) || ($testspending != 0) || ($testscompleted != 0)) {
							 | 
						|
											print "\t\t\t<OPTION value=\"$id\">$testscompleted-$testsinprogress-$testspending $desc\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									print "\t\t</SELECT>
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								<TR>
							 | 
						|
									<TD ALIGN=\"center\">
							 | 
						|
										<FONT COLOR=\"$SYSTEM{'HEADERCOLOR'}\" SIZE=2>
							 | 
						|
										$xlatphrase[721]
							 | 
						|
										</FONT>
							 | 
						|
								<!--
							 | 
						|
										<INPUT TYPE=BUTTON name=\"show\" value=\"$xlatphrase[27]\"  onClick=\"return testSelect(this.form)\">
							 | 
						|
								-->
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								</TABLE>
							 | 
						|
								</FORM>
							 | 
						|
								</BODY>
							 | 
						|
								</HTML>
							 | 
						|
								";
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Exec Report $FORM{'rptno'} completed");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_filter_options {
							 | 
						|
									my $cndid;
							 | 
						|
									my $cndname;
							 | 
						|
									my @testdates;
							 | 
						|
									my $iopt;
							 | 
						|
									my $optval;
							 | 
						|
									my $optdesc;
							 | 
						|
									my $lstdates;
							 | 
						|
									my $qcor;
							 | 
						|
									my $qinc;
							 | 
						|
									my $tscore;
							 | 
						|
									my $trash;
							 | 
						|
									my $j;
							 | 
						|
									my $i;
							 | 
						|
									my @tests;
							 | 
						|
									my @tmpdates;
							 | 
						|
									my $jscript;
							 | 
						|
									my $colspan;
							 | 
						|
								
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "Report Options $FORM{'rptno'}");
							 | 
						|
									&get_client_profile($SESSION{'clid'});
							 | 
						|
									&get_candidate_profile( $SESSION{'clid'}, $FORM{'cndid'});
							 | 
						|
									@tests = split(/\,/,$FORM{'tstid'});
							 | 
						|
								
							 | 
						|
									$cndname = join('', $CANDIDATE{'nml'}, ", ", $CANDIDATE{'nmf'}, " ", $CANDIDATE{'nmm'});
							 | 
						|
									$cndid = $CANDIDATE{'uid'};
							 | 
						|
									$lstdates = "<SELECT name=tdatesel size=10 multiple>\n";
							 | 
						|
									$jscript="var s=new Array();\n";
							 | 
						|
									if ($FORM{'multiple'} ne '1') {
							 | 
						|
										$testdescriptions = "$FORM{'tstid'} - $TEST{'desc'}\<br\>";
							 | 
						|
										&get_test_profile($CLIENT{'clid'}, $FORM{'tstid'});
							 | 
						|
										@testdates = getHistoricTests($testcomplete,$CLIENT{'clid'},$FORM{'tstid'},$FORM{'cndid'});
							 | 
						|
										for $iopt (0 .. $#testdates) {
							 | 
						|
											$j=$#testdates-$iopt;
							 | 
						|
											($optval,$qcor,$qinc,$tscore) = split(/&/, $testdates[$j]);
							 | 
						|
											$optdesc = $optval;
							 | 
						|
											$optval =~ s/ /_/g;
							 | 
						|
											#$optdesc =~ s/ GMT//g;
							 | 
						|
											if ($TEST{'seq'} eq 'std') {
							 | 
						|
												$lstdates = join('',$lstdates,"<OPTION value=\"$optval\">$optdesc\ ($tscore)\n");
							 | 
						|
												$jscript = join('',$jscript,"s[$iopt]=$tscore;\n");
							 | 
						|
											} else {
							 | 
						|
												$lstdates = join('',$lstdates,"<OPTION value=\"$optval\">$optdesc</OPTION>\n");
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									} else {
							 | 
						|
										$iopt=0;
							 | 
						|
										$testdescriptions = "";
							 | 
						|
										for $i (0 .. $#tests) {
							 | 
						|
											if ($tests[$i] ne '') {
							 | 
						|
												&get_test_profile($CLIENT{'clid'}, $tests[$i]);
							 | 
						|
												@tmpdates = getHistoricTests($testcomplete,$CLIENT{'clid'},$tests[$i],$FORM{'cndid'});
							 | 
						|
												if ($iopt > 0) {
							 | 
						|
													$testdescriptions = join(', ',$testdescriptions,"<nobr>$tests[$i] - $TEST{'desc'}</nobr>");
							 | 
						|
												} else {
							 | 
						|
													$testdescriptions = join('',$testdescriptions,"<nobr>$tests[$i] - $TEST{'desc'}</nobr>");
							 | 
						|
												}
							 | 
						|
												if ($#tmpdates != -1) {
							 | 
						|
													$j=$#tmpdates;
							 | 
						|
													$testdates[$iopt]=$tmpdates[$j];
							 | 
						|
													($optval,$qcor,$qinc,$tscore) = split(/&/, $tmpdates[$j]);
							 | 
						|
													$optdesc = $optval;
							 | 
						|
													$optval =~ s/ /_/g;
							 | 
						|
													$optval = join('+',$optval,$TEST{'id'});
							 | 
						|
													#$optdesc =~ s/ GMT//g;
							 | 
						|
													$optdesc = join(' ',$optdesc,$TEST{'id'});
							 | 
						|
													if ($TEST{'seq'} eq 'std') {
							 | 
						|
														$lstdates = join('',$lstdates,"<OPTION value=\"$optval\">$optdesc\ ($tscore)\n");
							 | 
						|
														$jscript = join('',$jscript,"s[$iopt]=$tscore;\n");
							 | 
						|
														$iopt++;
							 | 
						|
													} else {
							 | 
						|
														$lstdates = join('',$lstdates,"<OPTION value=\"$optval\">$optdesc\n");
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									$lstdates = join('',$lstdates,"</SELECT>\n");
							 | 
						|
									$styles = "SELECT {\"font-size: 8pt;\"}\n";
							 | 
						|
									$styles = join('',$styles,"INPUT {\"font-size: 8pt;height: 20px;\"}\n");
							 | 
						|
									print "<HTML>
							 | 
						|
								<HEAD>
							 | 
						|
									<TITLE>$REPORT{'rptid'} - $REPORT{'rptdesc'}</TITLE>
							 | 
						|
									<STYLE>
							 | 
						|
								<!--
							 | 
						|
								$styles
							 | 
						|
								-->
							 | 
						|
									</STYLE>
							 | 
						|
									<SCRIPT language=\"JavaScript\">
							 | 
						|
								<!--
							 | 
						|
								$jscript
							 | 
						|
								function wdwOnLoad() {
							 | 
						|
									var f;
							 | 
						|
									f=document.rptform1;
							 | 
						|
									f.onsubmit=submitMe;
							 | 
						|
									f.tdatesel.focus();
							 | 
						|
									f.cbsellast.selectedIndex=0;
							 | 
						|
									exportClick(f);
							 | 
						|
									selall(f);
							 | 
						|
								}
							 | 
						|
								function exportClick(f) {
							 | 
						|
									if (f.cbexport.checked) {
							 | 
						|
										f.target = \"_self\";
							 | 
						|
									} else {
							 | 
						|
										f.target = \"reportdetail\";
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								function submitMe() {
							 | 
						|
									var f;
							 | 
						|
									var bok = false;
							 | 
						|
									f = document.rptform1;
							 | 
						|
									f.testdates.value=\"\";
							 | 
						|
									for (i=0; i < f.tdatesel.options.length; i++) {
							 | 
						|
										if (f.tdatesel.options[i].selected) {
							 | 
						|
											bok = true;
							 | 
						|
											f.testdates.value += \",\";
							 | 
						|
											f.testdates.value += f.tdatesel.options[i].value;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									if (bok) {
							 | 
						|
										f.testdates.value += \",\";
							 | 
						|
									} else {
							 | 
						|
										alert(\"You must select at least one test date.\");
							 | 
						|
										f.tdatesel.focus();
							 | 
						|
									}
							 | 
						|
									return bok;
							 | 
						|
								}
							 | 
						|
								function selall(f) {
							 | 
						|
									var i;
							 | 
						|
									for (i=0; i < f.tdatesel.options.length; i++) {
							 | 
						|
										f.tdatesel.options[i].selected = true;
							 | 
						|
									}
							 | 
						|
									return false;
							 | 
						|
								}
							 | 
						|
								function deselall(f) {
							 | 
						|
									var i;
							 | 
						|
									for (i=0; i < f.tdatesel.options.length; i++) {
							 | 
						|
										f.tdatesel.options[i].selected = false;
							 | 
						|
									}
							 | 
						|
									return false;
							 | 
						|
								}
							 | 
						|
								function sellast(f) {
							 | 
						|
									var i,j,n,t;
							 | 
						|
									j=f.cbsellast.selectedIndex;
							 | 
						|
									if (j != -1) {
							 | 
						|
										if (j == 0) {
							 | 
						|
											selall(f);
							 | 
						|
										} else {
							 | 
						|
											n=f.cbsellast.options[j].value;
							 | 
						|
											if (n > 10) {
							 | 
						|
												selscores(f,n);
							 | 
						|
											} else {
							 | 
						|
												deselall(f);
							 | 
						|
												t=f.tdatesel.options.length;
							 | 
						|
												n=(t < f.cbsellast.options[j].value) ? t : f.cbsellast.options[j].value;
							 | 
						|
												for (i=0; i < n; i++) {
							 | 
						|
													f.tdatesel.options[i].selected = true;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return false;
							 | 
						|
								}
							 | 
						|
								function selscores(f,j) {
							 | 
						|
									var i,n,h,l,nh,nl;
							 | 
						|
									if (j == 11) {
							 | 
						|
										n=0;
							 | 
						|
										j=0;
							 | 
						|
										for (i=0; i < f.tdatesel.options.length; i++) {
							 | 
						|
											if (s[i] > n) {
							 | 
						|
												j=i;
							 | 
						|
												n=s[i];
							 | 
						|
											} 
							 | 
						|
										}
							 | 
						|
										f.tdatesel.selectedIndex=j;
							 | 
						|
									} else {
							 | 
						|
										selall(f);
							 | 
						|
										if (j == 12) {
							 | 
						|
											nl=101;
							 | 
						|
											for (i=f.tdatesel.options.length-1; i >= 0; i--) {
							 | 
						|
												if (s[i] < nl) {
							 | 
						|
													l=i;
							 | 
						|
													nl=s[i];
							 | 
						|
												} 
							 | 
						|
											}
							 | 
						|
											f.tdatesel.options[l].selected=false;
							 | 
						|
										} else {
							 | 
						|
											nh=0;
							 | 
						|
											nl=101;
							 | 
						|
											for (i=f.tdatesel.options.length-1; i >= 0; i--) {
							 | 
						|
												if (s[i] > nh) {
							 | 
						|
													h=i;
							 | 
						|
													nh=s[i];
							 | 
						|
												} 
							 | 
						|
											}
							 | 
						|
											for (i=f.tdatesel.options.length-1; i >= 0; i--) {
							 | 
						|
												if (i != h) {
							 | 
						|
													if (s[i] < nl) {
							 | 
						|
														l=i;
							 | 
						|
														nl=s[i];
							 | 
						|
													}
							 | 
						|
												} 
							 | 
						|
											}
							 | 
						|
											f.tdatesel.options[l].selected=false;
							 | 
						|
											f.tdatesel.options[h].selected=false;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return false;
							 | 
						|
								}
							 | 
						|
								function right(e) {
							 | 
						|
									if (navigator.appName == 'Netscape' && (e.which == 3 || e.which == 2)) {
							 | 
						|
										alert(\"This source and all graphics are proprietary and may not be viewed or copied.\");
							 | 
						|
										return false;
							 | 
						|
									} else {
							 | 
						|
										if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3)) {
							 | 
						|
											alert(\"This source and all graphics are proprietary and may not be viewed or copied.\");
							 | 
						|
											return false;
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return true;
							 | 
						|
								}
							 | 
						|
								document.onmousedown=right;
							 | 
						|
								document.onmouseup=right;
							 | 
						|
								if (document.layers) window.captureEvents(Event.MOUSEDOWN);
							 | 
						|
								if (document.layers) window.captureEvents(Event.MOUSEUP);
							 | 
						|
								window.onmousedown=right;
							 | 
						|
								window.onmouseup=right;
							 | 
						|
								window.onload=wdwOnLoad;
							 | 
						|
								// -->
							 | 
						|
									</SCRIPT>
							 | 
						|
								</HEAD>
							 | 
						|
								<BODY BACKGROUND=\"$SYSTEM{'BACKGROUND'}\" BGCOLOR=\"$SYSTEM{'BGCOLOR'}\"
							 | 
						|
									TEXT=\"$SYSTEM{'TEXT'}\" LINK=\"$SYSTEM{'LINK'}\"
							 | 
						|
									VLINK=\"$SYSTEM{'VLINK'}\" ALINK=\"$SYSTEM{'ALINK'}\">
							 | 
						|
								<FORM name=\"rptform1\" action=\"$cgiroot/likert_wall.pl\" METHOD=GET TARGET=\"reportdetail\">
							 | 
						|
								<input type=hidden name=\"tid\" value=\"$SESSION{'tid'}\">
							 | 
						|
								<input type=hidden name=\"frm\" value=\"3\">
							 | 
						|
								<input type=hidden name=\"rptno\" value=\"$FORM{'rptno'}\">
							 | 
						|
								<input type=hidden name=\"tstid\" value=\"$FORM{'tstid'}\">
							 | 
						|
								<input type=hidden name=\"cndid\" value=\"$FORM{'cndid'}\">
							 | 
						|
								<input type=hidden name=\"clid\" value=\"$FORM{'clid'}\">
							 | 
						|
								<input type=hidden name=\"testdates\" value=\"\">
							 | 
						|
								<input type=hidden name=\"multiple\" value=\"$FORM{'multiple'}\">
							 | 
						|
								<CENTER>
							 | 
						|
								<TABLE cellpadding=0 cellspacing=0 border=0 width=100\%>
							 | 
						|
								<TR>
							 | 
						|
									<TD ALIGN=\"left\" valign=\"top\">
							 | 
						|
										<FONT COLOR=\"$SYSTEM{'HEADERCOLOR'}\" SIZE=1>
							 | 
						|
										$testdescriptions
							 | 
						|
										</FONT>
							 | 
						|
									</TD>
							 | 
						|
								</TABLE>
							 | 
						|
								<TABLE cellpadding=0 cellspacing=0 border=1 width=100\%>
							 | 
						|
								";
							 | 
						|
									if ($TEST{'seq'} eq 'std') {
							 | 
						|
										print "<TR>
							 | 
						|
									<TD rowspan=4>
							 | 
						|
										<TABLE cellpadding=0 cellspacing=0 border=0 width=100\%>
							 | 
						|
										<TR>
							 | 
						|
											<TD align=\"center\">
							 | 
						|
												<FONT COLOR=\"$SYSTEM{'HEADERCOLOR'}\" SIZE=2>
							 | 
						|
												$xlatphrase[687]<br>
							 | 
						|
												</font>
							 | 
						|
											</TD>
							 | 
						|
										</TR>
							 | 
						|
										<TR>
							 | 
						|
											<TD align=\"center\">
							 | 
						|
												<FONT SIZE=2>
							 | 
						|
												$lstdates</br>
							 | 
						|
												</font>
							 | 
						|
											</TD>
							 | 
						|
										</TR>
							 | 
						|
										</TABLE>
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								";
							 | 
						|
										$colspan="colspan=2";
							 | 
						|
									} else {
							 | 
						|
										print "<TR>
							 | 
						|
									<TD>
							 | 
						|
										<TABLE cellpadding=0 cellspacing=0 border=0 width=100\%>
							 | 
						|
										<TR>
							 | 
						|
											<TD align=\"center\">
							 | 
						|
												<FONT COLOR=\"$SYSTEM{'HEADERCOLOR'}\" SIZE=2>
							 | 
						|
												$xlatphrase[687]<br>
							 | 
						|
												</font>
							 | 
						|
											</TD>
							 | 
						|
										</TR>
							 | 
						|
										<TR>
							 | 
						|
											<TD align=\"center\">
							 | 
						|
												<font size=1>
							 | 
						|
												<SELECT NAME=\"cbsellast\" onChange=\"sellast(this.form)\">
							 | 
						|
													<OPTION value=0>$xlatphrase[634]
							 | 
						|
													<OPTION value=1>$xlatphrase[695]
							 | 
						|
													<OPTION value=2>$xlatphrase[696]
							 | 
						|
													<OPTION value=3>$xlatphrase[697]
							 | 
						|
													<OPTION value=4>$xlatphrase[698]
							 | 
						|
													<OPTION value=5>$xlatphrase[699]
							 | 
						|
													<OPTION value=6>$xlatphrase[700]
							 | 
						|
													<OPTION value=7>$xlatphrase[701]
							 | 
						|
													<OPTION value=8>$xlatphrase[702]
							 | 
						|
													<OPTION value=9>$xlatphrase[703]
							 | 
						|
													<OPTION value=10>$xlatphrase[704]
							 | 
						|
												</SELECT>
							 | 
						|
												</font>
							 | 
						|
											</TD>
							 | 
						|
										</TR>
							 | 
						|
										<TR>
							 | 
						|
											<TD align=\"center\">
							 | 
						|
												<FONT SIZE=2>
							 | 
						|
												$lstdates</br>
							 | 
						|
												</font>
							 | 
						|
											</TD>
							 | 
						|
										</TR>
							 | 
						|
										</TABLE>
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								";
							 | 
						|
										$colspan="";
							 | 
						|
									}
							 | 
						|
									print "<TR>
							 | 
						|
									<TD $colspan ALIGN=\"center\">
							 | 
						|
										<font size=2>
							 | 
						|
									";
							 | 
						|
									$testspending = CountTestFilesByCnd($testpending, $CLIENT{'clid'},$id,$FORM{'cndid'});
							 | 
						|
									if ($testspending > 0) {
							 | 
						|
										print "
							 | 
						|
										Print\ \; <A HREF=\"$cgiroot/tmaster.pl?tid=$SESSION{'tid'}&clid=$CLIENT{'clid'}&cndid=$CANDIDATE{'uid'}&tstid=$TEST{'id'}\" TARGET=\"prtwindow\">Master/Key</A>";
							 | 
						|
									}
							 | 
						|
										print "\ <br>
							 | 
						|
										<INPUT type=\"submit\" name=\"submit\" value=\"$xlatphrase[709]\">
							 | 
						|
										\ <br>
							 | 
						|
										</font>
							 | 
						|
									</TD>
							 | 
						|
								</TR>
							 | 
						|
								</TABLE>
							 | 
						|
								</FORM>
							 | 
						|
								</CENTER>
							 | 
						|
								</BODY>
							 | 
						|
								</HTML>
							 | 
						|
								";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub show_detail {
							 | 
						|
									my @tentries;
							 | 
						|
									my @tcols;
							 | 
						|
									my $i;
							 | 
						|
									my $j;
							 | 
						|
									my $k;
							 | 
						|
									my $loidx;
							 | 
						|
									my $hiidx;
							 | 
						|
									my $loscore;
							 | 
						|
									my $hiscore;
							 | 
						|
									my $avgscore;
							 | 
						|
									my $avgcount;
							 | 
						|
									my @testdates;
							 | 
						|
									my @found;
							 | 
						|
									my $sgrepfor;
							 | 
						|
									my $bDisplay;
							 | 
						|
									my $timetaken;
							 | 
						|
									my $testtitle;
							 | 
						|
									my $tstdate;
							 | 
						|
									my $testid;
							 | 
						|
									my @tmparray;
							 | 
						|
									my @tmpdates;
							 | 
						|
								
							 | 
						|
									print "<HTML>
							 | 
						|
								<HEAD>
							 | 
						|
									<TITLE>$REPORT{'rptid'} - Likert Report - $REPORT{'rptdesc'}</TITLE>
							 | 
						|
								</HEAD>
							 | 
						|
								<BODY BACKGROUND=\"$SYSTEM{'BACKGROUND'}\" BGCOLOR=\"$SYSTEM{'BGCOLOR'}\"
							 | 
						|
									TEXT=\"$SYSTEM{'TEXT'}\" LINK=\"$SYSTEM{'LINK'}\"
							 | 
						|
									VLINK=\"$SYSTEM{'VLINK'}\" ALINK=\"$SYSTEM{'ALINK'}\"> " ;
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "Exec Report $FORM{'rptno'}");
							 | 
						|
									&get_client_profile($SESSION{'clid'});
							 | 
						|
								# populates the Assoc. array %CLIENT with data for the client id.
							 | 
						|
									&get_candidate_profile( $SESSION{'clid'}, $FORM{'cndid'});
							 | 
						|
								# populates the Assoc. array %CANDIDATE with data for the candidate/user/student who took the test/survey.
							 | 
						|
								# HBI - Go find the format of the test results.
							 | 
						|
									if ($FORM{'multiple'} ne '1') {
							 | 
						|
										&get_test_profile($CLIENT{'clid'}, $FORM{'tstid'});
							 | 
						|
								# populates the Assoc. array %TEST with the characteristics of the test (but not the questions or answers).
							 | 
						|
								  $foo = get_test_sequence_for_reports($CLIENT{'clid'},$FORM{'cndid'}, $FORM{'tstid'});
							 | 
						|
								# populates the Assoc. arrays %TEST_SESSION, %SUBTEST_QUESTIONS, %SUBTEST_ANSWERS, %SUBTEST_RESPONSES,
							 | 
						|
								#   and %SUBTEST_SUMMARY.
							 | 
						|
								  my $QUESTIONS_AH = get_question_definitions ($CLIENT{'clid'}, $FORM{'tstid'});
							 | 
						|
								# Populates an array of hashs that contains all of the questions and the answers.
							 | 
						|
								#   $QUESTIONS_AH is a reference to the arrays of hashs.
							 | 
						|
								if ($HBI_Debug) {
							 | 
						|
								  print "\<br\>\n" ;
							 | 
						|
								  print "\<br\>\<br\>CLIENT HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%CLIENT)) {
							 | 
						|
								    print "KEY $key VAL $CLIENT{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>SESSION HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%SESSION)) {
							 | 
						|
								    print "KEY $key VAL $SESSION{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>FORM HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%FORM)) {
							 | 
						|
								    print "KEY $key VAL $FORM{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>CANDIDATE HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%CANDIDATE)) {
							 | 
						|
								    print "KEY $key VAL $CANDIDATE{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>TEST HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%TEST)) {
							 | 
						|
								    print "KEY $key VAL $TEST{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>TEST_SESSION HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%TEST_SESSION)) {
							 | 
						|
								    print "KEY $key VAL $TEST_SESSION{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>SUBTEST_QUESTIONS HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%SUBTEST_QUESTIONS)) {
							 | 
						|
								    print "KEY $key VAL $SUBTEST_QUESTIONS{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>SUBTEST_ANSWERS HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%SUBTEST_ANSWERS)) {
							 | 
						|
								    print "KEY $key VAL $SUBTEST_ANSWERS{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>SUBTEST_RESPONSES HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%SUBTEST_RESPONSES)) {
							 | 
						|
								    print "KEY $key VAL $SUBTEST_RESPONSES{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								  print "\<br\>\<br\>SUBTEST_SUMMARY HASH ARRAY\<br\>\n" ;
							 | 
						|
								  foreach $key (sort keys (%SUBTEST_SUMMARY)) {
							 | 
						|
								    print "KEY $key VAL $SUBTEST_SUMMARY{$key}\<br\>\n" ;
							 | 
						|
								  }
							 | 
						|
								}  # end of if $HBI_Debug 
							 | 
						|
								  $last_index = $#{$QUESTIONS_AH} ; # Last index of the Array of Hashs of the Q&A.
							 | 
						|
								if ($HBI_Debug) {
							 | 
						|
								  if ($last_index == -1) {
							 | 
						|
								    print "\<br\>\n" ;
							 | 
						|
								    print "\<br\>\<br\>QUESTIONS_AH HASH ARRAY is empty.\<br\>\n" ;
							 | 
						|
								    print "\<br\>\n" ;
							 | 
						|
								  } else {
							 | 
						|
								    foreach $index (0 .. $last_index) {
							 | 
						|
								      print "\<br\>\n" ; # HBI
							 | 
						|
								      print "\<br\>\<br\>QUESTIONS_AH HASH ARRAY Element $index \<br\>\n" ;
							 | 
						|
								      foreach $key (sort keys (%{${$QUESTIONS_AH}[$index]})) {
							 | 
						|
								        print "KEY $key VAL " ;
							 | 
						|
								        print "${$QUESTIONS_AH}[$index]->{$key}" ;
							 | 
						|
								        print "\<br\>\n" ;
							 | 
						|
								      }  # end foreach $key
							 | 
						|
								    }  # end foreach $index
							 | 
						|
								  }   # end of if $last_index
							 | 
						|
								}  # end of if $HBI_Debug
							 | 
						|
								  my %supercat_total = () ; # Total points available for a category.
							 | 
						|
								  my %supercat_earned = () ; # Points earned for a category.
							 | 
						|
									# The following values have a similar name, and are logically connected.
							 | 
						|
									my $SUPERCAT_TOTAL = 0 ; # Total points available in all categories.
							 | 
						|
									my $SUPERCAT_EARNED = 0 ; # Total points earned in all categories.
							 | 
						|
								  $last_index = $#{$QUESTIONS_AH} ; # Last index of the Array of Hashs of the Q&A.
							 | 
						|
								  my $points, $weight, @scores, @correct_ans, @incorrect_ans, @all_ans ;
							 | 
						|
								  my $ques_type, $supercat, $scores, @responses, $responses ;
							 | 
						|
								  my @individ, $individ, @img_labels, @img_data ;
							 | 
						|
								  $responses = $SUBTEST_RESPONSES{2} ;
							 | 
						|
								  @responses = split (/\&/, $responses) ;
							 | 
						|
								  shift @responses ; # Drop the empty element in front of the list.
							 | 
						|
								  if ($last_index == -1) {
							 | 
						|
								    print "\<br\>\n" ;
							 | 
						|
								    print "\<br\>\<br\>No Questions in the test.\<br\>\n" ;
							 | 
						|
								    print "\<br\>\n" ;
							 | 
						|
								  } else {
							 | 
						|
								    foreach $index1 (0 .. $last_index) {
							 | 
						|
								      # Get the data for a single question.
							 | 
						|
								      $points = ${$QUESTIONS_AH}[$index1]->{'pts'} ;
							 | 
						|
								      $weight = ${$QUESTIONS_AH}[$index1]->{'wght'} ;
							 | 
						|
								      $ques_type = ${$QUESTIONS_AH}[$index1]->{'qtp'} ;
							 | 
						|
											$scores = ${$QUESTIONS_AH}[$index1]->{'scores'} ;
							 | 
						|
								      @scores = split (/\,/ , $scores) ;
							 | 
						|
											$supercat = ${$QUESTIONS_AH}[$index1]->{'supercat'} ;
							 | 
						|
											if ($ques_type eq "lik") {
							 | 
						|
												$supercat_total{$supercat} += $points ;
							 | 
						|
												$SUPERCAT_TOTAL += $points ;
							 | 
						|
												$responses = $responses[$index1] ;
							 | 
						|
								        @individ = split(/\?/, $responses) ;
							 | 
						|
												shift @individ ;
							 | 
						|
												foreach $index2 (0 .. $#scores) {
							 | 
						|
													print "\<br\>index2 $index2 individ elem $individ[$index2] scores elem $scores[$index2]\n" if $HBI_Debug ;
							 | 
						|
													if ($individ[$index2] ne "xxx" and $individ[$index2] ne "" and $individ[$index2] == $index2) {
							 | 
						|
														$supercat_earned{$supercat} += $scores[$index2] ;
							 | 
						|
														$SUPERCAT_EARNED += $scores[$index2] ;
							 | 
						|
								        		print "\<br\>supercat $supercat responses $responses index1 $index1 index2 $index2 \<br\>\n" if $HBI_Debug ;
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											} #  end of if $ques_type
							 | 
						|
								    }  # end foreach $index
							 | 
						|
								    print "\<br\>\n" ;
							 | 
						|
								    print "Candidate: $CANDIDATE{'nmf'} " ;
							 | 
						|
								    if ($CANDIDATE{'nmm'}) {print "$CANDIDATE{'nmm'} " ;}
							 | 
						|
								    print "$CANDIDATE{'nml'} \<br\>\n" ;
							 | 
						|
								    my $percent ;
							 | 
						|
								    @img_labels = () ;
							 | 
						|
								    @img_data = () ;
							 | 
						|
										my $category_count = keys %supercat_total ; # The number of elements of %supercat_total
							 | 
						|
										if ($category_count) {
							 | 
						|
								    	foreach $rep (sort keys %supercat_total) {
							 | 
						|
								      	$percent = int ((100.0 * $supercat_earned{$rep} / $supercat_total{$rep}) +0.5) ;
							 | 
						|
								    		print "$rep Score: $percent\%\<br\>\n" ;
							 | 
						|
								      	push @img_labels, $rep ;
							 | 
						|
												push @img_data, $percent ;
							 | 
						|
											} # end of foreach $rep
							 | 
						|
											push @img_labels, "Total" ;
							 | 
						|
											$percent = int ((100.0 * $SUPERCAT_EARNED / $SUPERCAT_TOTAL) +0.5) ;
							 | 
						|
											push @img_data, $percent ;
							 | 
						|
											print "Total Score: $percent\%\<br\>\n" ;
							 | 
						|
										} else {
							 | 
						|
											# $category_count is zero.  No categories.
							 | 
						|
								    	print "\<br\>\n" ;
							 | 
						|
								    	print "\<br\>\<br\>No Likert Scale Questions in the test.\<br\>\n" ;
							 | 
						|
								    	print "\<br\>\n" ;
							 | 
						|
										}
							 | 
						|
								# The list parameters are: labels, values, and values2.
							 | 
						|
										my @values2, $xdim, $ydim, $hbar, $title, $xlabel, $ylabel, $ymax, $ymin, $yticknum ;
							 | 
						|
								# The scalar parameters are: xdim, ydim, hbar, title, xlabel, ylabel, ymax, ymin, yticknum
							 | 
						|
										@values2 = () ;
							 | 
						|
										($xdim, $ydim, $hbar, $title, $xlabel, $ylabel, $ymax, $ymin, $yticknum, $colorscheme) =
							 | 
						|
											(800, 300, 1, "Leadership Acceleration Profile Scores", "Category", "Percent for Category", 100, 0, 10, 1) ;
							 | 
						|
								    ($t_margin, $b_margin, $l_margin, $r_margin) = (0, 0, 0, 30) ;
							 | 
						|
										if ($category_count) {
							 | 
						|
											print 
							 | 
						|
								    		BuildBarGraph(\@img_labels, \@img_data, \@values2, $xdim, $ydim, $hbar, $title, $xlabel, $ylabel, $ymax, $ymin, $yticknum, $colorscheme, $t_margin, $b_margin, $l_margin, $r_margin) ;
							 | 
						|
										}
							 | 
						|
								    print "\<br\>\n" ;
							 | 
						|
								  }   # end of if $last_index
							 | 
						|
								
							 | 
						|
										$testtitle="$FORM{'tstid'} - $TEST{'desc'}";
							 | 
						|
									} else {
							 | 
						|
										$sgrepfor = $FORM{'testdates'};
							 | 
						|
										$sgrepfor =~ tr/_/ /;
							 | 
						|
										@testdates = split(/\,/,$sgrepfor);
							 | 
						|
										&get_test_profile($CLIENT{'clid'}, $testdates[1]);
							 | 
						|
										$testtitle="$xlatphrase[720]";
							 | 
						|
									}
							 | 
						|
									print "</HTML>\n" ;
							 | 
						|
									&log_entry($SESSION{'clid'}, $SESSION{'uid'}, "3", "Exec Report $FORM{'rptno'} completed");
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								################################################################################
							 | 
						|
								#
							 | 
						|
								# Subroutine Name
							 | 
						|
								#   GetTestHeader
							 | 
						|
								#
							 | 
						|
								# Description
							 | 
						|
								#   This subroutine returns the header of the test file
							 | 
						|
								#
							 | 
						|
								# Inputs
							 | 
						|
								#   $clientId -- The id of the client to search through
							 | 
						|
								#
							 | 
						|
								# Outputs
							 | 
						|
								#   None
							 | 
						|
								#
							 | 
						|
								# Returns
							 | 
						|
								#   @testFields -- An array of fields in the header
							 | 
						|
								#
							 | 
						|
								#adt080401###############################################################################
							 | 
						|
								sub GetTestHeader
							 | 
						|
								{
							 | 
						|
									my $clientId = $_[0];
							 | 
						|
									my @testList = &get_data("tests.$clientId");
							 | 
						|
									my $testHdr = $testList[0];
							 | 
						|
									my $testFields;
							 | 
						|
								
							 | 
						|
									chop( $testHdr );
							 | 
						|
									@testFields = split( /&/, $testHdr );
							 | 
						|
									
							 | 
						|
									return @testFields;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								#adt080401###############################################################################
							 | 
						|
								#
							 | 
						|
								# Subroutine Name
							 | 
						|
								#   GetTestsByOwner
							 | 
						|
								#
							 | 
						|
								# Description
							 | 
						|
								#   This subroutine searches through the test definition file of the given
							 | 
						|
								#   client for all the tests that are owned by the given user id or are public
							 | 
						|
								#
							 | 
						|
								# Inputs
							 | 
						|
								#   $clientId -- The id of the client to search through
							 | 
						|
								#   $ownedBy -- The name of the owner of the test to search for
							 | 
						|
								#
							 | 
						|
								# Outputs
							 | 
						|
								#   None
							 | 
						|
								#
							 | 
						|
								# Returns
							 | 
						|
								#   @tests -- An array of tests owned by the given user id
							 | 
						|
								#
							 | 
						|
								################################################################################
							 | 
						|
								sub GetTestsByOwner
							 | 
						|
								{
							 | 
						|
									my $clientId = $_[0];
							 | 
						|
									my $ownedBy = $_[1];
							 | 
						|
									my %currHash;
							 | 
						|
									my @testList = &get_data("tests.$clientId");
							 | 
						|
									my @currField;
							 | 
						|
									my @tests;
							 | 
						|
									my $testHdr = $testList[0];
							 | 
						|
									my $testFields;
							 | 
						|
									my $testCntr;
							 | 
						|
									
							 | 
						|
									@testFields = &GetTestHeader( $clientId );
							 | 
						|
								
							 | 
						|
									for( $testCntr = 1; $testCntr < $#testList; $testCntr++ )
							 | 
						|
									{
							 | 
						|
										#print "<b>$testList[$testCntr]</b><br>\n";
							 | 
						|
										chop( $testList[$testCntr] );
							 | 
						|
										@currField = split( '&', $testList[$testCntr] );
							 | 
						|
										for( 0 .. $#testFields )
							 | 
						|
										{
							 | 
						|
											$currHash{$testFields[$_]} = $currField[$_];
							 | 
						|
										}
							 | 
						|
										
							 | 
						|
										#print "$currHash{'ownedby'} - $ownedBy<p>";
							 | 
						|
										if( ( $currHash{'ownedby'} eq $ownedBy ) || ( $currHash{'ownedby'} eq "" ) )
							 | 
						|
										{
							 | 
						|
											push( @tests, $testList[$testCntr] );
							 | 
						|
											#print "<font color=\"#ff0000\"><b>$testList[$testCntr]</b></font><br>\n";
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									return @tests;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#
							 | 
						|
								# Return:  Count of test result files in $dir matching regex with $clid
							 | 
						|
								#          and $testid, OR -1 if there was an error.
							 | 
						|
								#
							 | 
						|
								sub CountTestFilesByCnd {
							 | 
						|
									my ($dir, $clid, $testid, $cndid) = @_;
							 | 
						|
								
							 | 
						|
									if ( ! defined($dir) ) {
							 | 
						|
										&logger::logerr("Undefined directory for client ID '$clid', testid '$testid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($clid) ) {
							 | 
						|
										&logger::logerr("Undefined client ID for directory '$dir', testid '$testid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($testid) ) {
							 | 
						|
										&logger::logerr("Undefined test ID for directory '$dir', client ID '$clid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									my $tstcount = scalar(get_matching_files($dir, "^$clid".'\.'."$cndid".'\.'."$testid\$"));
							 | 
						|
									return $tstcount;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#
							 | 
						|
								# Return:  Count of test result files in $dir matching regex with $clid
							 | 
						|
								#          and $testid, OR -1 if there was an error.
							 | 
						|
								#
							 | 
						|
								sub CountHistoricTests {
							 | 
						|
									my ($dir, $clid, $testid, $cndid) = @_;
							 | 
						|
								
							 | 
						|
									if ( ! defined($dir) ) {
							 | 
						|
										&logger::logerr("Undefined directory for client ID '$clid', testid '$testid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($clid) ) {
							 | 
						|
										&logger::logerr("Undefined client ID for directory '$dir', testid '$testid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($testid) ) {
							 | 
						|
										&logger::logerr("Undefined test ID for directory '$dir', client ID '$clid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									my $historyfile = join($pathsep,$dir,"$clid.$testid.history");
							 | 
						|
									open (HISTFILE,"<$historyfile") or return 0;
							 | 
						|
									my @histentries = <HISTFILE>;
							 | 
						|
									close HISTFILE;
							 | 
						|
									my $sgrepfor=join('&',"\<\<\>\>$clid","$cndid","$testid","");
							 | 
						|
									my @cndidentries = grep( /$sgrepfor/,@histentries);
							 | 
						|
									my $tstcount = $#cndidentries + 1;
							 | 
						|
									return $tstcount;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#
							 | 
						|
								# Return:  Count of cnd result files in $dir matching regex with $clid
							 | 
						|
								#          and $cndid, OR -1 if there was an error.
							 | 
						|
								#
							 | 
						|
								sub CountCndFiles {
							 | 
						|
									my ($dir, $clid, $cndid) = @_;
							 | 
						|
								
							 | 
						|
									if ( ! defined($dir) ) {
							 | 
						|
										&logger::logerr("Undefined directory for client ID '$clid', cndid '$cndid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($clid) ) {
							 | 
						|
										&logger::logerr("Undefined client ID for directory '$dir', cndid '$cndid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($cndid) ) {
							 | 
						|
										&logger::logerr("Undefined cnd ID for directory '$dir', client ID '$clid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									return scalar(get_matching_files($dir, "^$clid".'\.'."$cndid".'\.\S+$'));
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#
							 | 
						|
								# Return:	Sum of times taken during a test in seconds.
							 | 
						|
								#
							 | 
						|
								sub computeTestTime {
							 | 
						|
									my ($dir, $clid, $testid, $cndid, $tstkey) = @_;
							 | 
						|
								
							 | 
						|
									if ( ! defined($dir) ) {
							 | 
						|
										&logger::logerr("Undefined directory for client ID '$clid', testid '$testid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($clid) ) {
							 | 
						|
										&logger::logerr("Undefined client ID for directory '$dir', testid '$testid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									if ( ! defined($testid) ) {
							 | 
						|
										&logger::logerr("Undefined test ID for directory '$dir', client ID '$clid'");
							 | 
						|
										return -1;
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									my $timefile = join($pathsep,$dir,"$clid.$cndid.$testid.tim");
							 | 
						|
									open (TLOGFILE,"<$timefile") or return 0;
							 | 
						|
									my @tlogentries = <TLOGFILE>;
							 | 
						|
									close TLOGFILE;
							 | 
						|
									my $sgrepfor="^$tstkey\&(1)\.(2)\.(.*)\&$clid\&$cndid\&$testid\&(.*)";
							 | 
						|
									my @cndidentries = grep( /$sgrepfor/,@tlogentries);
							 | 
						|
									@tlogentries = ();
							 | 
						|
									my $iidx;
							 | 
						|
									my @tentrycols;
							 | 
						|
									my $tottime;
							 | 
						|
								
							 | 
						|
									$tottime = 0;
							 | 
						|
									for $iidx (0 .. $#cndidentries) {
							 | 
						|
										@tentrycols = split(/&/,$cndidentries[$iidx]);
							 | 
						|
										$tottime += $tentrycols[7];
							 | 
						|
									}
							 | 
						|
									@tentrycols = ();
							 | 
						|
									return $tottime;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								sub formatTimeFromSeconds {
							 | 
						|
									my ($t, $fmt) = @_;
							 | 
						|
									my $h;
							 | 
						|
									my $m;
							 | 
						|
									my $s;
							 | 
						|
									my $r;
							 | 
						|
									my $j;
							 | 
						|
								
							 | 
						|
									$m = int($t/60);
							 | 
						|
									$s = $t - ($m * 60);
							 | 
						|
									$h = int($m/60);
							 | 
						|
									$m = $m - ($h * 60);
							 | 
						|
									if ($fmt =~ m/h/i) {
							 | 
						|
										$r = "00000$h";
							 | 
						|
										$j=length($r)-2;
							 | 
						|
										$r = substr($r,$j,2);
							 | 
						|
										$fmt =~ s/h/$r/g;
							 | 
						|
									}
							 | 
						|
									if ($fmt =~ m/m/i) {
							 | 
						|
										$r = "00000$m";
							 | 
						|
										$j=length($r)-2;
							 | 
						|
										$r = substr($r,$j,2);
							 | 
						|
										$fmt =~ s/m/$r/g;
							 | 
						|
									}
							 | 
						|
									if ($fmt =~ m/s/i) {
							 | 
						|
										$r = "00000$s";
							 | 
						|
										$j=length($r)-2;
							 | 
						|
										$r = substr($r,$j,2);
							 | 
						|
										$fmt =~ s/s/$r/g;
							 | 
						|
									}
							 | 
						|
									return $fmt;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Normally xdim was 400 and ydim was 100.
							 | 
						|
								
							 | 
						|
								sub BuildBarGraph {
							 | 
						|
								# This subroutine builds the HTML to get an image from an URL.
							 | 
						|
								# The URL is a cgi-bin PERL script, with several parameters.
							 | 
						|
								# The list parameters are: labels, values, and values2.
							 | 
						|
								# The scalar parameters are: xdim, ydim, hbar, title, xlabel, ylabel, ymax, ymin, yticknum, colorscheme, $t_margin, $b_margin, $l_margin, $r_margin
							 | 
						|
								
							 | 
						|
								# The first 3 parameters are references to three lists, which are mandatory.
							 | 
						|
								#   The values2 list may be an empty list. (and ignored.)
							 | 
						|
								# The rest of the parameters are optional, but are order specific.
							 | 
						|
								# Any parameter that is an empty string will be effectively ignored,
							 | 
						|
								# but may be required to fill the list of parameters to a needed parm.
							 | 
						|
								    my @label_names, @value_points, @value2_points ;
							 | 
						|
								    my $labels_ref, $values_ref, $values2_ref ;
							 | 
						|
										my $xdim, $ydim, $hbar, $title, $xlabel, $ylabel, $ymax, $ymin, $yticknum ;
							 | 
						|
										my $colorscheme ;
							 | 
						|
								    my $t_margin, $b_margin, $l_margin, $r_margin ;
							 | 
						|
								    $labels_ref = $_[0] ;
							 | 
						|
								    @label_names = @{$labels_ref} ;
							 | 
						|
								# @label_names is an array of character strings of the names of the bars on the graph.
							 | 
						|
										$values_ref = $_[1] ;
							 | 
						|
										@value_points = @{$values_ref} ;
							 | 
						|
								# @value_points is an array of numeric values for each of the names in the first array.
							 | 
						|
								#    The sizes of the two arrays should be the same.
							 | 
						|
										$values2_ref = $_[2] ;
							 | 
						|
										@value2_points = @{$values2_ref} ;
							 | 
						|
								    shift ; shift ; shift ; # Remove the first 3 parms, to set up the next statement.
							 | 
						|
										($xdim, $ydim, $hbar, $title, $xlabel, $ylabel, $ymax, $ymin, $yticknum, $colorscheme, $t_margin, $b_margin, $l_margin, $r_margin) = @_ ;
							 | 
						|
										my $labels, $values, $values2 ;
							 | 
						|
										# print '<br> label_names ' . "@label_names" . ' <br>' ;
							 | 
						|
										# print '<br> value_points ' . "@value_points" . ' <br>' ;
							 | 
						|
										if ($#label_names != $#value_points) {
							 | 
						|
											print '<br>ERROR BuildBarGraph has different number of labels and data values.<br>' ;
							 | 
						|
										}
							 | 
						|
										$labels = join (":", map {munge($_)} @label_names ) ;
							 | 
						|
										$values = join (":", map {munge($_)} @value_points ) ;
							 | 
						|
										$values2 = join (":", map {munge($_)} @value2_points ) ;
							 | 
						|
								    # my $baseurl = "/cgi-bin/bargraph.pl?labels=$labels&title=Trust%20Level&ylabel=Respondents";
							 | 
						|
								    my $baseurl = "/cgi-bin/bargraph.pl?labels=$labels&values=$values" ;
							 | 
						|
								    if ($xdim or $xdim == 0) { $baseurl .= "&xdim=" . $xdim ; }
							 | 
						|
								    if ($ydim or $ydim == 0) { $baseurl .= "&ydim=" . $ydim ; }
							 | 
						|
								    if ($hbar or $hbar == 0) { $baseurl .= "&hbar=" . $hbar ; }
							 | 
						|
								    if ($title or $title == 0) { $baseurl .= "&title=" . munge( $title) ; }
							 | 
						|
								    if ($xlabel or $xlabel == 0) { $baseurl .= "&xlabel=" . munge( $xlabel) ; }
							 | 
						|
								    if ($ylabel or $ylabel == 0) { $baseurl .= "&ylabel=" . munge( $ylabel) ; }
							 | 
						|
								    if ($ymax or $ymax == 0) { $baseurl .= "&ymax=" . $ymax ; }
							 | 
						|
								    if ($ymin or $ymin == 0) { $baseurl .= "&ymin=" . $ymin ; }
							 | 
						|
								    if ($t_margin or $t_margin == 0) { $baseurl .= "&t_margin=" . $t_margin ; }
							 | 
						|
								    if ($b_margin or $b_margin == 0) { $baseurl .= "&b_margin=" . $b_margin ; }
							 | 
						|
								    if ($l_margin or $l_margin == 0) { $baseurl .= "&l_margin=" . $l_margin ; }
							 | 
						|
								    if ($r_margin or $r_margin == 0) { $baseurl .= "&r_margin=" . $r_margin ; }
							 | 
						|
										if ($colorscheme) { $baseurl .= "&colorscheme=" . $colorscheme ; }
							 | 
						|
								    if ($yticknum or $yticknum == 0) { $baseurl .= "&yticknum=" . $yticknum ; }
							 | 
						|
									  return  "<img src=\"$baseurl&values2=$values2\">";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								############################################################################
							 | 
						|
								#
							 | 
						|
								# Function:  munge( $string )
							 | 
						|
								# Description:  Do the normal munging to replace non-normal chars with %XX.
							 | 
						|
								# Returns:  a modified string with %XX patterns inserted
							 | 
						|
								# Author:  HBI, 2008/09/30
							 | 
						|
								#
							 | 
						|
								# The process is performed on strings that are sent as literal text,
							 | 
						|
								#   as part of an URL to be re-analyzed by a WEB server.  The higher
							 | 
						|
								#   level application must do this once, and only once.  This function
							 | 
						|
								#   assumes that the character string contains only 7 or 8 bit characters.
							 | 
						|
								# This function cannot deal with multi-byte UTF-8 characters.
							 | 
						|
								#
							 | 
						|
								############################################################################
							 | 
						|
								sub munge( $ ) {
							 | 
						|
								  my ($string) = @_;
							 | 
						|
								  $string =~ s/([^a-zA-Z0-9])/join('', '%', uc(unpack("H*",$1)))/eg;
							 | 
						|
								  return $string;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								############################################################################
							 | 
						|
								#
							 | 
						|
								# Function:  unmunge( $string )
							 | 
						|
								# Description:  Inverse operation of munge(), replace %XX with the real ascii.
							 | 
						|
								# Returns:  a modified string with %XX patterns replaced
							 | 
						|
								# Author:  efl, 11/2001
							 | 
						|
								#
							 | 
						|
								############################################################################
							 | 
						|
								sub unmunge( $ ) {
							 | 
						|
								  my ($string) = @_;
							 | 
						|
								  $string =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
							 | 
						|
								  return $string;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 |