--- loncom/interface/statistics/lonproblemstatistics.pm	2008/09/11 14:47:22	1.113
+++ loncom/interface/statistics/lonproblemstatistics.pm	2011/01/17 00:19:41	1.119
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemstatistics.pm,v 1.113 2008/09/11 14:47:22 bisitz Exp $
+# $Id: lonproblemstatistics.pm,v 1.119 2011/01/17 00:19:41 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -52,6 +52,7 @@ package Apache::lonproblemstatistics;
 use strict;
 use Apache::lonnet;
 use Apache::loncommon();
+use Apache::lonquickgrades();
 use Apache::lonhtmlcommon;
 use Apache::loncoursedata;
 use Apache::lonstatistics;
@@ -123,11 +124,11 @@ my @Fields = (
              align  => 'left',
              color  => '#FFFFE6',
              special  => 'link',
-             sortable => 'yes', 
+             sortable => 'yes',
              selectable => 'no',
              defaultselected => 'yes',
            },
-           { name   => 'part', 
+           { name   => 'part',
              title  => 'Part',
              align  => 'left',
              color  => '#FFFFE6',
@@ -375,7 +376,7 @@ my @SeqFields = (
              align  => 'left',
              color  => '#FFFFE6',
              special  => 'no',
-             sortable => 'no', 
+             sortable => 'no',
              selectable => 'yes',
              defaultselected => 'no',
            },
@@ -510,7 +511,7 @@ my @SeqFields = (
              long_title => 'KR-21 reliability statistic',
              selectable => 'yes',
              defaultselected => 'no',
-           },           
+           },
 );
 
 my %SelectedFields;
@@ -577,7 +578,7 @@ sub parse_field_selection {
 }
 
 sub field_selection_input {
-    my $Str = '<select name="fieldselections" multiple size="5">'."\n";
+    my $Str = '<select name="fieldselections" multiple="multiple" size="5">'."\n";
     $Str .= '<option value="all">all</option>'."\n";
     foreach my $field (@Fields) {
         next if ($field->{'selectable'} ne 'yes');
@@ -610,42 +611,49 @@ sub CreateInterface {
     &parse_field_selection();
     #
     my $Str = '';
-    $Str .= &Apache::lonhtmlcommon::breadcrumbs('Overall Problem Statistics',
-						'Statistics_Overall_Key');
-    $Str .= '<table cellspacing="5">'."\n";
-    $Str .= '<tr>';
-    $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';
-    $Str .= '<td align="center"><b>'.&mt('Groups').'</b></td>';
-    $Str .= '<td align="center"><b>'.&mt('Access Status').'</b></td>';
-    $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';
-    $Str .= '<td align="center"><b>'.&mt('Statistics').'</b></td>';
-    $Str .= '<td rowspan="2">'.
-        &Apache::lonstathelpers::limit_by_time_form().'</td>';
-    $Str .= '</tr>'."\n";
+    $Str .= '<p>';
+    $Str .= &Apache::loncommon::start_data_table();
+    $Str .= &Apache::loncommon::start_data_table_header_row();
+    $Str .= '<th>'.&mt('Sections').'</th>';
+    $Str .= '<th>'.&mt('Groups').'</th>';
+    $Str .= '<th>'.&mt('Access Status').'</th>';
+    $Str .= '<th>'.&mt('Sequences and Folders').'</th>';
+    $Str .= '<th>'.&mt('Statistics').'</th>';
+    $Str .= '<th>'.&mt('Plot Graph').'</th>';
+    $Str .= '<th>'.&mt('Time Period').'</th>';
+    $Str .= &Apache::loncommon::end_data_table_header_row();
     #
-    $Str .= '<tr><td align="center">'."\n";
+    $Str .= &Apache::loncommon::start_data_table_row();
+    $Str .= '<td align="center" valign="top">'."\n";
     $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
-    $Str .= '</td><td align="center">';
+    $Str .= '</td><td align="center" valign="top">';
     $Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5);
-    $Str .= '</td><td align="center">';
+    $Str .= '</td><td align="center" valign="top">';
     $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
-    $Str .= '</td><td align="center">';
+    $Str .= '</td><td align="center" valign="top">';
     #
     $Str .= &Apache::lonstatistics::map_select('Maps','multiple,all',5);
-    $Str .= '</td><td>'.&field_selection_input();
-    $Str .= '</td></tr>'."\n";
-    $Str .= '</table>'."\n";
-    #
-    $Str .= '<p>'.&mt('Status: [_1]',
-                         '<input type="text" '.
-                         'name="stats_status" size="60" value="" />'
-                         ).
-                         '</nobr></p>';
+    $Str .= '</td><td align="center" valign="top">';
+    $Str .= &field_selection_input();
+    $Str .= '</td><td align="center" valign="top">';
+    $Str .= &plot_dropdown();
+    $Str .= '</td>'."\n";
+    $Str .= '</td><td align="center" valign="top">';
+    $Str .= &Apache::lonstathelpers::limit_by_time_form();
+    $Str .= '</td>'."\n";
+    $Str .=  &Apache::loncommon::end_data_table_row();
+    $Str .= &Apache::loncommon::end_data_table();
+    #
+    $Str .= '<p><span class="LC_nobreak">'
+           .&mt('Status: [_1]',
+                    '<input type="text" name="stats_status"'
+                   .' size="60" value="" readonly="readonly" />')
+           .'</span></p>';
     #
+    $Str .= '</p>';
     $Str .= '<input type="submit" name="GenerateStatistics" value="'.
         &mt('Generate Statistics').'" />';
-    $Str .= '&nbsp;'x5;
-    $Str .= 'Plot '.&plot_dropdown().('&nbsp;'x10);
+    $Str .= ('&nbsp;'x10);
     #
     return $Str;
 }
@@ -695,12 +703,16 @@ sub BuildProblemStatisticsPage {
     undef(%SeqStat);
     #
     # Finally let the user know we are here
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Overall Problem Statistics',
+                                                'Statistics_Overall_Key'));
+    &Apache::lonquickgrades::startGradeScreen($r,'statistics');
+
     my $interface = &CreateInterface($r);
     $r->print($interface);
     $r->print('<input type="hidden" name="sortby" value="'.$env{'form.sortby'}.
               '" />');
     #
-    my @CacheButtonHTML = 
+    my @CacheButtonHTML =
         &Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status');
     my $Str;
     foreach my $html (@CacheButtonHTML) {
@@ -709,11 +721,12 @@ sub BuildProblemStatisticsPage {
     #
     $r->print($Str);
     if (! exists($env{'form.firstrun'})) {
-        $r->print('<h3>'.
+        $r->print('<p class="LC_info"><b>'.
                   &mt('Press "Generate Statistics" when you are ready.').
-                  '</h3><p>'.
+                  '</b></p>'.
+                  '<p class="LC_info">'.
                   &mt('It may take some time to update the student data '.
-                      'for the first analysis.  Future analysis this session '.
+                      'for the first analysis. Future analysis this session '.
                       'will not have this delay.').
                   '</p>');
 	&clean_up();
@@ -725,10 +738,10 @@ sub BuildProblemStatisticsPage {
     # it does not slow things down noticably.
     &Apache::loncoursedata::populate_weight_table();
     #
-    ($navmap,@sequences) = 
+    ($navmap,@sequences) =
         &Apache::lonstatistics::selected_sequences_with_assessments();
     if (! ref($navmap)) {
-        $r->print('<h1>'.&mt('A course-wide error occurred.').'</h1>'.
+        $r->print('<div class="LC_error">'.&mt('A course-wide error occurred.').'</div>'.
                   '<h3>'.$navmap.'</h3>');
 	&clean_up();
         return;
@@ -738,7 +751,7 @@ sub BuildProblemStatisticsPage {
                   &Apache::lonstatistics::section_and_enrollment_description().
                   '</h4>');
         &Excel_output($r);
-    } else { 
+    } else {
         $r->print('<input type="submit" name="Excel" value="'.
                   &mt('Produce Excel Output').'" />'.'&nbsp;'x5);
         $r->rflush();
@@ -747,7 +760,7 @@ sub BuildProblemStatisticsPage {
                   '</h4>');
         my $count = 0;
         foreach my $seq (@sequences) {
-            my @resources = 
+            my @resources =
                 &Apache::lonstathelpers::get_resources($navmap,$seq);
             $count += scalar(@resources);
         }
@@ -792,7 +805,7 @@ sub output_sequence_statistics {
               '<table border="0" cellpadding="3">'."\n".
               '<tr bgcolor="#FFFFE6">');
     $r->print(&sequence_html_header());
-    foreach my $seq (@sequences) { 
+    foreach my $seq (@sequences) {
         last if ($c->aborted);
         &compute_sequence_statistics($seq);
         $r->print(&sequence_html_output($seq));
@@ -1015,7 +1028,7 @@ sub make_single_stat_plot {
     }
     #
     # Build up the data sets to plot
-    my @Labels; 
+    my @Labels;
     my @Data;
     my $max = 1;
     foreach my $data (@StatsArray) {
@@ -1055,7 +1068,7 @@ sub degrees_plot {
     my $plot = '';
     my $ymax = 0;
     my $ymin = 0;
-    my @Disc; my @Diff; my @Labels;    
+    my @Disc; my @Diff; my @Labels;
     foreach my $data (@StatsArray) {
         push(@Labels,$data->{'problem_num'});
         my $disc = $data->{'deg_of_disc'};
@@ -1145,7 +1158,7 @@ sub degrees_plot {
     </curve>
 </gnuplot>
 END
-    my $plotresult = 
+    my $plotresult =
         '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;
     $r->print($plotresult);
     return;
@@ -1230,7 +1243,7 @@ sub tries_data_plot {
     </curve>
 </gnuplot>
 END
-    my $plotresult = 
+    my $plotresult =
         '<p>'.&Apache::lonxml::xmlparse($r,'web',$plot).'</p>'.$/;
     $r->print($plotresult);
     return;
@@ -1341,11 +1354,11 @@ sub Excel_output {
     $excel_sheet->write($rows_output,$cols_output++,
                         'Compiled on '.localtime(time));
     #
-    $rows_output++; 
+    $rows_output++;
     $cols_output=0;
     ##
     ## Sequence Statistics
-    ## 
+    ##
     &write_headers($excel_sheet,$format,\$rows_output,\$cols_output,
                    \@SeqFields);
     foreach my $seq (@sequences) {
@@ -1423,7 +1436,7 @@ sub write_headers {
     foreach my $field (@{$Fields}) {
         next if ($field->{'selected'} ne 'yes');
         next if ($field->{'name'} eq 'problem_num');
-        # Use english for excel as I am not sure how well excel handles 
+        # Use english for excel as I am not sure how well excel handles
         # other character sets....
         $excel_sheet->write($$rows_output,$$cols_output,
                             $field->{'title'},
@@ -1447,7 +1460,7 @@ sub compute_statistics_on_sequence {
     my @Data;
     foreach my $res (&Apache::lonstathelpers::get_resources($navmap,$seq)) {
         foreach my $part (@{$res->parts}) {
-            next if ($res->is_survey($part));
+            next if (($res->is_survey($part)) || ($res->is_anonsurvey($part))) ;
             #
             # This is where all the work happens
             my $data = &get_statistics($seq,$res,$part,scalar(@StatsArray)+1);
@@ -1536,13 +1549,13 @@ sub sort_data {
 
 =item &get_statistics()
 
-Wrapper routine from the call to loncoursedata::get_problem_statistics.  
+Wrapper routine from the call to loncoursedata::get_problem_statistics.
 Calls lonstathelpers::get_time_limits() to limit the data set by time
 and &compute_discrimination_factor
 
 Inputs: $sequence, $resource, $part, $problem_num
 
-Returns: Hash reference with statistics data from 
+Returns: Hash reference with statistics data from
 loncoursedata::get_problem_statistics.
 
 =cut
@@ -1570,7 +1583,7 @@ sub get_statistics {
         &escape($resource->symb);
     #
     if ($SelectedFields{'deg_of_disc'}) {
-        $data->{'deg_of_disc'} = 
+        $data->{'deg_of_disc'} =
             &compute_discrimination_factor($resource,$part,$sequence);
     }
     #
@@ -1583,9 +1596,9 @@ sub get_statistics {
         $data->{'course'} = $env{'request.course.id'};
         my $urlres=(&Apache::lonnet::decode_symb($resource->symb))[2];
         $data->{'urlres'}=$urlres;
-        my %storestats = 
+        my %storestats =
             &LONCAPA::lonmetadata::dynamic_metadata_storage($data);
-        my ($dom,$user) = ($urlres=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)}); 
+        my ($dom,$user) = ($urlres=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)});
         &Apache::lonnet::put('nohist_resevaldata',\%storestats,$dom,$user);
     }
     #
@@ -1599,7 +1612,7 @@ sub get_statistics {
 #    my $hinttries = &Apache::lonnet::EXT('resource.'.$part.'.hinttries',$symb);
     my $weight = &Apache::lonnet::EXT('resource.'.$part.'.weight',$symb);
     $data->{'weight'} = $weight;
-#    $data->{'duedate'} = $duedate; 
+#    $data->{'duedate'} = $duedate;
 #    $data->{'opendate'} = $opendate;
 #    $data->{'maxtries'} = $maxtries;
 #    $data->{'hinttries'} = $hinttries;
@@ -1633,7 +1646,7 @@ sub compute_discrimination_factor {
     #
     # rank
     my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
-    my $ranking = 
+    my $ranking =
         &Apache::loncoursedata::rank_students_by_scores_on_resources
         (\@Resources,
          [&Apache::lonstatistics::get_selected_sections()],
@@ -1644,20 +1657,20 @@ sub compute_discrimination_factor {
     # compute their percent scores on the problems in the sequence,
     my $number_to_grab = int(scalar(@{$ranking})/4);
     my $num_students = scalar(@{$ranking});
-    my @BottomSet = map { $_->[&Apache::loncoursedata::RNK_student()]; 
+    my @BottomSet = map { $_->[&Apache::loncoursedata::RNK_student()];
                       } @{$ranking}[0..$number_to_grab];
-    my @TopSet    = 
-        map { 
-            $_->[&Apache::loncoursedata::RNK_student()]; 
+    my @TopSet    =
+        map {
+            $_->[&Apache::loncoursedata::RNK_student()];
           } @{$ranking}[-$number_to_grab..0];
     if (! @BottomSet || (@BottomSet == 1 && $BottomSet[0] eq '') ||
         ! @TopSet    || (@TopSet    == 1 && $TopSet[0]    eq '')) {
         return 'nan';
     }
-    my ($bottom_sum,$bottom_max) = 
+    my ($bottom_sum,$bottom_max) =
         &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@BottomSet,
                                                   undef,$starttime,$endtime);
-    my ($top_sum,$top_max) = 
+    my ($top_sum,$top_max) =
         &Apache::loncoursedata::get_sum_of_scores($symb,$part,\@TopSet,
                                                   undef,$starttime,$endtime);
     my $deg_of_disc;
@@ -1680,10 +1693,10 @@ sub compute_discrimination_factor {
 ##
 ## K=the number of items in your test
 ## M=the mean score on the test
-## s=the standard deviation of the scores on your test 
+## s=the standard deviation of the scores on your test
 ##
 ## then:
-## 
+##
 ## KR-21 rk= [K/(K-1)] * [1- (M*(K-M))/(K*s^2))]
 ##
 ###############################################
@@ -1700,7 +1713,7 @@ sub compute_sequence_statistics {
     my ($starttime,$endtime) = &Apache::lonstathelpers::get_time_limits();
     #
     # First compute statistics based on student scores
-    my ($smin,$smax,$sMean,$sSTD,$scount,$sMAX) = 
+    my ($smin,$smax,$sMean,$sSTD,$scount,$sMAX) =
         &Apache::loncoursedata::score_stats
                     ([&Apache::lonstatistics::get_selected_sections()],
                      [&Apache::lonstatistics::get_selected_groups()],
@@ -1715,7 +1728,7 @@ sub compute_sequence_statistics {
     $SeqStat{$symb}->{'max_possible'} = $sMAX;
     #
     # Compute statistics based on the number of correct problems
-    # 'correct' is taken to mean 
+    # 'correct' is taken to mean
     my ($cmin,$cmax,$cMean,$cSTD,$ccount)=
         &Apache::loncoursedata::count_stats
         ([&Apache::lonstatistics::get_selected_sections()],