--- loncom/homework/grades.pm	2013/08/09 14:56:17	1.700
+++ loncom/homework/grades.pm	2014/01/15 14:46:26	1.712
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.700 2013/08/09 14:56:17 bisitz Exp $
+# $Id: grades.pm,v 1.712 2014/01/15 14:46:26 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1084,7 +1084,7 @@ LISTJAVASCRIPT
 	    if ($submitonly eq 'graded'   ) { $submissions = 'ungraded submissions'; }
 	    if ($submitonly eq 'queued'   ) { $submissions = 'queued submissions'; }
 	    $gradeTable='<br />&nbsp;<span class="LC_warning">'.
-		&mt('No '.$submissions.' found for this resource for any students. ([_1] students checked for '.$submissions.')',
+		&mt('No '.$submissions.' found for this resource for any students. ([quant,_1,student] checked for '.$submissions.')',
 		    $num_students).
 		'</span><br />';
 	}
@@ -1942,9 +1942,12 @@ sub submission {
     if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; }
 
     if (!&canview($usec)) {
-	$request->print('<span class="LC_warning">Unable to view requested student.('.
-			$uname.':'.$udom.' in section '.$usec.' in course id '.
-			$env{'request.course.id'}.')</span>');
+        $request->print(
+            '<span class="LC_warning">'.
+            &mt('Unable to view requested student.'.
+            ' '.&mt('([_1] in section [_2] in course id [_3])',
+                        $uname.':'.$udom,$usec,$env{'request.course.id'}).
+            '</span>');
 	return;
     }
 
@@ -1976,7 +1979,7 @@ sub submission {
 	    $request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode));
 	}
 
-	# kwclr is the only variable that is guaranteed to be non blank 
+	# kwclr is the only variable that is guaranteed not to be blank 
         # if this subroutine has been called once.
 	my %keyhash = ();
 #	if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') {
@@ -2080,7 +2083,7 @@ KEYWORDS
     if ($perm{'vgr'}) {
         $request->print(
             &Apache::loncommon::track_student_link(
-                &mt('View recent activity'),
+                'View recent activity',
                 $uname,$udom,'check')
            .' '
         );
@@ -2139,146 +2142,146 @@ KEYWORDS
 	$result.=$sub_result;
     }
     $request->print($result."\n");
-
+    
     # print student answer/submission
     # Options are (1) Handgraded submission only
     #             (2) Last submission, includes submission that is not handgraded 
     #                  (for multi-response type part)
     #             (3) Last submission plus the parts info
     #             (4) The whole record for this student
-    if ($env{'form.lastSub'} =~ /^(lastonly|hdgrade)$/) {
-	my ($string,$timestamp)= &get_last_submission(\%record);
+    
+    my ($string,$timestamp)= &get_last_submission(\%record);
 	
-	my $lastsubonly;
+    my $lastsubonly;
 
-        if ($$timestamp eq '') {
-            $lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; 
-        } else {
-            $lastsubonly =
-                '<div class="LC_grade_submissions_body">'
-               .'<b>'.&mt('Date Submitted:').'</b> '.$$timestamp."\n";
-
-	    my %seenparts;
-	    my @part_response_id = &flatten_responseType($responseType);
-	    foreach my $part (@part_response_id) {
-		next if ($env{'form.lastSub'} eq 'hdgrade' 
+    if ($$timestamp eq '') {
+        $lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; 
+    } else {
+        $lastsubonly =
+            '<div class="LC_grade_submissions_body">'
+           .'<b>'.&mt('Date Submitted:').'</b> '.$$timestamp."\n";
+
+	my %seenparts;
+	my @part_response_id = &flatten_responseType($responseType);
+	foreach my $part (@part_response_id) {
+	    next if ($env{'form.lastSub'} eq 'hdgrade' 
 			 && $$handgrade{$$part[0].'_'.$$part[1]} ne 'yes');
 
-		my ($partid,$respid) = @{ $part };
-		my $display_part=&get_display_part($partid,$symb);
-		if ($env{"form.$uname:$udom:$partid:submitted_by"}) {
-		    if (exists($seenparts{$partid})) { next; }
-		    $seenparts{$partid}=1;
-                    $request->print(
-                        '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
-                        ' <b>'.&mt('Collaborative submission by: [_1]',
-                                   '<a href="javascript:viewSubmitter(\''.
-                                   $env{"form.$uname:$udom:$partid:submitted_by"}.
-                                   '\');" target="_self">'.
-                                   $$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>').
-                        '<br />');
-		    next;
-		}
-		my $responsetype = $responseType->{$partid}->{$respid};
-		if (!exists($record{"resource.$partid.$respid.submission"})) {
-                    $lastsubonly.="\n".'<div class="LC_grade_submission_part">'.
-                        '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
-                        ' <span class="LC_internal_info">'.
-                        '('.&mt('Response ID: [_1]',$respid).')'.
-                        '</span>&nbsp; &nbsp;'.
-			'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>';
-		    next;
-		}
-		foreach my $submission (@$string) {
-		    my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/);
-		    if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; }
-		    my ($ressub,$hide,$subval) = split(/:/,$submission,3);
-		    # Similarity check
-		    my $similar='';
-                    my ($type,$trial,$rndseed);
-                    if ($hide eq 'rand') {
-                        $type = 'randomizetry';
-                        $trial = $record{"resource.$partid.tries"};
-                        $rndseed = $record{"resource.$partid.rndseed"};
-                    }
-		    if($env{'form.checkPlag'}){
-			my ($oname,$odom,$ocrsid,$oessay,$osim)=
-			    &most_similar($uname,$udom,$symb,$subval);
-			if ($osim) {
-			    $osim=int($osim*100.0);
-			    my %old_course_desc = 
-				&Apache::lonnet::coursedescription($ocrsid,
-								   {'one_time' => 1});
-
-                            if ($hide eq 'anon') {
-                                $similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'.
-                                         &mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />';
-                            } else {
-			        $similar="<hr /><h3><span class=\"LC_warning\">".
-				    &mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])',
-				        $osim,
-				        &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')',
+	    my ($partid,$respid) = @{ $part };
+	    my $display_part=&get_display_part($partid,$symb);
+	    if ($env{"form.$uname:$udom:$partid:submitted_by"}) {
+		if (exists($seenparts{$partid})) { next; }
+		$seenparts{$partid}=1;
+                $request->print(
+                    '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
+                    ' <b>'.&mt('Collaborative submission by: [_1]',
+                               '<a href="javascript:viewSubmitter(\''.
+                               $env{"form.$uname:$udom:$partid:submitted_by"}.
+                               '\');" target="_self">'.
+                               $$fullname{$env{"form.$uname:$udom:$partid:submitted_by"}}.'</a>').
+                    '<br />');
+		next;
+		}
+	    my $responsetype = $responseType->{$partid}->{$respid};
+	    if (!exists($record{"resource.$partid.$respid.submission"})) {
+                $lastsubonly.="\n".'<div class="LC_grade_submission_part">'.
+                    '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
+                    ' <span class="LC_internal_info">'.
+                    '('.&mt('Response ID: [_1]',$respid).')'.
+                    '</span>&nbsp; &nbsp;'.
+	       	    '<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span><br /><br /></div>';
+		next;
+	    }
+	    foreach my $submission (@$string) {
+		my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/);
+		if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; }
+		my ($ressub,$hide,$subval) = split(/:/,$submission,3);
+		# Similarity check
+                my $similar='';
+                my ($type,$trial,$rndseed);
+                if ($hide eq 'rand') {
+                    $type = 'randomizetry';
+                    $trial = $record{"resource.$partid.tries"};
+                    $rndseed = $record{"resource.$partid.rndseed"};
+                }
+	        if ($env{'form.checkPlag'}) {
+    		    my ($oname,$odom,$ocrsid,$oessay,$osim)=
+		        &most_similar($uname,$udom,$symb,$subval);
+		    if ($osim) {
+			$osim=int($osim*100.0);
+			my %old_course_desc = 
+			    &Apache::lonnet::coursedescription($ocrsid,
+							{'one_time' => 1});
+
+                        if ($hide eq 'anon') {
+                            $similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'.
+                                     &mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />';
+                        } else {
+			    $similar="<hr /><h3><span class=\"LC_warning\">".
+				&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])',
+				    $osim,
+				    &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')',
 				        $old_course_desc{'description'},
 				        $old_course_desc{'num'},
 				        $old_course_desc{'domain'}).
 				    '</span></h3><blockquote><i>'.
 				    &keywords_highlight($oessay).
 				    '</i></blockquote><hr />';
-                            }
-			}
-		    }
-		    my $order=&get_order($partid,$respid,$symb,$uname,$udom,
-                                         undef,$type,$trial,$rndseed);
-		    if ($env{'form.lastSub'} eq 'lastonly' || 
-			($env{'form.lastSub'} eq 'hdgrade' && 
+                        }
+	            }
+		}
+		my $order=&get_order($partid,$respid,$symb,$uname,$udom,
+                                     undef,$type,$trial,$rndseed);
+                if ($env{'form.lastSub'} eq 'lastonly' || $env{'form.lastSub'} eq 'datesub' || $env{'form.lastSub'} =~ /^(last|all)$/ || ($env{'form.lastSub'} eq 'hdgrade' && 
 			 $$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) {
-			my $display_part=&get_display_part($partid,$symb);
-                        $lastsubonly.='<div class="LC_grade_submission_part">'.
-                            '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
-                            ' <span class="LC_internal_info">'.
-                            '('.&mt('Response ID: [_1]',$respid).')'.
-                            '</span>&nbsp; &nbsp;';
-			my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record);
-
-			if (@$files) {
-                            if ($hide eq 'anon') {
-                                $lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files}));
-                            } else {
-                                $lastsubonly.='<br /><br />'.'<b>'.&mt('Submitted Files:').'</b>'
-                                            .'<br /><span class="LC_warning">';
-                                if(@$files == 1) {
-                                    $lastsubonly .= &mt('Like all files provided by users, this file may contain viruses!');
-                                } else {
-                                    $lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!');
-                                }
-                                $lastsubonly .= '</span>';                         
-                                foreach my $file (@$files) {
-                                    &Apache::lonnet::allowuploaded('/adm/grades',$file);
-                                    $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>';
-                                }
-                            }
-			    $lastsubonly.='<br />';
-			}
+		    my $display_part=&get_display_part($partid,$symb);
+                    $lastsubonly.='<div class="LC_grade_submission_part">'.
+                        '<b>'.&mt('Part: [_1]',$display_part).'</b>'.
+                        ' <span class="LC_internal_info">'.
+                        '('.&mt('Response ID: [_1]',$respid).')'.
+                        '</span>&nbsp; &nbsp;';
+		    my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record);
+                        
+		    if (@$files) {
                         if ($hide eq 'anon') {
-                            $lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; 
+                            $lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files}));
                         } else {
-			    $lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'.
-			        &cleanRecord($subval,$responsetype,$symb,$partid,
-					     $respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed);
+                            $lastsubonly.='<br /><br />'.'<b>'.&mt('Submitted Files:').'</b>'
+                                        .'<br /><span class="LC_warning">';
+                            if(@$files == 1) {
+                                $lastsubonly .= &mt('Like all files provided by users, this file may contain viruses!');
+                            } else {
+                                $lastsubonly .= &mt('Like all files provided by users, these files may contain viruses!');
+                            }
+                            $lastsubonly .= '</span>';                         
+                            foreach my $file (@$files) {
+                                &Apache::lonnet::allowuploaded('/adm/grades',$file);
+                                $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" alt="" /> '.$file.'</a>';
+                            }
                         }
-			if ($similar) {$lastsubonly.="<br /><br />$similar\n";}
-			$lastsubonly.='</div>';
-		    }
+			$lastsubonly.='<br />';
+                    }
+                    if ($hide eq 'anon') {
+                        $lastsubonly.='<br /><b>'.&mt('Anonymous Survey').'</b>'; 
+                    } else {
+             	        $lastsubonly.='<br /><b>'.&mt('Submitted Answer:').' </b>'.
+			    &cleanRecord($subval,$responsetype,$symb,$partid,
+					 $respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed);
+                    }
+	            if ($similar) {$lastsubonly.="<br /><br />$similar\n";}
+		    $lastsubonly.='</div>';
 		}
-	    }
-	    $lastsubonly.='</div>'."\n"; # End: LC_grade_submissions_body
+            }
 	}
-	$request->print($lastsubonly);
-   } elsif ($env{'form.lastSub'} eq 'datesub') {
+	$lastsubonly.='</div>'."\n"; # End: LC_grade_submissions_body
+    }
+    $request->print($lastsubonly);
+    if ($env{'form.lastSub'} eq 'datesub') {
         my ($parts,$handgrade,$responseType) = &response_type($symb,\$res_error);
 	$request->print(&displaySubByDates($symb,\%record,$parts,$responseType,$checkIcon,$uname,$udom));
-    } elsif ($env{'form.lastSub'} =~ /^(last|all)$/) {
-	$request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,
+    } 
+    if ($env{'form.lastSub'} =~ /^(last|all)$/) {
+        $request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,
 								 $env{'request.course.id'},
 								 $last,'.submission',
 								 'Apache::grades::keywords_highlight'));
@@ -2546,9 +2549,12 @@ sub show_previous_task_version {
     my ($uname,$udom) = ($env{'form.student'},$env{'form.userdom'});
     my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'});
     if (!&canview($usec)) {
-        $request->print('<span class="LC_warning">Unable to view previous version for requested student.('.
-                        $uname.':'.$udom.' in section '.$usec.' in course id '.
-                        $env{'request.course.id'}.')</span>');
+        $request->print(
+            '<span class="LC_warning">'.
+            &mt('Unable to view previous version for requested student.'.
+            ' '.&mt('([_1] in section [_2] in course id [_3])',
+                    $uname.':'.$udom,$usec,$env{'request.course.id'}).
+            '</span>');
         return;
     }
     my $mode = 'both';
@@ -3595,9 +3601,10 @@ sub viewgrades {
 	    $partid.'" size="4" '.'onchange="javascript:writePoint(\''.
 		$partid.'\','.$weight{$partid}.',\'textval\')" /> /'.
 	    $weight{$partid}.' '.&mt('(problem weight)').'</td>'."\n";
-	$line.= '<td><b>'.&mt('Grade Status').':</b><select name="SELVAL_'.$partid.'"'.
-	    'onchange="javascript:writeRadText(\''.$partid.'\','.
-		$weight{$partid}.')"> '.
+        $line.= '<td><b>'.&mt('Grade Status').':</b>'.
+            '<select name="SELVAL_'.$partid.'" '.
+            'onchange="javascript:writeRadText(\''.$partid.'\','.
+                $weight{$partid}.')"> '.
 	    '<option selected="selected"> </option>'.
 	    '<option value="excused">'.&mt('excused').'</option>'.
 	    '<option value="reset status">'.&mt('reset status').'</option>'.
@@ -4142,11 +4149,12 @@ sub csvupload_fields {
 
 sub csvuploadmap_footer {
     my ($request,$i,$keyfields) =@_;
+    my $buttontext = &mt('Assign Grades');
     $request->print(<<ENDPICK);
 </table>
 <input type="hidden" name="nfields" value="$i" />
 <input type="hidden" name="keyfields" value="$keyfields" />
-<input type="button" onclick="javascript:verify(this.form)" value="Assign Grades" /><br />
+<input type="button" onclick="javascript:verify(this.form)" value="$buttontext" /><br />
 </form>
 ENDPICK
 }
@@ -4267,7 +4275,7 @@ ENDPICK
     }
     # FIXME do a check for any duplicated user ids...
     # FIXME do a check for any invalid user ids?...
-    $request->print('<input type="submit" value="Assign Grades" /><br />
+    $request->print('<input type="submit" value="'.&mt('Assign Grades').'" /><br />
 <hr /></form>'."\n");
     return '';
 }
@@ -4611,8 +4619,12 @@ sub displayPage {
     &Apache::lonnet::clear_EXT_cache_status();
 
     if (!&canview($usec)) {
-	$request->print('<span class="LC_warning">'.&mt('Unable to view requested student. ([_1])',$env{'form.student'}).'</span>');
-	return;
+        $request->print(
+            '<span class="LC_warning">'.
+            &mt('Unable to view requested student. ([_1])',
+                    $env{'form.student'}).
+            '</span>');
+        return;
     }
     my $result='<h3><span class="LC_info">&nbsp;'.$env{'form.title'}.'</span></h3>';
     $result.='<h3>&nbsp;'.&mt('Student: [_1]',&nameUserString(undef,$$fullname{$env{'form.student'}},$uname,$udom)).
@@ -5085,7 +5097,7 @@ like.
 Next each scanline is checked for any errors of either 'missing
 bubbles' (it's an error because it may have been mis-scanned
 because too light bubbling), 'double bubble' (each bubble line should
-have no more that one letter picked), invalid or duplicated CODE,
+have no more than one letter picked), invalid or duplicated CODE,
 invalid student/employee ID
 
 If the CODE option is used that determines the randomization of the
@@ -5583,7 +5595,7 @@ sub scantron_selectphase {
 
 =item get_scantron_config
 
-   Parse and return the scantron configuration line selected as a
+   Parse and return the bubblesheet configuration line selected as a
    hash of configuration file fields.
 
  Arguments:
@@ -5867,12 +5879,12 @@ sub digits_to_letters {
 
 =item scantron_parse_scanline
 
-  Decodes a scanline from the selected scantron file
+  Decodes a scanline from the selected bubblesheet file
 
  Arguments:
-    line             - The text of the scantron file line to process
+    line             - The text of the bubblesheet file line to process
     whichline        - Line number
-    scantron_config  - Hash describing the format of the scantron lines.
+    scantron_config  - Hash describing the format of the bubblesheet lines.
     scan_data        - Hash of extra information about the scanline
                        (see scantron_getfile for more information)
     just_header      - True if should not process question answers but only
@@ -6439,7 +6451,11 @@ sub scantron_process_corrections {
 	}
     }
     if ($err) {
-	$r->print("<span class=\"LC_warning\">Unable to accept last correction, an error occurred :$errmsg:</span>");
+        $r->print(
+            '<p class="LC_error">'
+           .&mt('Unable to accept last correction, an error occurred: [_1]',
+                $errmsg)
+           .'</p>');
     } else {
 	&scantron_put_line($scanlines,$scan_data,$which,$line,$skip);
 	&scantron_putfile($scanlines,$scan_data);
@@ -6575,7 +6591,7 @@ sub scantron_warning_screen {
     return ('
 <p>
 <span class="LC_warning">
-'.&mt('Please double check the information below before clicking on \'[_1]\'',&mt($button_text)).'</span>
+'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'</span>
 </p>
 <table>
 <tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr>
@@ -6687,7 +6703,7 @@ sub scantron_validate_file {
     if (!$symb) {return '';}
     my $default_form_data=&defaultFormData($symb);
     
-    # do the detection of only doing skipped records first befroe we delete
+    # do the detection of only doing skipped records first before we delete
     # them when doing the corrections reset
     if ($env{'form.scantron_options_redo'} ne 'redo_skipped_ready') {
 	&reset_skipping_status();
@@ -8443,11 +8459,11 @@ SCANTRONFORM
                               &Apache::loncommon::end_data_table_header_row()."\n".
                               &Apache::loncommon::start_data_table_row().
                               '<td>'.&mt('Bubblesheet').'</td>'.
-                              '<td><span class="LC_nobreak"><tt>'.$studentdata.'</tt></span></td>'.
+                              '<td><span class="LC_nobreak" style="white-space: pre;"><tt>'.$studentdata.'</tt></span></td>'.
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::start_data_table_row().
                               '<td>'.&mt('Stored submissions').'</td>'.
-                              '<td><span class="LC_nobreak"><tt>'.$studentrecord.'</tt></span></td>'."\n".
+                              '<td><span class="LC_nobreak" style="white-space: pre;"><tt>'.$studentrecord.'</tt></span></td>'."\n".
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::end_data_table().'</p>');
                 } else {
@@ -8682,23 +8698,30 @@ sub scantron_upload_scantron_data_save {
     }
     my %coursedata=&Apache::lonnet::coursedescription($env{'form.domainid'}.'_'.$env{'form.courseid'});
     my $uploadedfile;
-    $r->print('<h3>'.&mt("Uploading file to [_1]",$coursedata{'description'}).'</h3>');
+    $r->print('<p>'.&mt('Uploading file to [_1]','"'.$coursedata{'description'}.'"').'</p>');
     if (length($env{'form.upfile'}) < 2) {
-        $r->print(&mt('[_1]Error:[_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.','<span class="LC_error">','</span>','<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'));
+        $r->print(
+            &Apache::lonhtmlcommon::confirm_success(
+                &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.',
+                        '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1));
     } else {
         my $result = 
             &Apache::lonnet::userfileupload('upfile','','scantron','','','',
                                             $env{'form.courseid'},$env{'form.domainid'});
-	if ($result =~ m{^/uploaded/}) {
-	    $r->print(&mt('[_1]Success:[_2] Successfully uploaded [_3] bytes of data into location: [_4]',
-                          '<span class="LC_success">','</span>',(length($env{'form.upfile'})-1),
-			  '<span class="LC_filename">'.$result.'</span>'));
+        if ($result =~ m{^/uploaded/}) {
+            $r->print(
+                &Apache::lonhtmlcommon::confirm_success(&mt('Upload successful')).'<br />'.
+                &mt('Uploaded [_1] bytes of data into location: [_2]',
+                        (length($env{'form.upfile'})-1),
+                        '<span class="LC_filename">'.$result.'</span>'));
             ($uploadedfile) = ($result =~ m{/([^/]+)$});
             $r->print(&validate_uploaded_scantron_file($env{'form.domainid'},
                                                        $env{'form.courseid'},$uploadedfile));
-	} else {
-	    $r->print(&mt('[_1]Error:[_2] An error ([_3]) occurred when attempting to upload the file, [_4]',
-                          '<span class="LC_error">','</span>',$result,
+        } else {
+            $r->print(
+                &Apache::lonhtmlcommon::confirm_success(&mt('Upload failed'),1).'<br />'.
+                    &mt('An error ([_1]) occurred when attempting to upload the file: [_2]',
+                          $result,
 			  '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'));
 	}
     }
@@ -8720,7 +8743,7 @@ sub validate_uploaded_scantron_file {
     my $output;
     if (@lines) {
         my (%counts,$max_match_format);
-        my ($max_match_count,$max_match_pct) = (0,0);
+        my ($found_match_count,$max_match_count,$max_match_pct) = (0,0,0);
         my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cname);
         my %idmap = &username_to_idmap($classlist);
         foreach my $key (keys(%idmap)) {
@@ -8763,6 +8786,7 @@ sub validate_uploaded_scantron_file {
                 if (($max_match_format eq '') || ($percent_match > $max_match_pct)) {
                     $max_match_pct = $percent_match;
                     $max_match_format = $key;
+                    $found_match_count = $counts{$key}{'found'};
                     $max_match_count = $counts{$key}{'total'};
                 }
             }
@@ -8781,17 +8805,40 @@ sub validate_uploaded_scantron_file {
                 }
             }
             my $showpct = sprintf("%.0f",$max_match_pct).'%';
-            $output .= '<br />'.&mt('Comparison of student IDs in the uploaded file with the course roster found matches for [_1] of the [_2] entries in the file (for the format defined for [_3]).','<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs).
-                       '<br />'.&mt('A low percentage of matches results from one of the following:').'<ul>'.
-                       '<li>'.&mt('The file was uploaded to the wrong course').'</li>'.
-                       '<li>'.&mt('The data are not in the format expected for the domain: [_1]',
-                                  '<i>'.$cdom.'</i>').'</li>'.
-                       '<li>'.&mt('Students did not bubble their IDs, or mis-bubbled them').'</li>'.
-                       '<li>'.&mt('The course roster is not up to date').'</li>'.
-                       '</ul>';
+            $output .= '<br />';
+            if ($found_match_count == $max_match_count) {
+                # 100% matching entries
+                $output .= &Apache::lonhtmlcommon::confirm_success(
+                     &mt('Comparison of student IDs: [_1] matching ([quant,_2,entry,entries])',
+                            '<b>'.$showpct.'</b>',$found_match_count)).'<br />'.
+                &mt('Comparison of student IDs in the uploaded file with'.
+                    ' the course roster found matches for [_1] of the [_2] entries'.
+                    ' in the file (for the format defined for [_3]).',
+                        '<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs);
+            } else {
+                # Not all entries matching? -> Show warning and additional info
+                $output .=
+                    &Apache::lonhtmlcommon::confirm_success(
+                        &mt('Comparison of student IDs: [_1] matching ([_2]/[quant,_3,entry,entries])',
+                                '<b>'.$showpct.'</b>',$found_match_count,$max_match_count).'<br />'.
+                        &mt('Not all entries could be matched!'),1).'<br />'.
+                    &mt('Comparison of student IDs in the uploaded file with'.
+                        ' the course roster found matches for [_1] of the [_2] entries'.
+                        ' in the file (for the format defined for [_3]).',
+                            '<b>'.$showpct.'</b>','<b>'.$max_match_count.'</b>',$format_descs).
+                    '<p class="LC_info">'.
+                    &mt('A low percentage of matches results from one of the following:').
+                    '</p><ul>'.
+                    '<li>'.&mt('The file was uploaded to the wrong course.').'</li>'.
+                    '<li>'.&mt('The data is not in the format expected for the domain: [_1]',
+                               '<i>'.$cdom.'</i>').'</li>'.
+                    '<li>'.&mt('Students did not bubble their IDs, or mis-bubbled them').'</li>'.
+                    '<li>'.&mt('The course roster is not up to date.').'</li>'.
+                    '</ul>';
+            }
         }
     } else {
-        $output = '<span class="LC_warning">'.&mt('Uploaded file contained no data').'</span>';
+        $output = '<p class="LC_warning">'.&mt('Uploaded file contained no data').'</p>';
     }
     return $output;
 }
@@ -8826,7 +8873,7 @@ sub scantron_download_scantron_data {
     &Apache::lonnet::allowuploaded('/adm/grades',$skipped);
     $r->print('
     <p>
-	'.&mt('[_1]Original[_2] file as uploaded by the scantron office.',
+	'.&mt('[_1]Original[_2] file as uploaded by the bubblesheet office.',
 	      '<a href="'.$orig.'">','</a>').'
     </p>
     <p>
@@ -8887,7 +8934,7 @@ sub checkscantron_results {
 
     my $count=&get_todo_count($scanlines,$scan_data);
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count);
-    my ($username,$domain,$started,%ordered);
+    my ($username,$domain,$started);
     &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
@@ -9706,16 +9753,18 @@ sub process_clicker_file {
 	    $number++;
 	}
         $result.="</p>\n";
-	if ($number==0) {
-	    $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>';
-	    return $result;
-	}
+        if ($number==0) {
+            $result .=
+                 &Apache::lonhtmlcommon::confirm_success(
+                     &mt('No IDs found to determine correct answer'),1);
+            return $result;
+        }
     }
     if (length($env{'form.upfile'}) < 2) {
-        $result.=&mt('[_1] Error: [_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.',
-		     '<span class="LC_error">',
-		     '</span>',
-		     '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>');
+        $result .=
+            &Apache::lonhtmlcommon::confirm_success(
+                &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.',
+                        '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'),1);
         return $result;
     }