--- loncom/interface/lonstatistics.pm	2003/10/29 15:22:30	1.89
+++ loncom/interface/lonstatistics.pm	2005/01/05 20:34:20	1.112
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstatistics.pm,v 1.89 2003/10/29 15:22:30 matthew Exp $
+# $Id: lonstatistics.pm,v 1.112 2005/01/05 20:34:20 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -38,21 +38,6 @@ lonstatistics
 
 Main handler for statistics and chart.
 
-=head1 PACKAGES USED
-
-    use strict;
-    use Apache::Constants qw(:common :http);
-    use Apache::lonnet();
-    use Apache::lonhomework;
-    use Apache::loncommon;
-    use Apache::loncoursedata;
-    use Apache::lonhtmlcommon;
-    use Apache::lonproblemanalysis;
-    use Apache::lonsubmissiontimeanalysis;
-    use Apache::lonproblemstatistics;
-    use Apache::lonstudentassessment;
-    use Apache::lonpercentage;
-    use Apache::lonmysql;
 =over 4
 
 =cut
@@ -72,21 +57,27 @@ use vars qw(
     $top_map 
     @Sequences 
     @SelectedMaps
-    @Assessments);
+    @Assessments
+    $enrollment_status);
 
 use Apache::lonnet();
 use Apache::lonhomework;
 use Apache::loncommon;
 use Apache::loncoursedata;
 use Apache::lonhtmlcommon;
+use Apache::lonmysql;
+use Apache::lonlocal;
+use Time::HiRes;
+#
+# Statistics Packages
 use Apache::lonproblemanalysis();
 use Apache::lonsubmissiontimeanalysis();
+use Apache::loncorrectproblemplot();
 use Apache::lonproblemstatistics();
 use Apache::lonstudentassessment();
 use Apache::lonpercentage;
-use Apache::lonmysql;
-use Apache::lonlocal;
-use Time::HiRes;
+use Apache::lonstudentsubmissions();
+use Apache::lonsurveyreports();
 
 #######################################################
 #######################################################
@@ -238,17 +229,17 @@ sub PrepareClasslist {
     }
     #
     # Set up %StudentData
-    @StudentDataOrder = qw/fullname username domain id section status/;
+    @StudentDataOrder = qw/fullname username domain id section status comments/;
     foreach my $field (@StudentDataOrder) {
-        $StudentData{$field}->{'title'} = $field;
-        $StudentData{$field}->{'base_width'} = length($field);
+        $StudentData{$field}->{'title'} = &mt($field);
+        $StudentData{$field}->{'base_width'} = length(&mt($field));
         $StudentData{$field}->{'width'} = 
                                $StudentData{$field}->{'base_width'};
     }
     #
     # get the status requested
-    my $requested_status = 'Active';
-    $requested_status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));
+    $enrollment_status = 'Active';
+    $enrollment_status = $ENV{'form.Status'} if (exists($ENV{'form.Status'}));
     #
     # Process the classlist
     while (my ($student,$student_data) = each (%$classlist)) {
@@ -278,8 +269,8 @@ sub PrepareClasslist {
         foreach my $sect (@SelectedSections) {
             if ( (($sect eq 'all') || 
                   ($section eq $sect)) &&
-                 (($studenthash->{'status'} eq $requested_status) || 
-                  ($requested_status eq 'Any')) 
+                 (($studenthash->{'status'} eq $enrollment_status) || 
+                  ($enrollment_status eq 'Any')) 
                  ){
                 push (@Students,$studenthash);
                 last;
@@ -481,13 +472,22 @@ assessments.
 #######################################################
 #######################################################
 sub Sequences_with_Assess {
+    my ($mode) = @_;
+    $mode = 'selected' if (! defined($mode));
     my @Sequences_to_Show;
-    foreach my $map_symb (@SelectedMaps) {
-        foreach my $sequence (@Sequences) {
-            next if ($sequence->{'symb'} ne $map_symb && $map_symb ne 'all');
-            next if ($sequence->{'num_assess'} < 1);
+    foreach my $sequence (@Sequences) {
+        next if ($sequence->{'num_assess'} < 1);
+        if ($mode eq 'all') {
             push (@Sequences_to_Show,$sequence);
+        } elsif ($mode eq 'selected') {
+            foreach my $map_symb (@SelectedMaps) {
+                if ($sequence->{'symb'} eq $map_symb || $map_symb eq 'all'){
+                    push (@Sequences_to_Show,$sequence);
+                    last; # Only put it in once
+                }
+            }
         }
+
     }
     return @Sequences_to_Show;
 }
@@ -516,20 +516,6 @@ sub PrepareCourseData {
     $top_map = $top if (ref($top));
     @Sequences = @{$sequences} if (ref($sequences) eq 'ARRAY');
     @Assessments = @{$assessments} if (ref($assessments) eq 'ARRAY');
-    #
-    # Compute column widths
-    foreach my $seq (@Sequences) {
-        my $name_length = length($seq->{'title'});
-        my $num_parts = $seq->{'num_assess_parts'};
-        #
-        # Use 3 digits for each the sum and total, which means 7 total...
-        my $num_col = $num_parts+7;
-        if ($num_col < $name_length) {
-            $num_col = $name_length;
-        }
-        $seq->{'base_width'} = $name_length;
-        $seq->{'width'} = $num_col;
-    }
     return;
 }
 
@@ -800,72 +786,6 @@ sub SectionSelect {
     return $Str;
 }
 
-#######################################################
-#######################################################
-
-=pod
-
-=item &CreateAndParseOutputSelector()
-
-Construct a selection list of options for output and parse output selections.
-
-=cut
-
-#######################################################
-#######################################################
-sub OutputDescriptions {
-    my (@OutputOptions) = @_;
-    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 {
-    my ($elementname,$default,@OutputOptions) = @_;
-    my $output_mode;
-    my $show;
-    my $Str = '';
-    #
-    # Format for output options is 'mode, restrictions';
-    my $selected = $default;
-    if (exists($ENV{'form.'.$elementname})) {
-        if (ref($ENV{'form.'.$elementname} eq 'ARRAY')) {
-            $selected = $ENV{'form.'.$elementname}->[0];
-        } else {
-            $selected = $ENV{'form.'.$elementname};
-        }
-    }
-    #
-    # 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'};
-    }
-    #
-    # 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;
-        }
-        $Str .= "\n".'    <option value="'.$option->{'value'}.'"';
-        $Str .= " selected " if ($option->{'value'} eq $selected);
-        $Str .= ">".&mt($option->{'name'})."<\/option>";
-    }
-    $Str .= "\n</select>";
-    return ($Str,$output_mode,$show);
-}
-
 ###############################################
 ###############################################
 
@@ -920,7 +840,13 @@ Ensures all student data is up to date.
 ###############################################
 ###############################################
 sub Gather_Full_Student_Data {
-    my ($r) = @_;
+    my ($r,$formname,$inputname) = @_;
+    my $status_type;
+    if (defined($formname)) {
+        $status_type = 'inline';
+    } else {
+        $status_type = 'popup';
+    }
     my $c = $r->connection();
     #
     &Apache::loncoursedata::clear_internal_caches();
@@ -930,7 +856,8 @@ sub Gather_Full_Student_Data {
     # Open the progress window
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin
         ($r,&mt('Student Data Compilation Status'),
-         &mt('Student Data Compilation Progress'), scalar(@Students));
+         &mt('Student Data Compilation Progress'), scalar(@Students),
+         $status_type,undef,$formname,$inputname);
     #
     while (my $student = shift @Students) {
         return if ($c->aborted());
@@ -948,43 +875,68 @@ sub Gather_Full_Student_Data {
 ##################################################
 sub DisplayClasslist {
     my ($r)=@_;
+    &Apache::lonhtmlcommon::add_breadcrumb
+        ({text=>'Select One Student'});
+    #
+    # Output some of the standard interface components
+    my $Str;
+    $Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Select One Student');
+    $Str .= '<p><table cellspacing="5">'."\n";
+    $Str .= '<tr>';
+    $Str .= '<th align="center"><b>'.&mt('Sections').'</b></th>';
+    $Str .= '<th align="center"><b>'.&mt('Enrollment Status').'</b></th>';
+    $Str .= '</tr>'.$/;
+    $Str .= '<tr>';
+    $Str .= '<td>'.
+        &Apache::lonstatistics::SectionSelect('Section','multiple',5).
+        '</td>';
+    $Str .= '<td>'.
+        &Apache::lonhtmlcommon::StatusOptions(undef,undef,5).
+        '</td>';
+    
+    $Str .= '</tr>'.$/;
+    $Str .= '</table></p>';
+    $Str .= '<input type="submit" name="selectstudent" value="'.
+        &mt('Update Display').'" />';
+    $r->print($Str);
+    $r->rflush();
     #
-    my @Fields = ('fullname','username','domain','id','section');
+    my @Fields = ('fullname','username','domain','id','section','status');
     #
-    my $Str='';
+    $Str = '';
     if (! @Students) {
         if ($SelectedSections[0] eq 'all') { 
             if (lc($ENV{'form.Status'}) eq 'any') {
-                $Str .= '<h2>There are no students in the course.</h2>';
+                $Str .= '<h2>'.
+                    &mt('There are no students in the course.').
+                    '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'active') {
-                $Str .= '<h2>There are no currently enrolled students in '.
-                    'the course.</h2>';
+                $Str .= '<h2>'.
+                &mt('There are no currently enrolled students in the course.').
+                    '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'expired') {
-                $Str .= '<h2>There are no previously enrolled '.
-                    'students in the course.</h2>';
+                $Str .= '<h2>'.
+                    &mt('There are no previously enrolled students in the course.').
+                        '</h2>';
             }
         } else { 
             my $sections;
-            if (@SelectedSections == 1) {
-                $sections = 'section '.$SelectedSections[0];
-            } elsif (@SelectedSections > 2) {
-                $sections = 'sections '.join(', ',@SelectedSections);
-                $sections =~ s/, ([^,])*$/, and $1/;
-            } else {
-                $sections = 'sections '.join(' and ',@SelectedSections);
-            }
             if (lc($ENV{'form.Status'}) eq 'any') {
-                $Str .= '<h2>There are no students in '.$sections.'.</h2>';
+                $Str .= '<h2>'.
+                    &mt('There are no students in the selected sections.').
+                    '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'active') {
-                $Str .= '<h2>There are no currently enrolled students '.
-                    'in '.$sections.'.</h2>';
+                $Str .= '<h2>'.
+                    &mt('There are no currently enrolled students in the selected sections.').
+                    '</h2>';
             } elsif (lc($ENV{'form.Status'}) eq 'expired') {
-                $Str .= '<h2>There are no previously enrolled students '.
-                    'in '.$sections.'.</h2>';
+                $Str .= '<h2>'.
+                    &mt('There are no previously enrolled students in the selected sections.').
+                    '</h2>';
             }
         }
         $Str.= '<a href="/adm/statistics?reportSelected=student_assessment">'.
-            'Return to the chart.</a>';
+            &mt('Click here to return to the chart').'</a>';
         $r->print($Str);
         $r->rflush();
         return;
@@ -995,7 +947,10 @@ sub DisplayClasslist {
     $Str .= '<table border="0"><tr><td bgcolor="#777777">'."\n";
     $Str .= '<table border="0" cellpadding="3"><tr bgcolor="#e6ffff">'."\n";
     foreach my $field (@Fields) {
-        $Str .= '<th><a href="/adm/statistics?reportSelected=classlist&sort='.$field.'">'.$field.
+        $Str .= '<th><a href="/adm/statistics?'.
+            'reportSelected=student_assessment&'.
+            'selectstudent=1&'.
+            'sort='.$field.'">'.&mt($field).
             '</a></th>';
     }
     $Str .= '</tr>'."\n";
@@ -1020,6 +975,8 @@ sub DisplayClasslist {
                 $Str .= &Apache::lonnet::escape($sname).'">';
                 $Str .= $student->{$field}.'&nbsp';
                 $Str .= '</a>';
+            } elsif ($field eq 'status') {
+                $Str .= &mt($student->{$field});
             } else {
                 $Str .= $student->{$field};
             }
@@ -1051,10 +1008,25 @@ sub CreateMainMenu {
     &mt('Detailed statistics and graphs of student performance on problems.'),
                  },
                    { internal_name => 'submissiontime_analysis',
-                     name => &mt('Submission Time Analysis'),
+                     name => &mt('Submission Time Plots'),
                      short_description => 
     &mt('Display and analysis of submission times on assessments.'),
                  },
+                   { internal_name => 'student_submission_reports',
+                     name => &mt('Student Submission Reports'),
+                     short_description => 
+    &mt('Prepare reports of student submissions.'),
+                 },
+                   { internal_name => 'survey_reports',
+                     name => &mt('Survey Reports'),
+                     short_description => 
+    &mt('Prepare reports on survey results.'),
+                 },
+                   { internal_name => 'correct_problems_plot',
+                     name => &mt('Correct Problems Plot'),
+                     short_description => 
+    &mt('Display a histogram of student performance in the course.'),
+                 },
 #                   { internal_name => 'student_assessment',
 #                     name => &mt('Problem Status Chart'),
 #                     short_description => 
@@ -1066,7 +1038,7 @@ sub CreateMainMenu {
     #
     # Create the menu
     my $Str;
-    $Str .= '<h1>'.&mt('Please select a report to generate').'</h1>';
+    $Str .= '<h2>'.&mt('Please select a report to generate').'</h2>';
     foreach my $reportdata (@reports) {
         $Str .='    <h3><a href="/adm/statistics?reportSelected='.
             $reportdata->{'internal_name'}.'" >'.
@@ -1105,21 +1077,11 @@ sub handler {
         }
     }
     #
-    # Set document type for header only
-    if($r->header_only) {
-        if ($ENV{'browser.mathml'}) {
-            $r->content_type('text/xml');
-        } else {
-            $r->content_type('text/html');
-        }
-        &Apache::loncommon::no_cache($r);
-        $r->send_http_header;
-        return OK;
-    }
-    #
     # Send the header
-    $r->content_type('text/html');
+    &Apache::loncommon::no_cache($r);
+    &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;
+    if ($r->header_only) { return OK; }
     #
     # Extract form elements from query string
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
@@ -1127,13 +1089,33 @@ sub handler {
                                              'SelectedStudent']);
     #
     # Give the LON-CAPA page header
-    $r->print(&Apache::lonhtmlcommon::Title('Course Statistics and Charts'));
+    my $style = <<ENDSTYLE;
+<style type="text/css">
+    ul.sub_studentans { list-style-type: none }
+    ul.sub_correctans { list-style-type: none }
+    tr.even           { background-color: \#CCCCCC }
+    td.essay          { border: 1px solid gray; }
+</style>
+ENDSTYLE
+    $r->print('<html><head><title>'.
+              &mt('Course Statistics and Charts').
+              '</title>'.$style.
+              "</head>\n".
+              &Apache::loncommon::bodytag('Course Statistics and Charts'));
     $r->rflush();
     # 
     # Either print out a menu for them or send them to a report
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/statistics',
+                                            title=>'Statistics',
+                                            text =>'Statistics',
+                                            faq=>139,
+                                            bug=>'Statistics and Charts'});
     if (! exists($ENV{'form.reportSelected'}) || 
         $ENV{'form.reportSelected'} eq '') {
-        $r->print(&CreateMainMenu());
+        $r->print(&Apache::lonhtmlcommon::breadcrumbs
+                  (undef,&mt('Statistics Main Page')).
+                  &CreateMainMenu());
     } else {
     #
         if (! &Apache::lonmysql::verify_sql_connection()) {
@@ -1158,32 +1140,59 @@ sub handler {
             &Apache::loncoursedata::delete_caches($ENV{'requres.course.id'});
         }
         #
-        # Set up the statistics and chart environment
-        &PrepareClasslist();
-        &PrepareCourseData($r);
-        #
         # Begin form output
         $r->print('<form name="Statistics" ');
         $r->print('method="post" action="/adm/statistics">');
         $r->rflush();
         #
         my $GoToPage = $ENV{'form.reportSelected'};
+        #
+        # Set up the statistics and chart environment
+        &PrepareCourseData($r);
+        #
         $r->print('<input type="hidden" name="reportSelected" value="'.
                   $GoToPage.'">');
         if($GoToPage eq 'activitylog') {
 #        &Apache::lonproblemstatistics::Activity();
         } elsif($GoToPage eq 'problem_statistics') {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>'/adm/statistics?reportselected=problem_statistics',
+                  text=>'Overall Problem Statistics'});
             &Apache::lonproblemstatistics::BuildProblemStatisticsPage($r,$c);
         } elsif($GoToPage eq 'problem_analysis') {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>'/adm/statistics?reportselected=problem_analysis',
+                  text=>'Detailed Problem Analysis'});
             &Apache::lonproblemanalysis::BuildProblemAnalysisPage($r,$c);
         } elsif($GoToPage eq 'submissiontime_analysis') {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>
+                      '/adm/statistics?reportselected=submissiontime_analysis',
+                      text=>'Submission Time Plots'});
             &Apache::lonsubmissiontimeanalysis::BuildSubmissionTimePage($r,$c);
+        } elsif($GoToPage eq 'student_submission_reports') {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>
+                  '/adm/statistics?reportselected=student_submission_reports',
+                  text=>'Student Submission Reports'});
+            &Apache::lonstudentsubmissions::BuildStudentSubmissionsPage($r,$c);
+        } elsif($GoToPage eq 'survey_reports') {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>
+                  '/adm/statistics?reportselected=survey_reports',
+                  text=>'Survey Reports'});
+            &Apache::lonsurveyreports::BuildSurveyReportsPage($r,$c);
+        } elsif($GoToPage eq 'correct_problems_plot') {
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>'/adm/statistics?reportselected=correct_problems_plot',
+                  text=>'Correct Problems Plot'});
+            &Apache::loncorrectproblemplot::BuildCorrectProblemsPage($r,$c);
         } elsif($GoToPage eq 'student_assessment') {
+            &Apache::lonhtmlcommon::clear_breadcrumbs();
+            &Apache::lonhtmlcommon::add_breadcrumb
+                ({href=>'/adm/statistics?reportselected=student_assessment',
+                  text=>'Chart'});
             &Apache::lonstudentassessment::BuildStudentAssessmentPage($r,$c);
-        } elsif($GoToPage eq 'DoDiffGraph' || $GoToPage eq 'PercentWrongGraph') {
-#        &Apache::lonproblemstatistics::BuildGraphicChart($r,$c);
-        } elsif($GoToPage eq 'Correct-problems Plot') {
-            #	&Apache::lonpercentage::BuildPercentageGraph($r,$c);
         }
         #
         $r->print("</form>\n");