#!/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; }