--- loncom/interface/statistics/lonstudentassessment.pm	2004/02/12 16:29:00	1.89
+++ loncom/interface/statistics/lonstudentassessment.pm	2004/02/18 15:43:00	1.91
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstudentassessment.pm,v 1.89 2004/02/12 16:29:00 matthew Exp $
+# $Id: lonstudentassessment.pm,v 1.91 2004/02/18 15:43:00 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -474,6 +474,7 @@ my @OutputDataOptions =
        sequence_max => 1,
        grand_total => 1,
        summary_table => 1,
+       maximum_row => 1,
        shortdesc => 'Total Score and Maximum Possible for each '.
            'Sequence or Folder',
        longdesc => 'The score of each student as well as the '.
@@ -490,6 +491,7 @@ my @OutputDataOptions =
        sequence_max => 1,
        grand_total => 1,
        summary_table => 1,
+       maximum_row => 1,
        shortdesc => 'Score on each Problem Part',
        longdesc =>'The students score on each problem part, computed as'.
            'the part weight * part awarded',
@@ -504,7 +506,8 @@ my @OutputDataOptions =
        sequence_sum => 0,
        sequence_max => 0,
        grand_total => 0,
-       summary_table => 1,
+       summary_table => 0,
+       maximum_row => 0,
        shortdesc => 'Number of Tries before success on each Problem Part',
        longdesc =>'The number of tries before success on each problem part.',
        },
@@ -519,6 +522,7 @@ my @OutputDataOptions =
        sequence_max => 1,
        grand_total => 1,
        summary_table => 1,
+       maximum_row => 0,
        shortdesc => 'Number of Problem Parts completed successfully.',
        longdesc => 'The Number of Problem Parts completed successfully and '.
            'the maximum possible for each student',
@@ -757,10 +761,12 @@ sub html_finish {
     #
     # Check for suppressed output and close the progress window if so
     $r->print("</pre>\n"); 
-    if ($single_student_mode) {
-        $r->print(&SingleStudentTotal());
-    } else {
-        $r->print(&StudentAverageTotal());
+    if ($chosen_output->{'summary_table'}) {
+        if ($single_student_mode) {
+            $r->print(&SingleStudentTotal());
+        } else {
+            $r->print(&StudentAverageTotal());
+        }
     }
     $r->rflush();
     return;
@@ -873,7 +879,8 @@ sub excel_initialize {
     undef ($total_formula);
     #
     my $total_columns = scalar(&get_student_fields_to_show());
-    
+    my $num_students = scalar(@Apache::lonstatistics::Students);
+    #
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         if ($chosen_output->{'every_problem'}) {
             $total_columns += $seq->{'num_assess_parts'};
@@ -927,6 +934,24 @@ END
     $rows_output = 0;
     $cols_output = 0;
     #
+    # Determine rows 
+    my $header_row = $rows_output++;
+    my $description_row = $rows_output++;
+    $rows_output++;        # blank row
+    my $summary_header_row;
+    if ($chosen_output->{'summary_table'}) {
+        $summary_header_row = $rows_output++;
+        $rows_output+= scalar(&Apache::lonstatistics::Sequences_with_Assess());
+        $rows_output++;
+    }
+    my $sequence_name_row = $rows_output++;
+    my $resource_name_row = $rows_output++;
+    my $maximum_data_row = $rows_output++;
+    if (! $chosen_output->{'maximum_row'}) {
+        $rows_output--;
+    }
+    my $first_data_row = $rows_output++;
+    #
     # Create sheet
     $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
     #
@@ -945,25 +970,15 @@ END
     # File::Temp is used to determine the temporary directory.
     $excel_workbook->set_tempdir($Apache::lonnet::tmpdir);
     #
+    my $format = &Apache::loncommon::define_excel_formats($excel_workbook);
+    #
     # Add a worksheet
     my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
     $sheetname = &Apache::loncommon::clean_excel_name($sheetname);
     $excel_sheet = $excel_workbook->addworksheet($sheetname);
     #
-    # Define some potentially useful formats
-    my $format;
-    $format->{'header'} = $excel_workbook->add_format(bold      => 1, 
-                                                      bottom    => 1,
-                                                      align     => 'center');
-    $format->{'bold'} = $excel_workbook->add_format(bold=>1);
-    $format->{'h1'}   = $excel_workbook->add_format(bold=>1, size=>18);
-    $format->{'h2'}   = $excel_workbook->add_format(bold=>1, size=>16);
-    $format->{'h3'}   = $excel_workbook->add_format(bold=>1, size=>14);
-    $format->{'date'} = $excel_workbook->add_format(num_format=>
-                                                    'mmm d yyyy hh:mm AM/PM');
-    #
     # Put the course description in the header
-    $excel_sheet->write($rows_output,$cols_output++,
+    $excel_sheet->write($header_row,$cols_output++,
                    $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
                         $format->{'h1'});
     $cols_output += 3;
@@ -985,24 +1000,21 @@ END
             $sectionstring = "Section ".$Sections[0];
         }
     }
-    $excel_sheet->write($rows_output,$cols_output++,$sectionstring,
+    $excel_sheet->write($header_row,$cols_output++,$sectionstring,
                         $format->{'h3'});
     $cols_output += scalar(@Sections);
     #
     # Put the date in there too
-    $excel_sheet->write($rows_output++,$cols_output++,
+    $excel_sheet->write($header_row,$cols_output++,
                         'Compiled on '.localtime(time),$format->{'h3'});
     #
     $cols_output = 0;
-    $excel_sheet->write($rows_output++,$cols_output++,
+    $excel_sheet->write($description_row,$cols_output++,
                         $chosen_output->{'shortdesc'},
                         $format->{'h3'});
-    #
-    # Figure out the rows we need
-    my $sequence_name_row = $rows_output+1;
-    my $resource_name_row = $sequence_name_row+1;
-    my $maximum_data_row = $sequence_name_row+2;
-    my $first_data_row = $sequence_name_row+3;
+    ##############################################
+    # Output headings for the raw data
+    ##############################################
     #
     # Add the student headers
     $cols_output = 0;
@@ -1015,11 +1027,11 @@ END
     my $total_formula_string = '=0';
     foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
         $excel_sheet->write($sequence_name_row,,
-                            $cols_output,$seq->{'title'},$format->{'h3'});
+                            $cols_output,$seq->{'title'},$format->{'bold'});
         # Determine starting cell
         $seq->{'Excel:startcell'}=
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
-            ($maximum_data_row,$cols_output);
+            ($first_data_row,$cols_output);
         $seq->{'Excel:startcol'}=$cols_output;
         my $count = 0;
         if ($chosen_output->{'every_problem'}) {
@@ -1053,7 +1065,7 @@ END
         } else {
             $seq->{'Excel:endcell'} = 
                 &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
-                ($maximum_data_row,$cols_output-1);
+                ($first_data_row,$cols_output-1);
             $seq->{'Excel:endcol'} = $cols_output-1;
         }
         # Create the formula for summing up this sequence
@@ -1067,7 +1079,7 @@ END
         # Determine cell the score is held in
         $seq->{'Excel:scorecell'} = 
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
-            ($maximum_data_row,$cols_output);
+            ($first_data_row,$cols_output);
         $seq->{'Excel:scorecol'}=$cols_output;
         if ($chosen_output->{'base'} eq 'parts correct total') {
             $excel_sheet->write($resource_name_row,$cols_output++,
@@ -1088,7 +1100,7 @@ END
         #
         $total_formula_string.='+'.
             &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
-            ($maximum_data_row,$cols_output-1);
+            ($first_data_row,$cols_output-1);
         if ($chosen_output->{'sequence_max'}) {
             $excel_sheet->write($resource_name_row,$cols_output++,
                                 'maximum',
@@ -1100,9 +1112,10 @@ END
                             $format->{'bold'});
     }
     $total_formula = $excel_sheet->store_formula($total_formula_string);
-    #
+    ##############################################
     # Output a row for MAX, if appropriate
-    if ($chosen_output->{'scores'}) {
+    ##############################################
+    if ($chosen_output->{'maximum_row'}) {
         $cols_output = 0;
         foreach my $field (&get_student_fields_to_show()) {
             if ($field eq 'username' || $field eq 'fullname' || 
@@ -1169,8 +1182,57 @@ END
                                          $total_formula,undef,
                                          %total_cell_translation);
         }
-    } # End of MAXIMUM row output  if ($chosen_output->{'scores'}) {
+    } # End of MAXIMUM row output  if ($chosen_output->{'maximum_row'}) {
     $rows_output = $first_data_row;
+    ##############################################
+    # Output summary table, which actually is above the sequence name row.
+    ##############################################
+    if ($chosen_output->{'summary_table'}) {
+        $cols_output = 0;
+        $excel_sheet->write($summary_header_row,$cols_output++,
+                            'Summary Table',$format->{'bold'});
+        if ($chosen_output->{'maximum_row'}) {
+            $excel_sheet->write($summary_header_row,$cols_output++,
+                                'Maximum',$format->{'bold'});
+        }
+        $excel_sheet->write($summary_header_row,$cols_output++,
+                            'Average',$format->{'bold'});
+        $excel_sheet->write($summary_header_row,$cols_output++,
+                            'Median',$format->{'bold'});
+        $excel_sheet->write($summary_header_row,$cols_output++,
+                            'Std Dev',$format->{'bold'});
+        my $row = $summary_header_row+1;
+        foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) {
+            $cols_output = 0;
+            $excel_sheet->write($row,$cols_output++,
+                                $seq->{'title'},
+                                $format->{'bold'});
+            if ($chosen_output->{'maximum_row'}) {
+                $excel_sheet->write
+                    ($row,$cols_output++,
+                     '='.
+                     &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+                     ($maximum_data_row,$seq->{'Excel:scorecol'})
+                     );
+            }
+            my $range = 
+                &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+                ($first_data_row,$seq->{'Excel:scorecol'}).
+                ':'.
+                &Spreadsheet::WriteExcel::Utility::xl_rowcol_to_cell
+                ($first_data_row+$num_students-1,$seq->{'Excel:scorecol'});
+            $excel_sheet->write($row,$cols_output++,
+                                '=AVERAGE('.$range.')');
+            $excel_sheet->write($row,$cols_output++,
+                                '=MEDIAN('.$range.')');
+            $excel_sheet->write($row,$cols_output++,
+                                '=STDEV('.$range.')');
+            $row++;
+        }
+    }
+    ##############################################
+    #   Take care of non-excel initialization
+    ##############################################
     #
     # Let the user know what we are doing
     my $studentcount = scalar(@Apache::lonstatistics::Students);