--- loncom/interface/lonstatistics.pm	2008/10/22 10:53:21	1.142
+++ loncom/interface/lonstatistics.pm	2010/05/03 16:41:51	1.152
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonstatistics.pm,v 1.142 2008/10/22 10:53:21 bisitz Exp $
+# $Id: lonstatistics.pm,v 1.152 2010/05/03 16:41:51 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,19 +28,7 @@
 #
 ###
 
-=pod
-
-=head1 NAME
 
-lonstatistics
-
-=head1 SYNOPSIS
-
-Main handler for statistics and chart.
-
-=over 4
-
-=cut
 
 package Apache::lonstatistics;
 
@@ -78,33 +66,6 @@ use Apache::lonsurveyreports();
 use Apache::longradinganalysis();
 use LONCAPA;
 
-#######################################################
-#######################################################
-
-=pod
-
-=item Package Variables
-
-=item @FullClasslist The full classlist
-
-=item @Students The students we are concerned with for this invocation
-
-=item @Sections The sections available in this class
-
-=item @Groups The groups available in the class
-
-=item $curr_student The student currently being examined
-
-=item $prev_student The student previous in the classlist
-
-=item $next_student The student next in the classlist
-
-=over
-
-=cut 
-
-#######################################################
-#######################################################
 #
 # Classlist variables
 #
@@ -112,43 +73,7 @@ my $curr_student;
 my $prev_student;
 my $next_student;
 
-#######################################################
-#######################################################
-
-=pod
-
-=item &clear_classlist_variables()
-
-undef the following package variables:
-
-=over
-
-=item @FullClasslist
-
-=item @Students
-
-=item @Sections
-
-=item @Groups
-
-=item %StudentData
 
-=item @StudentDataOrder
-
-=item @SelectedStudentData
-
-=item $curr_student
-
-=item $prev_student
-
-=item $next_student
-
-=back
-
-=cut
-
-#######################################################
-#######################################################
 sub clear_classlist_variables {
     undef(@FullClasslist);
     undef(@Students);
@@ -161,45 +86,7 @@ sub clear_classlist_variables {
     undef($next_student);
 }
 
-#######################################################
-#######################################################
-
-=pod
-
-=item &PrepareClasslist()
-
-Build up the classlist information.  The classlist information is kept in
-the following package variables:
-
-=over
-
-=item @FullClasslist
-
-=item @Students
-
-=item @Sections
-
-=item @Groups 
-
-=item %StudentData
-
-=item @SelectedStudentData
-
-=item $curr_student
-
-=item $prev_student
-
-=item $next_student
-
-=back
-
-$curr_student, $prev_student, and $next_student may not be defined, depending
-upon the calling context.
 
-=cut
-
-#######################################################
-#######################################################
 sub PrepareClasslist {
     my %Sections;
     &clear_classlist_variables();
@@ -374,19 +261,7 @@ sub PrepareClasslist {
     return;
 }
 
-#######################################################
-#######################################################
-
-=pod
-
-=item get_selected_sections
-
-Returns an array of the selected sections
 
-=cut
-
-#######################################################
-#######################################################
 sub get_selected_sections {
     my @selected_sections = 
 	&Apache::loncommon::get_env_multiple('form.Section');
@@ -404,19 +279,7 @@ sub get_selected_sections {
     return @selected_sections;
 }
 
-#######################################################
-#######################################################
-                                                                                    
-=pod
-                                                                                    
-=item get_selected_groups
-                                                                                    
-Returns an array of the selected groups
-                                                                                    
-=cut
-                                                                                    
-#######################################################
-#######################################################
+
 sub get_selected_groups {
     my @selected_groups =
         &Apache::loncommon::get_env_multiple('form.Group');
@@ -430,21 +293,8 @@ sub get_selected_groups {
     return @selected_groups;
 }
                                                                                     
-=pod
-
-=item &section_and_enrollment_description
-
-Returns a string describing the currently selected section(s), group(s) and 
-access status.  
-
-Inputs: mode = 'plaintext' or 'localized'  (defaults to 'localized')
-    'plaintext' is used for example in Excel spreadsheets.
-Returns: scalar description string.
 
-=cut
 
-#######################################################
-#######################################################
 sub section_and_enrollment_description {
     my ($mode) = @_;
     if (! defined($mode)) { $mode = 'localized'; }
@@ -469,8 +319,8 @@ sub section_and_enrollment_description {
     return $description;
 }
 
-#######################################################
-#######################################################
+
+
 
 sub section_or_group_text {
     my ($mode,$type,@items) = @_;
@@ -513,16 +363,6 @@ sub section_or_group_text {
 }
 
 
-=pod
-
-=item get_students
-
-Returns a list of the selected students
-
-=cut
-
-#######################################################
-#######################################################
 sub get_students {
     if (! @Students) {
         &PrepareClasslist()
@@ -530,84 +370,26 @@ sub get_students {
     return @Students;
 }
 
-#######################################################
-#######################################################
-
-=pod
-
-=item &current_student()
 
-Returns a pointer to a hash containing data about the currently
-selected student.
-
-=cut
 
-#######################################################
-#######################################################
 sub current_student { 
     return $curr_student;
 }
 
-#######################################################
-#######################################################
-
-=pod
-
-=item &previous_student()
-
-Returns a pointer to a hash containing data about the student prior
-in the list of students.  Or something.  
 
-=cut
 
-#######################################################
-#######################################################
 sub previous_student { 
     return $prev_student;
 }
 
-#######################################################
-#######################################################
-
-=pod
 
-=item &next_student()
 
-Returns a pointer to a hash containing data about the next student
-to be viewed.
-
-=cut
-
-#######################################################
-#######################################################
 sub next_student { 
     return $next_student;
 }
 
-##############################################
-##############################################
-
-=pod 
-
-=item &StudentDataSelect($elementname,$status,$numvisible,$selected)
-
-Returns html for a selection box allowing the user to choose one (or more) 
-of the fields of student data available (fullname, username, id, section, etc)
-
-=over 4
-
-=item $elementname The name of the HTML form element
 
-=item $status 'multiple' or 'single' selection box
-
-=item $numvisible The number of options to be visible
-
-=back
 
-=cut
-
-##############################################
-##############################################
 sub StudentDataSelect {
     my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {
@@ -618,15 +400,15 @@ sub StudentDataSelect {
     my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {
-        $Str .= 'multiple="true" ';
+        $Str .= 'multiple="multiple" ';
     }
     $Str .= 'size="'.$numvisible.'" >'."\n";
     #
     # Deal with 'all'
-    $Str .= '    <option value="all" ';
+    $Str .= '    <option value="all"';
     foreach (@SelectedStudentData) {
         if ($_ eq 'all') {
-            $Str .= 'selected ';
+            $Str .= ' selected="selected"';
             last;
         }
     }
@@ -634,10 +416,10 @@ sub StudentDataSelect {
     #
     # Loop through the student data fields
     foreach my $item (@StudentDataOrder) {
-        $Str .= '    <option value="'.$item.'" ';
+        $Str .= '    <option value="'.$item.'"';
         foreach (@SelectedStudentData) {
             if ($item eq $_ ) {
-                $Str .= 'selected ';
+                $Str .= ' selected="selected"';
                 last;
             }
         }
@@ -647,22 +429,8 @@ sub StudentDataSelect {
     return $Str;
 }
 
-#######################################################
-#######################################################
-
-=pod
 
-=item &get_selected_maps($elementname)
 
-Input: Name of the <select> form element used to specify the maps.
-
-Returns: Array of symbs of selected maps or the description 'all'.
-   If form.$elementname does not exist, 'all' is returned.
-
-=cut
-
-#######################################################
-#######################################################
 sub get_selected_maps {
     my ($elementname) = @_;
     my @selected_maps = 
@@ -678,25 +446,8 @@ sub get_selected_maps {
 }
 
 
-#######################################################
-#######################################################
-
-=pod
-
-=item &selected_sequences_with_assessments
-
-Retrieve the sequences which were selected by the user to show.  
-
-Input: $mode: scalar.  Either 'selected' or 'all'.  If not specified,
-    'selected' is used.
-
-Returns: an array containing a navmap object and navmap resources, 
-    or an array containing a scalar with an error message.
 
-=cut
 
-#######################################################
-#######################################################
 sub selected_sequences_with_assessments {
     my ($mode) = @_;
     $mode = 'selected' if (! defined($mode));
@@ -736,31 +487,7 @@ sub selected_sequences_with_assessments
     return $navmap,@sequences_to_show;
 }
 
-##############################################
-##############################################
-
-=pod 
 
-=item &map_select($elementname,$status,$numvisible,$restriction) 
-
-Returns html for a selection box allowing the user to choose one (or more) 
-of the sequences in the course.  The values of the sequences are the symbs.
-If the top sequence is selected, the value 'top' will result.
-
-=over 4
-
-=item $elementname The name of the HTML form element
-
-=item $status 'multiple' or 'single' selection box
-
-=item $numvisible The number of options to be visible
-
-=back
-
-=cut
-
-##############################################
-##############################################
 sub map_select {
     my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {
@@ -774,14 +501,14 @@ sub map_select {
     my $form = "\n";
     $form .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {
-        $form .= 'multiple="true" ';
+        $form .= 'multiple="multiple" ';
     }
     $form .= 'size="'.$numvisible.'" >'."\n";
     #
     # Put in option for 'all'
-    $form .= '    <option value="all" ';
+    $form .= '    <option value="all"';
     if ($selected_maps[0] eq 'all') {
-        $form .= 'selected ';
+        $form .= ' selected="selected"';
     }
     $form .= ">all</option>\n";
     #
@@ -794,10 +521,10 @@ sub map_select {
         $navmap = shift(@sequences);
     }
     foreach my $seq (@sequences){
-        $form .= '    <option value="'.$seq->symb.'" ';
+        $form .= '    <option value="'.$seq->symb.'"';
         foreach (@selected_maps) {
             if ($seq->symb eq $_) {
-                $form .= 'selected ';
+                $form .= ' selected="selected"';
                 last;
             }
         }
@@ -807,31 +534,7 @@ sub map_select {
     return $form;
 }
 
-##############################################
-##############################################
-
-=pod 
-
-=item &SectionSelect($elementname,$status,$numvisible) 
 
-Returns html for a selection box allowing the user to choose one (or more) 
-of the sections in the course.  
-
-Uses the package variables @Sections
-=over 4
-
-=item $elementname The name of the HTML form element
-
-=item $status 'multiple' or 'single' selection box
-
-=item $numvisible The number of options to be visible
-
-=back
-
-=cut
-
-##############################################
-##############################################
 sub SectionSelect {
     my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {
@@ -847,16 +550,16 @@ sub SectionSelect {
     my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {
-        $Str .= 'multiple="true" ';
+        $Str .= 'multiple="multiple" ';
     }
     $Str .= 'size="'.$numvisible.'" >'."\n";
     #
     # Loop through the sequences
     foreach my $s (@Sections) {
-        $Str .= '    <option value="'.$s.'" ';
+        $Str .= '    <option value="'.$s.'"';
         foreach (&get_selected_sections()) {
             if ($s eq $_) {
-                $Str .= 'selected ';
+                $Str .= ' selected="selected"';
                 last;
             }
         }
@@ -866,31 +569,7 @@ sub SectionSelect {
     return $Str;
 }
 
-##############################################
-##############################################
-                                                                                    
-=pod
-                                                                                    
-=item &GroupSelect($elementname,$status,$numvisible)
-                                                                                    
-Returns html for a selection box allowing the user to choose one (or more)
-of the groups in the course.
-                                                                                    
-Uses the package variables @Groups
-=over 4
-                                                                                    
-=item $elementname The name of the HTML form element
-                                                                                    
-=item $status 'multiple' or 'single' selection box
-                                                                                    
-=item $numvisible The number of options to be visible
-                                                                                    
-=back
-                                                                                    
-=cut
-                                                                                    
-##############################################
-##############################################
+
 sub GroupSelect {
     my ($elementname,$status,$numvisible)=@_;
     if ($numvisible < 1) {
@@ -906,16 +585,16 @@ sub GroupSelect {
     my $Str = "\n";
     $Str .= '<select name="'.$elementname.'" ';
     if ($status ne 'single') {
-        $Str .= 'multiple="true" ';
+        $Str .= 'multiple="multiple" ';
     }
     $Str .= 'size="'.$numvisible.'" >'."\n";
     #
     # Loop through the groups
     foreach my $s (@Groups) {
-        $Str .= '    <option value="'.$s.'" ';
+        $Str .= '    <option value="'.$s.'"';
         foreach my $group (&get_selected_groups()) {
             if ($s eq $group) {
-                $Str .= 'selected ';
+                $Str .= ' selected="selected"';
                 last;
             }
         }
@@ -925,8 +604,8 @@ sub GroupSelect {
 }
 
 
-##################################################
-##################################################
+
+
 sub DisplayClasslist {
     my ($r)=@_;
     &Apache::lonhtmlcommon::add_breadcrumb
@@ -1035,7 +714,7 @@ sub DisplayClasslist {
                 $Str .= '&sort='.&escape($env{'form.sort'});
                 $Str .= '&SelectedStudent=';
                 $Str .= &escape($sname).'">';
-                $Str .= $student->{$field}.'&nbsp';
+                $Str .= $student->{$field}.'&nbsp;';
                 $Str .= '</a>';
             } elsif ($field eq 'status') {
                 $Str .= &mt($student->{$field});
@@ -1054,84 +733,65 @@ sub DisplayClasslist {
     return;
 }
 
-##############################################
-##############################################
+
+
 sub CreateMainMenu {
     #
     # Define menu data
-    my @reports = ({ internal_name => 'problem_statistics',
-                     name => &mt('Overall Problem Statistics'),
-                     short_description => 
-    &mt('Student performance statistics on all problems.'),
-                 },
-                   { internal_name => 'problem_analysis',
-                     name => &mt('Detailed Problem Analysis'),
-                     short_description => 
-    &mt('Detailed statistics and graphs of student performance on problems.'),
-                 },
-                   { internal_name => 'submissiontime_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 => 'grading_analysis',
-#                     name => &mt('Detailed Grading Analysis'),
-#                     short_description => 
-#    &mt('Display statistics about who graded who.'),
-#                 },
-#                   { internal_name => 'student_assessment',
-#                     name => &mt('Problem Status Chart'),
-#                     short_description => 
-#    &mt('Brief view of each students performance in course.'),
-#                 },
-                   # 'percentage'  => 'Correct-problems Plot',
-                   # 'activitylog' => 'Activity Log',
-                   );
-    #
-    # Create the menu
-    my $Str;
-    $Str .= '<h2>'.&mt('Please select a report to generate').'</h2>';
-    foreach my $reportdata (@reports) {
-        $Str .='    <h3><a href="/adm/statistics?reportSelected='.
-            $reportdata->{'internal_name'}.'" >'.
-            $reportdata->{'name'}."</a></h3>\n";
-        $Str .= '    '.('&nbsp;'x8).$reportdata->{'short_description'}.
-            "\n";
-    }
-    $Str .="</dl>\n";
-    #
-    return $Str;
+    my @reports = (
+	    {categorytitle => 'Statistics and Analyses',
+         items => [
+            {url => '/adm/statistics?reportSelected=problem_statistics',
+			 permission => 'F',
+             icon => 'document-open.png',
+             linktext => ('Overall Problem Statistics'),
+             linktitle => ('Student performance statistics on all problems.')},
+       
+            {url => '/adm/statistics?reportSelected=problem_analysis',
+			 permission => 'F',
+             icon => 'prob_ana.png',
+             linktext => ('Detailed Problem Analysis'),
+             linktitle => ('Detailed statistics and graphs of student performance on problems.')},
+         ]},
+        {categorytitle => 'Plots',
+         items => [
+            {url => '/adm/statistics?reportSelected=submissiontime_analysis',
+			 permission => 'F',
+             icon => 'subtimpl.png',
+             linktext => ('Submission Time Plots'),
+             linktitle => ('Display and analysis of submission times on assessments.')},
+      
+            {url => '/adm/statistics?reportSelected=correct_problems_plot',
+			 permission => 'F',
+             icon => 'coprplot.png',
+             linktext => ('Correct Problems Plot'),
+             linktitle => ('Display a histogram of student performance in the course.')},
+         ]},
+        {categorytitle => 'Reports',
+         items => [
+            {url => '/adm/statistics?reportSelected=student_submission_reports',
+			 permission => 'F',
+             icon => 'edit-copy.png',
+             linktext => ('Student Submission Reports'),
+             linktitle => ('Prepare reports of student submissions.')},
+                    
+            {url => '/adm/statistics?reportSelected=survey_reports',
+			 permission => 'F',
+             icon => 'survey_rep.png',
+			 linktext => ('Survey Reports'),
+             linktitle => ('Prepare reports on survey results.')},
+         ]});
+    
+return &Apache::lonhtmlcommon::generate_menu(@reports);
+ 
 }
 
-##############################################
-##############################################
+
+
 sub handler {
     my $r=shift;
     my $c = $r->connection();
     #
-    # Check for overloading
-    my $loaderror=&Apache::lonnet::overloaderror($r);
-    if ($loaderror) { return $loaderror; }
-    $loaderror=
-       &Apache::lonnet::overloaderror($r,
-         $env{'course.'.$env{'request.course.id'}.'.home'});
-    if ($loaderror) { return $loaderror; }
-    #
     # Check for access
     if (! &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
         $env{'user.error.msg'}=
@@ -1193,7 +853,7 @@ ENDSTYLE
                      .'</p>');
             $r->print('<p>'.
                       &mt('Course Statistics and Charts cannot be '.
-                          'retrieved until the database is restarted.  '.
+                          'retrieved until the database is restarted. '.
                           'Your data is intact but cannot be displayed '.
                           'at this time.').'</p>');
             $r->print(&Apache::loncommon::end_page());
@@ -1213,7 +873,7 @@ ENDSTYLE
         my $GoToPage = $env{'form.reportSelected'};
         #
         $r->print('<input type="hidden" name="reportSelected" value="'.
-                  $GoToPage.'">');
+                  $GoToPage.'" />');
         if($GoToPage eq 'activitylog') {
 #        &Apache::lonproblemstatistics::Activity();
         } elsif($GoToPage eq 'problem_statistics') {
@@ -1272,17 +932,227 @@ ENDSTYLE
 
 1;
 
-#######################################################
-#######################################################
+__END__
 
 =pod
 
+=head1 NAME
+
+lonstatistics
+
+=head1 SYNOPSIS
+
+Main handler for statistics and chart.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+
+=head1 PACKAGE VARIABLES
+
+=over
+
+=item @FullClasslist The full classlist
+
+=item @Students The students we are concerned with for this invocation
+
+=item @Sections The sections available in this class
+
+=item @Groups The groups available in the class
+
+=item $curr_student The student currently being examined
+
+=item $prev_student The student previous in the classlist
+
+=item $next_student The student next in the classlist
+
 =back
 
-=cut
+=head1 SUBROUTINES
+
+=over
 
-#######################################################
-#######################################################
+=item &clear_classlist_variables()
 
-__END__
+undef the following package variables:
+
+=over 4
+
+=item * @FullClasslist
+
+=item * @Students
+
+=item * @Sections
+
+=item * @Groups
+
+=item * %StudentData
+
+=item * @StudentDataOrder
+
+=item * @SelectedStudentData
+
+=item * $curr_student
+
+=item * $prev_student
+
+=item * $next_student
+
+=back
+
+=item &PrepareClasslist()
+
+Build up the classlist information.  The classlist information is kept in
+the following package variables:
+
+=over 4 
+
+=item * @FullClasslist
+
+=item * @Students
+
+=item * @Sections
+
+=item * @Groups 
+
+=item * %StudentData
+
+=item * @SelectedStudentData
+
+=item * $curr_student
+
+=item * $prev_student
+
+=item * $next_student
+
+=back
+
+$curr_student, $prev_student, and $next_student may not be defined, depending
+upon the calling context.
+
+=item get_selected_sections()
+
+Returns an array of the selected sections
+
+=item get_selected_groups()
+                                                                                    
+Returns an array of the selected groups
+
+=item &section_and_enrollment_description()
+
+Returns a string describing the currently selected section(s), group(s) and 
+access status.  
+
+Inputs: mode = 'plaintext' or 'localized'  (defaults to 'localized')
+    'plaintext' is used for example in Excel spreadsheets.
+Returns: scalar description string.
+
+=item section_or_group_text()
+
+=item get_students()
+
+Returns a list of the selected students
+
+=item &current_student()
+
+Returns a pointer to a hash containing data about the currently
+selected student.
+
+=item &previous_student()
+
+Returns a pointer to a hash containing data about the student prior
+in the list of students.  Or something. 
+
+=item &next_student()
+
+Returns a pointer to a hash containing data about the next student
+to be viewed. 
+
+=item &StudentDataSelect($elementname,$status,$numvisible,$selected)
+
+Returns html for a selection box allowing the user to choose one (or more) 
+of the fields of student data available (fullname, username, id, section, etc)
+
+=over 4
+
+=item * $elementname The name of the HTML form element
+
+=item * $status 'multiple' or 'single' selection box
+
+=item * $numvisible The number of options to be visible
+
+=back
+
+=item &get_selected_maps($elementname)
+
+Input: Name of the <select> form element used to specify the maps.
+
+Returns: Array of symbs of selected maps or the description 'all'.
+   If form.$elementname does not exist, 'all' is returned.
+
+=item &selected_sequences_with_assessments()
+
+Retrieve the sequences which were selected by the user to show.  
+
+Input: $mode: scalar.  Either 'selected' or 'all'.  If not specified,
+    'selected' is used.
+
+Returns: an array containing a navmap object and navmap resources, 
+    or an array containing a scalar with an error message.
+
+=item &map_select($elementname,$status,$numvisible,$restriction) 
+
+Returns html for a selection box allowing the user to choose one (or more) 
+of the sequences in the course.  The values of the sequences are the symbs.
+If the top sequence is selected, the value 'top' will result.
+
+=over 4
+
+=item * $elementname The name of the HTML form element
+
+=item * $status 'multiple' or 'single' selection box
+
+=item * $numvisible The number of options to be visible
+
+=back
+
+=item &SectionSelect($elementname,$status,$numvisible) 
+
+Returns html for a selection box allowing the user to choose one (or more) 
+of the sections in the course.  
+
+Uses the package variables @Sections
+
+=over 4
+
+=item * $elementname The name of the HTML form element
+
+=item * $status 'multiple' or 'single' selection box
+
+=item * $numvisible The number of options to be visible
+
+=back
+
+=item &GroupSelect($elementname,$status,$numvisible)
+                                                                                    
+Returns html for a selection box allowing the user to choose one (or more)
+of the groups in the course.
+                                                                                    
+Uses the package variables @Groups
+
+=over 4
+                                                                                    
+=item * $elementname The name of the HTML form element
+                                                                                    
+=item * $status 'multiple' or 'single' selection box
+                                                                                    
+=item * $numvisible The number of options to be visible
+                                                                                    
+=back
+
+=item CreateMainMenu()
+
+=back
+
+=cut