--- loncom/interface/statistics/lonproblemstatistics.pm	2003/07/28 15:30:46	1.55
+++ loncom/interface/statistics/lonproblemstatistics.pm	2003/12/08 19:37:44	1.62
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemstatistics.pm,v 1.55 2003/07/28 15:30:46 matthew Exp $
+# $Id: lonproblemstatistics.pm,v 1.62 2003/12/08 19:37:44 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -51,11 +51,20 @@ package Apache::lonproblemstatistics;
 
 use strict;
 use Apache::lonnet();
+use Apache::loncommon();
 use Apache::lonhtmlcommon;
 use Apache::loncoursedata;
 use Apache::lonstatistics;
+use Apache::lonlocal;
 use Spreadsheet::WriteExcel;
 
+##
+## Localization notes:
+##
+## in @Fields[0]->{'long_title'} is placed in Excel files and is used as the
+## header for plots created with Graph.pm, both of which more than likely do
+## not support localization.
+##
 my @Fields = (
            { name => 'problem_num',
              title => 'P#',
@@ -174,64 +183,6 @@ select sections, maps, and output.
 
 ###############################################
 ###############################################
-sub CreateInterface {
-    my $Str = '';
-    $Str .= '<table cellspacing="5">'."\n";
-    $Str .= '<tr>';
-    $Str .= '<td align="center"><b>Sections</b></td>';
-    $Str .= '<td align="center"><b>Enrollment Status</b></td>';
-    $Str .= '<td align="center"><b>Sequences and Folders</b></td>';
-    $Str .= '<td align="center"><b>Output</b></td>';
-    $Str .= '</tr>'."\n";
-    #
-    $Str .= '<tr><td align="center">'."\n";
-    $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
-    $Str .= '</td><td align="center">';
-    $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
-    $Str .= '</td><td align="center">';
-    #
-    my $only_seq_with_assessments = sub { 
-        my $s=shift;
-        if ($s->{'num_assess'} < 1) { 
-            return 0;
-        } else { 
-            return 1;
-        }
-    };
-    $Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5,
-                                              $only_seq_with_assessments);
-    $Str .= '</td><td>'."\n";
-    $Str .= &CreateAndParseOutputSelector();
-    $Str .= '</td></tr>'."\n";
-    $Str .= '</table>'."\n";
-    $Str .= '<input type="submit" value="Generate Statistics" />';
-    $Str .= '&nbsp;'x5;
-    $Str .= '<input type="submit" name="ClearCache" value="Clear Caches" />';
-    $Str .= '&nbsp;'x5;
-    return $Str;
-}
-
-#######################################################
-#######################################################
-
-=pod
-
-=item &CreateAndParseOutputSelector()
-
-Construct a selection list of options for output and parse output selections.
-The current output selected is indicated by the values of the two package
-variables $output_mode and $show.  @OutputOptions holds the descriptions of
-the output options and the values for $output_mode and $show.
-
-Based on code from lonstudentassessment.pm.
-
-=cut
-
-#######################################################
-#######################################################
-my $output_mode;
-my $show;
-
 my @OutputOptions = 
     (
      { name  => 'problem statistics grouped by sequence',
@@ -255,92 +206,48 @@ my @OutputOptions =
      },
      );
 
-sub OutputDescriptions {
-    my $Str = '';
-    $Str .= "<h2>Output Modes</h2>\n";
-    $Str .= "<dl>\n";
-    foreach my $outputmode (@OutputOptions) {
-	$Str .="    <dt>".$outputmode->{'name'}."</dt>\n";
-	$Str .="        <dd>".$outputmode->{'description'}."</dd>\n";
-    }
-    $Str .= "</dl>\n";
-    return $Str;
-}
-
-sub CreateAndParseOutputSelector {
+sub CreateInterface {
     my $Str = '';
-    my $elementname = 'statsoutputmode';
-    #
-    # Format for output options is 'mode, restrictions';
-    my $selected = 'HTML problem statistics grouped';
-    if (exists($ENV{'form.'.$elementname})) {
-        if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {
-            $selected = $ENV{'form.'.$elementname}->[0];
-        } else {
-            $selected = $ENV{'form.'.$elementname};
-        }
-    }
+    $Str .= '<table cellspacing="5">'."\n";
+    $Str .= '<tr>';
+    $Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>';
+    $Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>';
+    $Str .= '<td align="center"><b>'.&mt('Sequences and Folders').'</b></td>';
+    $Str .= '<td align="center"><b>'.&mt('Output').'</b></td>';
+    $Str .= '</tr>'."\n";
     #
-    # Set package variables describing output mode
-    $output_mode = 'html';
-    $show        = 'all';
-    foreach my $option (@OutputOptions) {
-        next if ($option->{'value'} ne $selected);
-        $output_mode = $option->{'mode'};
-        $show        = $option->{'show'};
-    }
+    $Str .= '<tr><td align="center">'."\n";
+    $Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5);
+    $Str .= '</td><td align="center">';
+    $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5);
+    $Str .= '</td><td align="center">';
     #
-    # Build the form element
-    $Str = qq/<select size="5" name="$elementname">/;
-    foreach my $option (@OutputOptions) {
-        if (exists($option->{'special'}) && 
-            $option->{'special'} =~ /do not show/) {
-            next;
+    my $only_seq_with_assessments = sub { 
+        my $s=shift;
+        if ($s->{'num_assess'} < 1) { 
+            return 0;
+        } else { 
+            return 1;
         }
-        $Str .= "\n".'    <option value="'.$option->{'value'}.'"';
-        $Str .= " selected " if ($option->{'value'} eq $selected);
-        $Str .= ">".$option->{'name'}."<\/option>";
-    }
-    $Str .= "\n</select>";
-    return $Str;
-}
-
-###############################################
-###############################################
-
-=pod 
-
-=item &Gather_Student_Data()
-
-Ensures all student data is up to date.
-
-=cut
-
-###############################################
-###############################################
-sub Gather_Student_Data {
-    my ($r) = @_;
-    my $c = $r->connection();
-    #
-    my @Sequences = &Apache::lonstatistics::Sequences_with_Assess();
-    #
-    my @Students = @Apache::lonstatistics::Students;
-    #
-    # Open the progress window
-    my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
-        ($r,'Statistics Compilation Status',
-         'Statistics Compilation Progress', scalar(@Students));
-    #
-    while (my $student = shift @Students) {
-        return if ($c->aborted());
-        my ($status,undef) = &Apache::loncoursedata::ensure_current_data
-            ($student->{'username'},$student->{'domain'},
-             $ENV{'request.course.id'});
-        &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
-                                                 'last student');
-    }
-    &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
-    $r->rflush();
+    };
+    $Str .= &Apache::lonstatistics::MapSelect('Maps','multiple,all',5,
+                                              $only_seq_with_assessments);
+    $Str .= '</td><td>'."\n";
+    my ($html,$outputmode,$show) = 
+        &Apache::lonstatistics::CreateAndParseOutputSelector(
+                                            'statsoutputmode',
+                                            'HTML problem statistics grouped',
+                                            @OutputOptions);
+    $Str .= $html;
+    $Str .= '</td></tr>'."\n";
+    $Str .= '</table>'."\n";
+    $Str .= '<input type="submit" name="GenerateStatistics" value="'.
+        &mt('Generate Statistics').'" />';
+    $Str .= '&nbsp;'x5;
+    $Str .= '<input type="submit" name="ClearCache" value="'.
+        &mt('Clear Caches').'" />';
+    $Str .= '&nbsp;'x5;
+    return ($Str,$outputmode,$show);
 }
 
 ###############################################
@@ -359,10 +266,20 @@ Main interface to problem statistics.
 sub BuildProblemStatisticsPage {
     my ($r,$c)=@_;
     #
-    $output_mode = 'html';
-    $show = 'grouped';
+    my %Saveable_Parameters = ('Status' => 'scalar',
+                               'statsoutputmode' => 'scalar',
+                               'Section' => 'array',
+                               'StudentData' => 'array',
+                               'Maps' => 'array');
+    &Apache::loncommon::store_course_settings('statistics',
+                                              \%Saveable_Parameters);
+    &Apache::loncommon::restore_course_settings('statistics',
+                                                \%Saveable_Parameters);
+    #
+    &Apache::lonstatistics::PrepareClasslist();
     #
-    $r->print(&CreateInterface());
+    my ($interface,$output_mode,$show) = &CreateInterface();
+    $r->print($interface);
     $r->print('<input type="hidden" name="statsfirstcall" value="no" />');
     $r->print('<input type="hidden" name="sortby" value="'.$ENV{'form.sortby'}.
               '" />');
@@ -371,7 +288,7 @@ sub BuildProblemStatisticsPage {
         return;
     }
     #
-    &Gather_Student_Data($r);
+    &Apache::lonstatistics::Gather_Student_Data($r);
     #
     #
     if ($output_mode eq 'html') {
@@ -386,10 +303,10 @@ sub BuildProblemStatisticsPage {
             &output_html_ungrouped($r);
         }
     } elsif ($output_mode eq 'excel') {
-        $r->print("<h2>Preparing Excel Spreadsheet</h2>");
+        $r->print('<h2>'.&mt('Preparing Excel Spreadsheet').'</h2>');
         &output_excel($r);
     } else {
-        $r->print("<h1>Not implemented</h1>");
+        $r->print('<h1>'.&mt('Not implemented').'</h1>');
     }
     return;
 }
@@ -596,9 +513,9 @@ sub output_excel {
     # Check for errors
     if (! defined($excel_workbook)) {
         $r->log_error("Error creating excel spreadsheet $filename: $!");
-        $r->print("Problems creating new Excel file.  ".
+        $r->print(&mt("Problems creating new Excel file.  ".
                   "This error has been logged.  ".
-                  "Please alert your LON-CAPA administrator");
+                  "Please alert your LON-CAPA administrator."));
         return ;
     }
     #
@@ -613,7 +530,9 @@ sub output_excel {
     if (length($sheetname) > 31) {
         $sheetname = substr($sheetname,0,31);
     }
-    $excel_sheet = $excel_workbook->addworksheet($sheetname);
+    $excel_sheet = $excel_workbook->addworksheet(
+                       &Apache::loncommon::clean_excel_name($sheetname)
+                                                 );
     #
     # Put the course description in the header
     $excel_sheet->write($rows_output,$cols_output++,
@@ -662,6 +581,8 @@ sub output_excel {
     # Brief headers
     foreach my $field (@Fields) {
         next if ($field->{'name'} eq 'problem_num');
+        # 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'});
     }
     $rows_output++;
@@ -695,7 +616,8 @@ sub output_excel {
     $excel_workbook->close();
     # Tell the user where to get their excel file
     $r->print('<br />'.
-              '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");
+              '<a href="'.$filename.'">'.
+              &mt('Your Excel Spreadsheet').'</a>'."\n");
     $r->rflush();
     return;
 }
@@ -751,7 +673,7 @@ sub statistics_table_header {
                 'document.Statistics.sortby.value='."'".$field->{'name'}."'".
                     ';document.Statistics.submit();">';
         }
-        $header_row .= $field->{'title'};
+        $header_row .= &mt($field->{'title'});
         if ($options =~ /sortable/) {
             $header_row.= '</a>';
         }
@@ -762,7 +684,7 @@ sub statistics_table_header {
             $header_row .= '<a href="javascript:'.
                 "document.Statistics.plot.value='$field->{'name'}'".
                     ';document.Statistics.submit();">';
-            $header_row .= 'plot</a>)';
+            $header_row .= &mt('plot').'</a>)';
         }
         $header_row .= '</th>';
     }
@@ -844,8 +766,12 @@ sub plot_statistics {
         }
     }
     
-    $r->print("<p>".&DrawGraph(\@Data,$title,'Problem Number',$yaxis,
-                               $Max)."</p>\n");
+    $r->print("<p>".&Apache::loncommon::DrawBarGraph($title,
+                                                     'Problem Number',
+                                                     $yaxis,
+                                                     $Max,
+                                                     undef,
+                                                     \@Data)."</p>\n");
     #
     # Print out the data
     $ENV{'form.sortby'} = 'Contents';
@@ -853,35 +779,6 @@ sub plot_statistics {
     return;
 }
 
-###############################################
-###############################################
-
-=pod 
-
-=item &DrawGraph()
-
-=cut
-
-###############################################
-###############################################
-sub DrawGraph {
-    my ($values,$title,$xaxis,$yaxis,$Max)=@_;
-    $title = '' if (! defined($title));
-    $xaxis = '' if (! defined($xaxis));
-    $yaxis = '' if (! defined($yaxis));
-    #
-    my $sendValues = join(',', @$values);
-    my $sendCount = scalar(@$values);
-    $Max =1 if ($Max < 1);
-    if ( int($Max) < $Max ) {
-        $Max++;
-        $Max = int($Max);
-    }
-    my @GData = ($title,$xaxis,$yaxis,$Max,$sendCount,$sendValues);
-    return '<IMG src="/cgi-bin/graph.png?'.
-        (join('&', @GData)).'" border="1" />';
-}
-
 sub get_statistics {
     my ($sequence,$resource,$part,$problem_num) = @_;
     #
@@ -911,6 +808,8 @@ sub get_statistics {
 
 =item &ProblemStatisticsLegend()
 
+HELP  This needs to be localized, or at least generated automatically.
+
 =cut
 
 ###############################################