--- loncom/homework/grades.pm	2009/12/15 18:26:18	1.584
+++ loncom/homework/grades.pm	2009/12/27 01:49:32	1.587
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.584 2009/12/15 18:26:18 bisitz Exp $
+# $Id: grades.pm,v 1.587 2009/12/27 01:49:32 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1711,6 +1711,25 @@ sub get_increment {
     return $increment;
 }
 
+sub gradeBox_start {
+    return (
+        &Apache::loncommon::start_data_table()
+       .&Apache::loncommon::start_data_table_header_row()
+       .'<th>'.&mt('Part').'</th>'
+       .'<th>'.&mt('Points').'</th>'
+       .'<th>&nbsp;</th>'
+       .'<th>'.&mt('Assign Grade').'</th>'
+       .'<th>'.&mt('Weight').'</th>'
+       .'<th>'.&mt('Grade Status').'</th>'
+       .&Apache::loncommon::end_data_table_header_row()
+    );
+}
+
+sub gradeBox_end {
+    return (
+        &Apache::loncommon::end_data_table()
+    );
+}
 #--- displays the grading box, used in essay type problem and grading by page/sequence
 sub gradeBox {
     my ($request,$symb,$uname,$udom,$counter,$partid,$record) = @_;
@@ -1730,7 +1749,7 @@ sub gradeBox {
     if ($last_resets{$partid}) {
         $aggtries = &get_num_tries($record,$last_resets{$partid},$partid);
     }
-    $result.='<table border="0"><tr>';
+    $result.=&Apache::loncommon::start_data_table_row();
     my $ctr = 0;
     my $thisweight = 0;
     my $increment = &get_increment();
@@ -1753,8 +1772,8 @@ sub gradeBox {
 	$wgt.')" /></td>'."\n";
     $line.='<td>/'.$wgt.' '.$wgtmsg.
 	($$record{'resource.'.$partid.'.solved'} eq 'correct_by_student' ? '&nbsp;'.$checkIcon : '').
-	' </td><td><b>'.&mt('Grade Status').':</b>'."\n";
-    $line.='<select name="GD_SEL'.$counter.'_'.$partid.'" '.
+	' </td>'."\n";
+    $line.='<td><select name="GD_SEL'.$counter.'_'.$partid.'" '.
 	'onChange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n";
     if ($$record{'resource.'.$partid.'.solved'} eq 'excused') {
 	$line.='<option></option>'.
@@ -1768,8 +1787,8 @@ sub gradeBox {
 
 	#&mt('<td><b>Part:</b></td><td>[_1]</td><td><b>Points:</b></td><td>[_2]</td><td>or</td><td>[_3]</td>',$display_part,$radio,$line);
     $result .= 
-	    '<td><b>'.&mt('Part:').'</b></td><td>'.$display_part.'</td><td><b>'.&mt('Points:').'</b></td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>';
-    $result.='</tr></table>'."\n";
+	    '<td>'.$display_part.'</td><td>'.$radio.'</td><td>'.&mt('or').'</td><td>'.$line.'</td>';
+    $result.=&Apache::loncommon::end_data_table_row();
     $result.='<input type="hidden" name="stores'.$counter.'_'.$partid.'" value="" />'."\n".
 	'<input type="hidden" name="oldpts'.$counter.'_'.$partid.'" value="'.$score.'" />'."\n".
 	'<input type="hidden" name="solved'.$counter.'_'.$partid.'" value="'.
@@ -2281,11 +2300,12 @@ KEYWORDS
     my @partlist;
     my @gradePartRespid;
     my @part_response_id = &flatten_responseType($responseType);
-    $request->print('<div class="LC_grade_assign">'.
-		    
-		    '<div class="LC_grade_assign_header">'.
-		    &mt('Assign Grades').'</div>'.
-		    '<div class="LC_grade_assign_body">');
+    $request->print(
+        '<div class="LC_grade_assign">'
+       .'<div class="LC_grade_assign_header">'
+       .&mt('Assign Grades').'</div>'
+    );
+    $request->print(&gradeBox_start()); # <div class="LC_grade_assign_body">
     foreach my $part_response_id (@part_response_id) {
     	my ($partid,$respid) = @{ $part_response_id };
 	my $part_resp = join('_',@{ $part_response_id });
@@ -2297,7 +2317,8 @@ KEYWORDS
 	push(@gradePartRespid,$partid.'.'.$respid);
 	$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record));
     }
-    $request->print('</div></div>');
+    $request->print(&gradeBox_end()); # </div>
+    $request->print('</div>');
 
     $request->print('<div class="LC_grade_info_links">');
     if ($perm{'vgr'}) {
@@ -4485,11 +4506,13 @@ sub displayPage {
  
 	    }
 	    if (&canmodify($usec)) {
+            $studentTable.=&gradeBox_start();
 		foreach my $partid (@{$parts}) {
 		    $studentTable.=&gradeBox($request,$symbx,$uname,$udom,$question,$partid,\%record);
 		    $studentTable.='<input type="hidden" name="q_'.$question.'" value="'.$partid.'" />'."\n";
 		    $question++;
 		}
+            $studentTable.=&gradeBox_end();
 		$prob++;
 	    }
 	    $studentTable.='</td></tr>';
@@ -7597,8 +7620,15 @@ sub scantron_process_students {
     my (%grader_partids_by_symb,%grader_randomlists_by_symb);
     &graders_resources_pass(\@resources,\%grader_partids_by_symb,
                             \%grader_randomlists_by_symb);
+    my $resource_error;
     foreach my $resource (@resources) {
-        my $ressymb = $resource->symb();
+        my $ressymb;
+        if (ref($resource)) {
+            $ressymb = $resource->symb();
+        } else {
+            $resource_error = 1;
+            last;
+        }
         my ($analysis,$parts) =
             &scantron_partids_tograde($resource,$env{'request.course.id'},
                                       $env{'user.name'},$env{'user.domain'},1);
@@ -7610,6 +7640,10 @@ sub scantron_process_students {
             }
         }
     }
+    if ($resource_error) {
+        $r->print(&navmap_errormsg());
+        return '';
+    }
 
     my ($uname,$udom);
     my $result= <<SCANTRONFORM;
@@ -7680,9 +7714,15 @@ SCANTRONFORM
  	}
   	($uname,$udom)=split(/:/,$uname);
 
-        my %partids_by_symb;
+        my (%partids_by_symb,$res_error);
         foreach my $resource (@resources) {
-            my $ressymb = $resource->symb();
+            my $ressymb;
+            if (ref($resource)) {
+                $ressymb = $resource->symb();
+            } else {
+                $res_error = 1;
+                last;
+            }
             if ((exists($grader_randomlists_by_symb{$ressymb})) ||
                 (ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) {
                 my ($analysis,$parts) =
@@ -7693,6 +7733,12 @@ SCANTRONFORM
             }
         }
 
+        if ($res_error) {
+            &scantron_add_delay(\@delayqueue,$line,
+                                'An error occurred while grading student '.$uname,2);
+            next;
+        }
+
 	&Apache::lonxml::clear_problem_counter();
   	&Apache::lonnet::appenv($scan_record);
 
@@ -8475,7 +8521,7 @@ sub grading_menu {
                     		icon => 'addClickerInfoFile.png',
                     		linktitle => 'Specify a file containing the clicker information for this resource.'
                 	    },
-                	    {	linktext => 'Grade/Manage/Review Bubblesheet Forms',
+                	    {	linktext => 'Grade/Manage/Review Bubblesheets',
                     		url => $url4,
                     		permission => 'F',
                     		icon => 'stat.png',