--- loncom/homework/grades.pm	2012/12/18 18:05:48	1.596.2.12.2.12
+++ loncom/homework/grades.pm	2010/06/06 02:40:35	1.635
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.596.2.12.2.12 2012/12/18 18:05:48 raeburn Exp $
+# $Id: grades.pm,v 1.635 2010/06/06 02:40:35 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -40,10 +40,10 @@ use Apache::lonhomework;
 use Apache::lonpickcode;
 use Apache::loncoursedata;
 use Apache::lonmsg();
-use Apache::Constants qw(:common :http);
+use Apache::Constants qw(:common);
 use Apache::lonlocal;
 use Apache::lonenc;
-use Apache::bridgetask();
+use Apache::lonstathelpers;
 use String::Similarity;
 use LONCAPA;
 
@@ -52,7 +52,6 @@ use POSIX qw(floor);
 
 
 my %perm=();
-my %old_essays=();
 
 #  These variables are used to recover from ssi errors
 
@@ -98,6 +97,9 @@ sub ssi_print_error {
 
 #
 # --- Retrieve the parts from the metadata file.---
+# Returns an array of everything that the resources stores away
+#
+
 sub getpartlist {
     my ($symb,$errorref) = @_;
 
@@ -122,24 +124,6 @@ sub getpartlist {
     return @stores;
 }
 
-# --- Get the symbolic name of a problem and the url
-sub get_symb {
-    my ($request,$silent) = @_;
-    my $symb=$env{'form.symb'};
-    unless ($symb) {
-        (my $url=$env{'form.url'}) =~ s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
-        $symb = &Apache::lonnet::symbread($url);
-        if ($symb eq '') { 
-	    if (!$silent) {
-                $request->print(&mt("Unable to handle ambiguous references: [_1].",$url));
-	        return ();
-	    }
-        }
-    }
-    &Apache::lonenc::check_decrypt(\$symb);
-    return ($symb);
-}
-
 #--- Format fullname, username:domain if different for display
 #--- Use anywhere where the student names are listed
 sub nameUserString {
@@ -154,6 +138,7 @@ sub nameUserString {
 
 #--- Get the partlist and the response type for a given problem. ---
 #--- Indicate if a response type is coded handgraded or not. ---
+#--- Sets response_error pointer to "1" if navmaps object broken ---
 sub response_type {
     my ($symb,$response_error) = @_;
 
@@ -212,59 +197,9 @@ sub get_display_part {
     return $display;
 }
 
-#--- Show resource title
-#--- and parts and response type
-sub showResourceInfo {
-    my ($symb,$probTitle,$checkboxes,$res_error) = @_;
-    my $result = '<h3>'.&mt('Current Resource').': '.$probTitle.'</h3>'."\n";
-    my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error);
-    if (ref($res_error)) {
-        if ($$res_error) {
-            return;
-        }
-    }
-    $result.=&Apache::loncommon::start_data_table()
-            .&Apache::loncommon::start_data_table_header_row();
-    if ($checkboxes) {
-        $result.='<th>&nbsp;</th>';
-    }
-    $result.='<th>'.&mt('Problem Part').'</th>'
-            .'<th>'.&mt('Res. ID').'</th>'
-            .'<th>'.&mt('Type').'</th>'
-            .&Apache::loncommon::end_data_table_header_row();
-    my %resptype = ();
-    my $hdgrade='no';
-    my %partsseen;
-    foreach my $partID (sort(keys(%$responseType))) {
-        foreach my $resID (sort(keys(%{ $responseType->{$partID} }))) {
-            my $handgrade=$$handgrade{$partID.'_'.$resID};
-            my $responsetype = $responseType->{$partID}->{$resID};
-            $hdgrade = $handgrade if ($handgrade eq 'yes');
-            $result.=&Apache::loncommon::start_data_table_row();
-            if ($checkboxes) {
-                if (exists($partsseen{$partID})) {
-                    $result.="<td>&nbsp;</td>";
-                } else {
-                    $result.="<td><input type='checkbox' name='vPart' value='$partID' checked='checked' /></td>";
-                }
-                $partsseen{$partID}=1;
-            }
-            my $display_part=&get_display_part($partID,$symb);
-            $result.='<td>'.$display_part.'</td>'
-                    .'<td>'.'<span class="LC_internal_info">'.$resID.'</span></td>'
-                    .'<td>'.&mt($responsetype).'</td>'
-#                   .'<td><b>'.&mt('Handgrade: [_1]',$handgrade).'</b></td>'
-                    .&Apache::loncommon::end_data_table_row();
-        }
-    }
-    $result.=&Apache::loncommon::end_data_table();
-    return $result,$responseType,$hdgrade,$partlist,$handgrade;
-}
-
 sub reset_caches {
     &reset_analyze_cache();
     &reset_perm();
-    &reset_old_essays();
 }
 
 {
@@ -277,13 +212,8 @@ sub reset_caches {
     }
 
     sub get_analyze {
-	my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed,$bubbles_per_row)=@_;
+	my ($symb,$uname,$udom,$no_increment,$add_to_hash)=@_;
 	my $key = "$symb\0$uname\0$udom";
-        if ($type eq 'randomizetry') {
-            if ($trial ne '') {
-                $key .= "\0".$trial;
-            }
-        }
 	if (exists($analyze_cache{$key})) {
             my $getupdate = 0;
             if (ref($add_to_hash) eq 'HASH') {
@@ -311,18 +241,9 @@ sub reset_caches {
                     'grade_courseid'    =>  $env{'request.course.id'},
                     'grade_username'    => $uname,
                     'grade_noincrement' => $no_increment);
-        if ($bubbles_per_row ne '') {
-            $form{'bubbles_per_row'} = $bubbles_per_row;
-        }
-        if ($type eq 'randomizetry') {
-            $form{'grade_questiontype'} = $type;
-            if ($rndseed ne '') {
-                $form{'grade_rndseed'} = $rndseed;
-            }
-        }
         if (ref($add_to_hash)) {
             %form = (%form,%{$add_to_hash});
-        }
+        } 
 	my $subresult=&ssi_with_retries($url, $ssi_retries,%form);
 	(undef,$subresult)=split(/_HASH_REF__/,$subresult,2);
 	my %analyze=&Apache::lonnet::str2hash($subresult);
@@ -335,15 +256,15 @@ sub reset_caches {
     }
 
     sub get_order {
-	my ($partid,$respid,$symb,$uname,$udom,$no_increment,$type,$trial,$rndseed)=@_;
-	my $analyze = &get_analyze($symb,$uname,$udom,$no_increment,undef,$type,$trial,$rndseed);
+	my ($partid,$respid,$symb,$uname,$udom,$no_increment)=@_;
+	my $analyze = &get_analyze($symb,$uname,$udom,$no_increment);
 	return $analyze->{"$partid.$respid.shown"};
     }
 
     sub get_radiobutton_correct_foil {
-	my ($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed)=@_;
-	my $analyze = &get_analyze($symb,$uname,$udom,undef,undef,$type,$trial,$rndseed);
-        my $foils = &get_order($partid,$respid,$symb,$uname,$udom,undef,$type,$trial,$rndseed);
+	my ($partid,$respid,$symb,$uname,$udom)=@_;
+	my $analyze = &get_analyze($symb,$uname,$udom);
+        my $foils = &get_order($partid,$respid,$symb,$uname,$udom);
         if (ref($foils) eq 'ARRAY') {
 	    foreach my $foil (@{$foils}) {
 	        if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') {
@@ -354,7 +275,7 @@ sub reset_caches {
     }
 
     sub scantron_partids_tograde {
-        my ($resource,$cid,$uname,$udom,$check_for_randomlist,$bubbles_per_row) = @_;
+        my ($resource,$cid,$uname,$udom,$check_for_randomlist) = @_;
         my (%analysis,@parts);
         if (ref($resource)) {
             my $symb = $resource->symb();
@@ -362,9 +283,7 @@ sub reset_caches {
             if ($check_for_randomlist) {
                 $add_to_form = { 'check_parts_withrandomlist' => 1,};
             }
-            my $analyze =
-                &get_analyze($symb,$uname,$udom,undef,$add_to_form,
-                             undef,undef,undef,$bubbles_per_row);
+            my $analyze = &get_analyze($symb,$uname,$udom,undef,$add_to_form);
             if (ref($analyze) eq 'HASH') {
                 %analysis = %{$analyze};
             }
@@ -387,7 +306,7 @@ sub reset_caches {
 #        response types only.
 sub cleanRecord {
     my ($answer,$response,$symb,$partid,$respid,$record,$order,$version,
-	$uname,$udom,$type,$trial,$rndseed) = @_;
+	$uname,$udom) = @_;
     my $grayFont = '<span class="LC_internal_info">';
     if ($response =~ /^(option|rank)$/) {
 	my %answer=&Apache::lonnet::str2hash($answer);
@@ -404,7 +323,7 @@ sub cleanRecord {
 	return '<blockquote><table border="1">'.
 	    '<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'.
 	    '<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'.
-	    $bottomrow.'</tr></table></blockquote>';
+	    $grayFont.$bottomrow.'</tr>'.'</table></blockquote>';
     } elsif ($response eq 'match') {
 	my %answer=&Apache::lonnet::str2hash($answer);
 	my %grading=&Apache::lonnet::str2hash($record->{$version."resource.$partid.$respid.submissiongrading"});
@@ -426,12 +345,12 @@ sub cleanRecord {
 	    '<tr valign="top"><td>'.$grayFont.&mt('Item ID').'</span></td>'.
 	    $middlerow.'</tr>'.
 	    '<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'.
-	    $bottomrow.'</tr></table></blockquote>';
+	    $bottomrow.'</tr>'.'</table></blockquote>';
     } elsif ($response eq 'radiobutton') {
 	my %answer=&Apache::lonnet::str2hash($answer);
 	my ($toprow,$bottomrow);
 	my $correct = 
-	    &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed);
+	    &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom);
 	foreach my $foil (@$order) {
 	    if (exists($answer{$foil})) {
 		if ($foil eq $correct) {
@@ -447,7 +366,7 @@ sub cleanRecord {
 	return '<blockquote><table border="1">'.
 	    '<tr valign="top"><td>'.&mt('Answer').'</td>'.$toprow.'</tr>'.
 	    '<tr valign="top"><td>'.$grayFont.&mt('Option ID').'</span></td>'.
-	    $bottomrow.'</tr></table></blockquote>';
+	    $bottomrow.'</tr>'.'</table></blockquote>';
     } elsif ($response eq 'essay') {
 	if (! exists ($env{'form.'.$symb})) {
 	    my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade',
@@ -509,8 +428,7 @@ sub cleanRecord {
 #-- A couple of common js functions
 sub commonJSfunctions {
     my $request = shift;
-    $request->print(<<COMMONJSFUNCTIONS);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<COMMONJSFUNCTIONS));
     function radioSelection(radioButton) {
 	var selection=null;
 	if (radioButton.length > 1) {
@@ -538,7 +456,6 @@ sub commonJSfunctions {
 	    return selectOne.value;
 	}
     }
-</script>
 COMMONJSFUNCTIONS
 }
 
@@ -693,17 +610,15 @@ sub student_gradeStatus {
 sub jscriptNform {
     my ($symb) = @_;
     my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
-    my $jscript='<script type="text/javascript" language="javascript">'."\n".
+    my $jscript= &Apache::lonhtmlcommon::scripttag(
 	'    function viewOneStudent(user,domain) {'."\n".
 	'	document.onestudent.student.value = user;'."\n".
 	'	document.onestudent.userdom.value = domain;'."\n".
 	'	document.onestudent.submit();'."\n".
 	'    }'."\n".
-	'</script>'."\n";
+	"\n");
     $jscript.= '<form action="/adm/grades" method="post" name="onestudent">'."\n".
 	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n".
-	'<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n".
 	'<input type="hidden" name="Status"  value="'.$stu_status.'" />'."\n".
 	'<input type="hidden" name="command" value="submission" />'."\n".
 	'<input type="hidden" name="student" value="" />'."\n".
@@ -748,11 +663,7 @@ sub compute_points {
 #
 
 sub most_similar {
-    my ($uname,$udom,$symb,$uessay)=@_;
-
-    unless ($symb) { return ''; }
-
-    unless (ref($old_essays{$symb}) eq 'HASH') { return ''; }
+    my ($uname,$udom,$uessay,$old_essays)=@_;
 
 # ignore spaces and punctuation
 
@@ -769,11 +680,11 @@ sub most_similar {
     my $scrsid='';
     my $sessay='';
 # go through all essays ...
-    foreach my $tkey (keys(%{$old_essays{$symb}})) {
+    foreach my $tkey (keys(%$old_essays)) {
 	my ($tname,$tdom,$tcrsid)=map {&unescape($_)} (split(/\./,$tkey));
 # ... except the same student
         next if (($tname eq $uname) && ($tdom eq $udom));
-	my $tessay=$old_essays{$symb}{$tkey};
+	my $tessay=$old_essays->{$tkey};
 	$tessay=~s/\W+/ /gs;
 # String similarity gives up if not even limit
 	my $tsimilar=&String::Similarity::similarity($uessay,$tessay,$limit);
@@ -783,7 +694,7 @@ sub most_similar {
 	    $sname=$tname;
 	    $sdom=$tdom;
 	    $scrsid=$tcrsid;
-	    $sessay=$old_essays{$symb}{$tkey};
+	    $sessay=$old_essays->{$tkey};
 	}
     }
     if ($limit>0.6) {
@@ -797,22 +708,31 @@ sub most_similar {
 
 #------------------------------------ Receipt Verification Routines
 #
+
+sub initialverifyreceipt {
+   my ($request,$symb) = @_;
+   &commonJSfunctions($request);
+   return '<form name="gradingMenu"><input type="submit" value="'.&mt('Verify Receipt Number.').'" />'.
+        &Apache::lonnet::recprefix($env{'request.course.id'}).
+        '-<input type="text" name="receipt" size="4" />'.
+        '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
+        '<input type="hidden" name="command" value="verify" />'.
+        "</form>\n";
+}
+
 #--- Check whether a receipt number is valid.---
 sub verifyreceipt {
-    my $request  = shift;
+    my ($request,$symb)  = @_;
 
     my $courseid = $env{'request.course.id'};
     my $receipt  = &Apache::lonnet::recprefix($courseid).'-'.
 	$env{'form.receipt'};
     $receipt     =~ s/[^\-\d]//g;
-    my ($symb)   = &get_symb($request);
 
     my $title.=
 	'<h3><span class="LC_info">'.
-	&mt('Verifying Receipt No. [_1]',$receipt).
-	'</span></h3>'."\n".
-	'<h4>'.&mt('<b>Resource: </b>[_1]',$env{'form.probTitle'}).
-	'</h4>'."\n";
+	&mt('Verifying Receipt Number [_1]',$receipt).
+	'</span></h3>'."\n";
 
     my ($string,$contents,$matches) = ('','',0);
     my (undef,undef,$fullname) = &getclasslist('all','0');
@@ -882,7 +802,7 @@ sub verifyreceipt {
 	    $contents.
 	    &Apache::loncommon::end_data_table()."\n";
     }
-    return $string.&show_grading_menu_form($symb);
+    return $string;
 }
 
 #--- This is called by a number of programs.
@@ -890,30 +810,25 @@ sub verifyreceipt {
 #--- Also called directly when one clicks on the subm button 
 #    on the problem page.
 sub listStudents {
-    my ($request) = shift;
+    my ($request,$symb,$submitonly) = @_;
 
-    my ($symb) = &get_symb($request);
     my $cdom      = $env{"course.$env{'request.course.id'}.domain"};
     my $cnum      = $env{"course.$env{'request.course.id'}.num"};
     my $getsec    = $env{'form.section'} eq '' ? 'all' : $env{'form.section'};
     my $getgroup  = $env{'form.group'} eq '' ? 'all' : $env{'form.group'};
-    my $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'};
-    my $viewgrade = $env{'form.showgrading'} eq 'yes' ? 'View/Grade/Regrade' : 'View';
-    $env{'form.probTitle'} = $env{'form.probTitle'} eq '' ? 
-	&Apache::lonnet::gettitle($symb) : $env{'form.probTitle'};
-
-    my $result='<h3><span class="LC_info">&nbsp;'
-	.&mt("$viewgrade Submissions for a Student or a Group of Students")
-	.'</span></h3>';
+    unless ($submitonly) {
+       $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'};
+    }
 
-    my ($table,undef,$hdgrade,$partlist,$handgrade) = &showResourceInfo($symb,$env{'form.probTitle'},($env{'form.showgrading'} eq 'yes'));
+    my $result='';
+    my $res_error;
+    my ($partlist,$handgrade,$responseType) = &response_type($symb,\$res_error);
 
     my %lt = &Apache::lonlocal::texthash (
 		'multiple' => 'Please select a student or group of students before clicking on the Next button.',
 		'single'   => 'Please select the student before clicking on the Next button.',
 	     );
-    $request->print(<<LISTJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT));
     function checkSelect(checkBox) {
 	var ctr=0;
 	var sense="";
@@ -942,16 +857,13 @@ sub listStudents {
 	formname.command.value = 'submission';
 	formname.submit();
     }
-</script>
 LISTJAVASCRIPT
 
     &commonJSfunctions($request);
     $request->print($result);
 
-    my $checkhdgrade = ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked="checked"' : '';
-    my $checklastsub = $checkhdgrade eq '' ? 'checked="checked"' : '';
     my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'.
-	"\n".$table;
+	"\n";
 	
     $gradeTable .= &Apache::lonhtmlcommon::start_pick_box();
     $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('View Problem Text'))
@@ -966,22 +878,18 @@ LISTJAVASCRIPT
                   .&Apache::lonhtmlcommon::row_closure();
 
     my $submission_options;
-    if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) {
-	$submission_options.=
-	    '<label><input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> '.&mt('essay part only').' </label>'."\n";
-    }
     my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
     my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status;
     $env{'form.Status'} = $saveStatus;
     $submission_options.=
         '<span class="LC_nobreak">'.
-        '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '.
+        '<label><input type="radio" name="lastSub" value="lastonly" /> '.
         &mt('last submission only').' </label></span>'."\n".
         '<span class="LC_nobreak">'.
         '<label><input type="radio" name="lastSub" value="last" /> '.
         &mt('last submission &amp; parts info').' </label></span>'."\n".
         '<span class="LC_nobreak">'.
-        '<label><input type="radio" name="lastSub" value="datesub" /> '.
+        '<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> '.
         &mt('by dates and submissions').'</label></span>'."\n".
         '<span class="LC_nobreak">'.
         '<label><input type="radio" name="lastSub" value="all" /> '.
@@ -1002,14 +910,10 @@ LISTJAVASCRIPT
     $gradeTable .= 
         &build_section_inputs().
 	'<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".
-	'<input type="hidden" name="handgrade"   value="'.$env{'form.handgrade'}.'" /><br />'."\n".
-	'<input type="hidden" name="showgrading" value="'.$env{'form.showgrading'}.'" /><br />'."\n".
-	'<input type="hidden" name="saveState"   value="'.$env{'form.saveState'}.'" />'."\n".
-	'<input type="hidden" name="probTitle"   value="'.$env{'form.probTitle'}.'" />'."\n".
 	'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
 	'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n";
 
-    if (exists($env{'form.gradingMenu'}) && exists($env{'form.Status'})) {
+    if (exists($env{'form.Status'})) {
 	$gradeTable .= '<input type="hidden" name="Status" value="'.$stu_status.'" />'."\n";
     } else {
         $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Student Status'))
@@ -1024,7 +928,7 @@ LISTJAVASCRIPT
                   .&Apache::lonhtmlcommon::end_pick_box();
 
     $gradeTable .= '<p>'
-                  .&mt('To '.lc($viewgrade)." a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.")."\n"
+                  .&mt("To view/grade/regrade a submission or a group of submissions, click on the check box(es) next to the student's name(s). Then click on the Next button.")."\n"
                   .'<input type="hidden" name="command" value="processGroup" />'
                   .'</p>';
 
@@ -1041,9 +945,7 @@ LISTJAVASCRIPT
     while ($loop < 2) {
 	$gradeTable.='<th>'.&mt('No.').'</th><th>'.&mt('Select').'</th>'.
 	    '<th>'.&nameUserString('header').'&nbsp;'.&mt('Section/Group').'</th>';
-	if ($env{'form.showgrading'} eq 'yes' 
-	    && $submitonly ne 'queued'
-	    && $submitonly ne 'all') {
+	if (($submitonly ne 'queued') && ($submitonly ne 'all')) {
 	    foreach my $part (sort(@$partlist)) {
 		my $display_part=
 		    &get_display_part((split(/_/,$part))[0],$symb);
@@ -1079,9 +981,7 @@ LISTJAVASCRIPT
 	    $status{'gradingqueue'} = $queue_status{'gradingqueue'};
 	}
 
-	if ($env{'form.showgrading'} eq 'yes' 
-	    && $submitonly ne 'queued'
-	    && $submitonly ne 'all') {
+	if (($submitonly ne 'queued') && ($submitonly ne 'all')) {
 	    (%status) =&student_gradeStatus($symb,$udom,$uname,$partlist);
 	    my $submitted = 0;
 	    my $graded = 0;
@@ -1122,7 +1022,7 @@ LISTJAVASCRIPT
 	       &nameUserString(undef,$$fullname{$student},$uname,$udom).
 	       '&nbsp;'.$section.($group ne '' ?'/'.$group:'').'</td>'."\n";
 
-	    if ($env{'form.showgrading'} eq 'yes' && $submitonly ne 'all') {
+	    if ($submitonly ne 'all') {
 		foreach (sort(keys(%status))) {
 		    next if ($_ =~ /^resource.*?submitted_by$/);
 		    $gradeTable.='<td align="center">&nbsp;'.&mt($status{$_}).'&nbsp;</td>'."\n";
@@ -1136,9 +1036,7 @@ LISTJAVASCRIPT
     }
     if ($ctr%2 ==1) {
 	$gradeTable.='<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>';
-	    if ($env{'form.showgrading'} eq 'yes' 
-		&& $submitonly ne 'queued'
-		&& $submitonly ne 'all') {
+	    if (($submitonly ne 'queued') && ($submitonly ne 'all')) {
 		foreach (@$partlist) {
 		    $gradeTable.='<td>&nbsp;</td>';
 		}
@@ -1169,7 +1067,6 @@ LISTJAVASCRIPT
     } elsif ($ctr == 1) {
 	$gradeTable =~ s/type="checkbox"/type="checkbox" checked="checked"/;
     }
-    $gradeTable.=&show_grading_menu_form($symb);
     $request->print($gradeTable);
     return '';
 }
@@ -1178,7 +1075,7 @@ LISTJAVASCRIPT
 
 sub check_script {
     my ($form, $type)=@_;
-    my $chkallscript='<script type="text/javascript">
+    my $chkallscript= &Apache::lonhtmlcommon::scripttag('
     function checkall() {
         for (i=0; i<document.forms.'.$form.'.elements.length; i++) {
             ele = document.forms.'.$form.'.elements[i];
@@ -1209,7 +1106,7 @@ sub check_script {
         }
     }
 
-</script>'."\n";
+'."\n");
     return $chkallscript;
 }
 
@@ -1223,7 +1120,7 @@ sub check_buttons {
 
 #     Displays the submissions for one student or a group of students
 sub processGroup {
-    my ($request)  = shift;
+    my ($request,$symb)  = @_;
     my $ctr        = 0;
     my @stuchecked = &Apache::loncommon::get_env_multiple('form.stuinfo');
     my $total      = scalar(@stuchecked)-1;
@@ -1233,7 +1130,7 @@ sub processGroup {
 	$env{'form.student'}        = $uname;
 	$env{'form.userdom'}        = $udom;
 	$env{'form.fullname'}       = $fullname;
-	&submission($request,$ctr,$total);
+	&submission($request,$ctr,$total,$symb);
 	$ctr++;
     }
     return '';
@@ -1248,8 +1145,7 @@ sub processGroup {
 sub sub_page_js {
     my $request = shift;
 	    my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = ');
-    $request->print(<<SUBJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT));
     function updateRadio(formname,id,weight) {
 	var gradeBox = formname["GD_BOX"+id];
 	var radioButton = formname["RADVAL"+id];
@@ -1371,13 +1267,6 @@ sub sub_page_js {
 	    }
 	    
 	}
-	if (val == "Grade Student") {
-	    formname.showgrading.value = "yes";
-	    if (formname.Status.value == "") {
-		formname.Status.value = "Active";
-	    }
-	    formname.studentNo.value = total;
-	}
 	formname.submit();
     }
 
@@ -1417,7 +1306,6 @@ sub sub_page_js {
 
 	formname.submit();
     }
-</script>
 SUBJAVASCRIPT
 }
 
@@ -1427,8 +1315,8 @@ sub sub_page_kw_js {
     my $iconpath = $request->dir_config('lonIconsURL');
     &commonJSfunctions($request);
 
-    my $inner_js_msg_central=<<INNERJS;
-    <script text="text/javascript">
+    my $inner_js_msg_central= (<<INNERJS);
+<script type="text/javascript">
     function checkInput() {
       opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value);
       var nmsg   = opener.document.SCORE.savemsgN.value;
@@ -1465,11 +1353,11 @@ sub sub_page_kw_js {
       self.close()
 
     }
-    </script>
+</script>
 INNERJS
 
-    my $inner_js_highlight_central=<<INNERJS;
- <script type="text/javascript">
+    my $inner_js_highlight_central= (<<INNERJS);
+<script type="text/javascript">
     function updateChoice(flag) {
       opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr);
       opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize);
@@ -1503,29 +1391,12 @@ INNERJS
 
     my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
     $docopen=~s/^document\.//;
-    my %lt = &Apache::lonlocal::texthash(
-                keyw => 'Keywords list, separated by a space. Add/delete to list if desired.',
-                plse => 'Please select a word or group of words from document and then click this link.',
-                adds => 'Add selection to keyword list? Edit if desired.',
-                comp => 'Compose Message for: ',
-                incl => 'Include',
-                type => 'Type',
-                subj => 'Subject',
-                mesa => 'Message',
-                new  => 'New',
-                save => 'Save',
-                canc => 'Cancel',
-                kehi => 'Keyword Highlight Options',
-                txtc => 'Text Color',
-                font => 'Font Size',
-                fnst => 'Font Style',
-             );
-    $request->print(<<SUBJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    my $alertmsg = &mt('Please select a word or group of words from document and then click this link.');
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<SUBJAVASCRIPT));
 
 //===================== Show list of keywords ====================
   function keywords(formname) {
-    var nret = prompt("$lt{'keyw'}",formname.keywords.value);
+    var nret = prompt("Keywords list, separated by a space. Add/delete to list if desired.",formname.keywords.value);
     if (nret==null) return;
     formname.keywords.value = nret;
 
@@ -1552,10 +1423,10 @@ INNERJS
     else return;
     var cleantxt = txt.replace(new RegExp('([\\f\\n\\r\\t\\v ])+', 'g')," ");
     if (cleantxt=="") {
-	alert("$lt{'plse'}");
+	alert("$alertmsg");
 	return;
     }
-    var nret = prompt("$lt{'adds'}",cleantxt);
+    var nret = prompt("Add selection to keyword list? Edit if desired.",cleantxt);
     if (nret==null) return;
     document.SCORE.keywords.value = document.SCORE.keywords.value+" "+nret;
     if (document.SCORE.keywords.value != "") {
@@ -1619,15 +1490,17 @@ INNERJS
 
   function savedMsgHeader(Nmsg,usrctr,fullname) {
     var height = 70*Nmsg+250;
+    var scrollbar = "no";
     if (height > 600) {
 	height = 600;
+	scrollbar = "yes";
     }
     var xpos = (screen.width-600)/2;
     xpos = (xpos < 0) ? '0' : xpos;
     var ypos = (screen.height-height)/2-30;
     ypos = (ypos < 0) ? '0' : ypos;
 
-    pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars=yes,screenx='+xpos+',screeny='+ypos+',width=700,height='+height);
+    pWin = window.open('', 'MessageCenter', 'resizable=yes,toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height);
     pWin.focus();
     pDoc = pWin.document;
     pDoc.$docopen;
@@ -1635,16 +1508,16 @@ INNERJS
 
     pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">");
     pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">");
-    pDoc.write("<h3><span class=\\"LC_info\\">&nbsp;$lt{'comp'}\"+fullname+\"<\\/span><\\/h3><br /><br />");
+    pDoc.write("<h3><span class=\\"LC_info\\">&nbsp;Compose Message for \"+fullname+\"<\\/span><\\/h3><br /><br />");
 
     pDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">');
     pDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">');
-    pDoc.write("<td><b>$lt{'type'}<\\/b><\\/td><td><b>$lt{'incl'}<\\/b><\\/td><td><b>$lt{'mesa'}<\\/td><\\/tr>");
+    pDoc.write("<td><b>Type<\\/b><\\/td><td><b>Include<\\/b><\\/td><td><b>Message<\\/td><\\/tr>");
 }
     function displaySubject(msg,shwsel) {
     pDoc = pWin.document;
     pDoc.write("<tr bgcolor=\\"#ffffdd\\">");
-    pDoc.write("<td>$lt{'subj'}<\\/td>");
+    pDoc.write("<td>Subject<\\/td>");
     pDoc.write("<td align=\\"center\\"><input name=\\"subchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>");
     pDoc.write("<td><input name=\\"msgsub\\" type=\\"text\\" value=\\""+msg+"\\"size=\\"60\\" maxlength=\\"80\\"><\\/td><\\/tr>");
 }
@@ -1660,7 +1533,7 @@ INNERJS
   function newMsg(newmsg,shwsel) {
     pDoc = pWin.document;
     pDoc.write("<tr bgcolor=\\"#ffffdd\\">");
-    pDoc.write("<td align=\\"center\\">$lt{'new'}<\\/td>");
+    pDoc.write("<td align=\\"center\\">New<\\/td>");
     pDoc.write("<td align=\\"center\\"><input name=\\"newmsgchk\\" type=\\"checkbox\\"" +shwsel+"><\\/td>");
     pDoc.write("<td><textarea name=\\"newmsg\\" cols=\\"60\\" rows=\\"3\\" onchange=\\"javascript:this.form.newmsgchk.checked=true\\" >"+newmsg+"<\\/textarea><\\/td><\\/tr>");
 }
@@ -1669,8 +1542,8 @@ INNERJS
     pDoc = pWin.document;
     pDoc.write("<\\/table>");
     pDoc.write("<\\/td><\\/tr><\\/table>&nbsp;");
-    pDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:checkInput()\\">&nbsp;&nbsp;");
-    pDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />");
+    pDoc.write("<input type=\\"button\\" value=\\"Save\\" onclick=\\"javascript:checkInput()\\">&nbsp;&nbsp;");
+    pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onclick=\\"self.close()\\"><br /><br />");
     pDoc.write("<\\/form>");
     pDoc.write('$end_page_msg_central');
     pDoc.close();
@@ -1720,11 +1593,11 @@ INNERJS
     hDoc.$docopen;
     hDoc.write('$start_page_highlight_central');
     hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">");
-    hDoc.write("<h3><span class=\\"LC_info\\">&nbsp;$lt{'kehi'}<\\/span><\\/h3><br /><br />");
+    hDoc.write("<h3><span class=\\"LC_info\\">&nbsp;Keyword Highlight Options<\\/span><\\/h3><br /><br />");
 
     hDoc.write('<table border="0" width="100%"><tr><td bgcolor="#777777">');
     hDoc.write('<table border="0" width="100%"><tr bgcolor="#DDFFFF">');
-    hDoc.write("<td><b>$lt{'txtc'}<\\/b><\\/td><td><b>$lt{'font'}<\\/b><\\/td><td><b>$lt{'fnst'}<\\/td><\\/tr>");
+    hDoc.write("<td><b>Text Color<\\/b><\\/td><td><b>Font Size<\\/b><\\/td><td><b>Font Style<\\/td><\\/tr>");
   }
 
   function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) { 
@@ -1743,14 +1616,13 @@ INNERJS
     var hDoc = hwdWin.document;
     hDoc.write("<\\/table>");
     hDoc.write("<\\/td><\\/tr><\\/table>&nbsp;");
-    hDoc.write("<input type=\\"button\\" value=\\"$lt{'save'}\\" onclick=\\"javascript:updateChoice(1)\\">&nbsp;&nbsp;");
-    hDoc.write("<input type=\\"button\\" value=\\"$lt{'canc'}\\" onclick=\\"self.close()\\"><br /><br />");
+    hDoc.write("<input type=\\"button\\" value=\\"Save\\" onclick=\\"javascript:updateChoice(1)\\">&nbsp;&nbsp;");
+    hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onclick=\\"self.close()\\"><br /><br />");
     hDoc.write("<\\/form>");
     hDoc.write('$end_page_highlight_central');
     hDoc.close();
   }
 
-</script>
 SUBJAVASCRIPT
 }
 
@@ -1857,10 +1729,10 @@ sub gradeBox {
 }
 
 sub handback_box {
-    my ($symb,$uname,$udom,$counter,$partid,$record,$res_error) = @_;
-    my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error);
+    my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_;
+    my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error_pointer);
     my (@respids);
-    my @part_response_id = &flatten_responseType($responseType);
+     my @part_response_id = &flatten_responseType($responseType);
     foreach my $part_response_id (@part_response_id) {
     	my ($part,$resp) = @{ $part_response_id };
         if ($part eq $partid) {
@@ -1872,10 +1744,9 @@ sub handback_box {
 	my $prefix = $counter.'_'.$partid.'_'.$respid.'_';
 	my $files=&get_submitted_files($udom,$uname,$partid,$respid,$record);
 	next if (!@$files);
-	my $file_counter = 0;
+	my $file_counter = 1;
 	foreach my $file (@$files) {
 	    if ($file =~ /\/portfolio\//) {
-                $file_counter++;
     	        my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|);
     	        my ($name,$version,$ext) = &file_name_version_ext($file_disp);
     	        $file_disp = "$name.$ext";
@@ -1883,14 +1754,11 @@ sub handback_box {
     	        $result.=&mt('Return commented version of [_1] to student.',
     			 '<span class="LC_filename">'.$file_disp.'</span>');
     	        $result.='<input type="file"   name="'.$prefix.'returndoc'.$file_counter.'" />'."\n";
-    	        $result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />'."\n";
+    	        $result.='<input type="hidden" name="'.$prefix.'origdoc'.$file_counter.'" value="'.$file.'" /><br />';
+    	        $result.='('.&mt('File will be uploaded when you click on Save &amp; Next below.').')<br />';
+    	        $file_counter++;
 	    }
 	}
-        if ($file_counter) {
-            $result .= '<input type="hidden" name="'.$prefix.'countreturndoc" value="'.$file_counter.'" />'."\n".
-                       '<span class="LC_info">'.
-                       '('.&mt('File(s) will be uploaded when you click on Save &amp; Next below.',$file_counter).')</span><br /><br />';
-        }
     }
     return $result;    
 }
@@ -1923,27 +1791,14 @@ sub show_problem {
 	$companswer=~s|</form>||g;
 	$companswer=~s|name="submit"|name="would_have_been_submit"|g;
     }
-    my $renderheading = &mt('View of the problem');
-    my $answerheading = &mt('Correct answer');
-    if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
-        my $stu_fullname = $env{'form.fullname'};
-        if ($stu_fullname eq '') {
-            $stu_fullname = &Apache::loncommon::plainname($uname,$udom,'lastname');
-        }
-        my $forwhom = &nameUserString(undef,$stu_fullname,$uname,$udom);
-        if ($forwhom ne '') {
-            $renderheading = &mt('View of the problem for[_1]',$forwhom);
-            $answerheading = &mt('Correct answer for[_1]',$forwhom);
-        }
-    }
     $rendered=
         '<div class="LC_Box">'
-       .'<h3 class="LC_hcell">'.$renderheading.'</h3>'
+       .'<h3 class="LC_hcell">'.&mt('View of the problem').'</h3>'
        .$rendered
        .'</div>';
     $companswer=
         '<div class="LC_Box">'
-       .'<h3 class="LC_hcell">'.$answerheading.'</h3>'
+       .'<h3 class="LC_hcell">'.&mt('Correct answer').'</h3>'
        .$companswer
        .'</div>';
     my $result;
@@ -1979,6 +1834,11 @@ sub files_exist {
 
 sub download_all_link {
     my ($r,$symb) = @_;
+    unless (&files_exist($r, $symb)) {
+       $r->print(&mt('There are currently no submitted documents.'));
+       return;
+    }
+
     my $all_students = 
 	join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo'));
 
@@ -1991,7 +1851,14 @@ sub download_all_link {
                              'cgi.'.$identifier.'.parts' => $parts,});
     $r->print('<a href="/cgi-bin/multidownload.pl?'.$identifier.'">'.
 	      &mt('Download All Submitted Documents').'</a>');
-    return
+    return;
+}
+
+sub submit_download_link {
+    my ($request,$symb) = @_;
+    if (!$symb) { return ''; }
+#FIXME: Figure out which type of problem this is and provide appropriate download
+    &download_all_link($request,$symb);
 }
 
 sub build_section_inputs {
@@ -2009,19 +1876,19 @@ sub build_section_inputs {
 
 # --------------------------- show submissions of a student, option to grade 
 sub submission {
-    my ($request,$counter,$total) = @_;
+    my ($request,$counter,$total,$symb) = @_;
     my ($uname,$udom)     = ($env{'form.student'},$env{'form.userdom'});
     $udom = ($udom eq '' ? $env{'user.domain'} : $udom); #has form.userdom changed for a student?
     my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'});
     $env{'form.fullname'} = &Apache::loncommon::plainname($uname,$udom,'lastname') if $env{'form.fullname'} eq '';
-    my ($symb) = &get_symb($request); 
+
+    my $probtitle=&Apache::lonnet::gettitle($symb); 
     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(&show_grading_menu_form($symb));
 	return;
     }
 
@@ -2033,17 +1900,11 @@ sub submission {
 	'" src="'.$request->dir_config('lonIconsURL').
 	'/check.gif" height="16" border="0" />';
 
+    my %old_essays;
     # header info
     if ($counter == 0) {
 	&sub_page_js($request);
-	&sub_page_kw_js($request) if ($env{'form.handgrade'} eq 'yes');
-	$env{'form.probTitle'} = $env{'form.probTitle'} eq '' ? 
-	    &Apache::lonnet::gettitle($symb) : $env{'form.probTitle'};
-	if ($env{'form.handgrade'} eq 'yes' && &files_exist($request, $symb)) {
-	    &download_all_link($request, $symb);
-	}
-	$request->print('<h3>&nbsp;<span class="LC_info">'.&mt('Submission Record').'</span></h3>'."\n".
-			'<h4>&nbsp;'.&mt('<b>Resource: </b> [_1]',$env{'form.probTitle'}).'</h4>'."\n");
+	&sub_page_kw_js($request);
 
 	# option to display problem, only once else it cause problems 
         # with the form later since the problem has a form.
@@ -2063,7 +1924,8 @@ sub submission {
 	# kwclr is the only variable that is guaranteed to be non blank 
         # if this subroutine has been called once.
 	my %keyhash = ();
-	if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') {
+#	if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') {
+        if (1) {
 	    %keyhash = &Apache::lonnet::dump('nohist_handgrade',
 					     $env{'course.'.$env{'request.course.id'}.'.domain'},
 					     $env{'course.'.$env{'request.course.id'}.'.num'});
@@ -2074,31 +1936,28 @@ sub submission {
 	    $env{'form.kwsize'}   = $keyhash{$loginuser.'_kwsize'} ne '' ? $keyhash{$loginuser.'_kwsize'} : '0';
 	    $env{'form.kwstyle'}  = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : '';
 	    $env{'form.msgsub'}   = $keyhash{$symb.'_subject'} ne '' ? 
-		$keyhash{$symb.'_subject'} : $env{'form.probTitle'};
+		$keyhash{$symb.'_subject'} : $probtitle;
 	    $env{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0';
 	}
 	my $overRideScore = $env{'form.overRideScore'} eq '' ? 'no' : $env{'form.overRideScore'};
 	my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
 	$request->print('<form action="/adm/grades" method="post" name="SCORE" enctype="multipart/form-data">'."\n".
 			'<input type="hidden" name="command"    value="handgrade" />'."\n".
-			'<input type="hidden" name="saveState"  value="'.$env{'form.saveState'}.'" />'."\n".
 			'<input type="hidden" name="Status"     value="'.$stu_status.'" />'."\n".
 			'<input type="hidden" name="overRideScore" value="'.$overRideScore.'" />'."\n".
-			'<input type="hidden" name="probTitle"  value="'.$env{'form.probTitle'}.'" />'."\n".
 			'<input type="hidden" name="refresh"    value="off" />'."\n".
 			'<input type="hidden" name="studentNo"  value="" />'."\n".
 			'<input type="hidden" name="gradeOpt"   value="" />'."\n".
 			'<input type="hidden" name="symb"       value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-			'<input type="hidden" name="showgrading" value="'.$env{'form.showgrading'}.'" />'."\n".
 			'<input type="hidden" name="vProb"      value="'.$env{'form.vProb'}.'" />'."\n".
 			'<input type="hidden" name="vAns"       value="'.$env{'form.vAns'}.'" />'."\n".
 			'<input type="hidden" name="lastSub"    value="'.$env{'form.lastSub'}.'" />'."\n".
 			&build_section_inputs().
 			'<input type="hidden" name="submitonly" value="'.$env{'form.submitonly'}.'" />'."\n".
-			'<input type="hidden" name="handgrade"  value="'.$env{'form.handgrade'}.'" />'."\n".
 			'<input type="hidden" name="NCT"'.
 			' value="'.($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : $total+1).'" />'."\n");
-	if ($env{'form.handgrade'} eq 'yes') {
+#	if ($env{'form.handgrade'} eq 'yes') {
+        if (1) {
 	    $request->print('<input type="hidden" name="keywords" value="'.$env{'form.keywords'}.'" />'."\n".
 			    '<input type="hidden" name="kwclr"    value="'.$env{'form.kwclr'}.'" />'."\n".
 			    '<input type="hidden" name="kwsize"   value="'.$env{'form.kwsize'}.'" />'."\n".
@@ -2123,23 +1982,17 @@ sub submission {
 	}
 	$request->print($prnmsg);
 
-	if ($env{'form.handgrade'} eq 'yes' && $env{'form.showgrading'} eq 'yes') {
-
-            my %lt = &Apache::lonlocal::texthash(
-                          keyw => 'Keyword Options',
-                          list => 'List',
-                          past => 'Paste Selection to List',
-                          high => 'Highlight Attribute',
-                     );
+#	if ($env{'form.handgrade'} eq 'yes') {
+        if (1) {
 #
 # Print out the keyword options line
 #
 	    $request->print(<<KEYWORDS);
-&nbsp;<b>$lt{'keyw'}:</b>&nbsp;
-<a href="javascript:keywords(document.SCORE);" target="_self">$lt{'list'}</a>&nbsp; &nbsp;
+&nbsp;<b>Keyword Options:</b>&nbsp;
+<a href="javascript:keywords(document.SCORE);" target="_self">List</a>&nbsp; &nbsp;
 <a href="#" onmousedown="javascript:getSel(); return false"
- CLASS="page">$lt{'past'}</a>&nbsp; &nbsp;
-<a href="javascript:kwhighlight();" target="_self">$lt{'high'}</a><br /><br />
+ CLASS="page">Paste Selection to List</a>&nbsp; &nbsp;
+<a href="javascript:kwhighlight();" target="_self">Highlight Attribute</a><br /><br />
 KEYWORDS
 #
 # Load the other essays for similarity check
@@ -2148,7 +2001,7 @@ KEYWORDS
 	    my ($adom,$aname,$apath)=($essayurl=~/^($LONCAPA::domain_re)\/($LONCAPA::username_re)\/(.*)$/);
 	    $apath=&escape($apath);
 	    $apath=~s/\W/\_/gs;
-            &init_old_essays($symb,$apath,$adom,$aname);
+	    %old_essays=&Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname);
         }
     }
 
@@ -2206,7 +2059,8 @@ KEYWORDS
               .'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>';
     $result.='<input type="hidden" name="name'.$counter.
              '" value="'.$env{'form.fullname'}.'" />'."\n";
-    if ($env{'form.handgrade'} eq 'no') {
+#    if ($env{'form.handgrade'} eq 'no') {
+    if (1) {
         $result.='<p class="LC_info">'
                 .&mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon)
                 ."</p>\n";
@@ -2215,7 +2069,8 @@ KEYWORDS
     # If any part of the problem is an essay-response (handgraded), then check for collaborators
     my $fullname;
     my $col_fullnames = [];
-    if ($env{'form.handgrade'} eq 'yes') {
+#    if ($env{'form.handgrade'} eq 'yes') {
+    if (1) {
 	(my $sub_result,$fullname,$col_fullnames)=
 	    &check_collaborators($symb,$uname,$udom,\%record,$handgrade,
 				 $counter);
@@ -2277,22 +2132,16 @@ KEYWORDS
 		    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);
+			    &most_similar($uname,$udom,$subval,\%old_essays);
 			if ($osim) {
 			    $osim=int($osim*100.0);
 			    my %old_course_desc = 
 				&Apache::lonnet::coursedescription($ocrsid,
 								   {'one_time' => 1});
 
-                            if ($hide eq 'anon') {
+                            if ($hide) {
                                 $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 {
@@ -2309,8 +2158,7 @@ KEYWORDS
                             }
 			}
 		    }
-		    my $order=&get_order($partid,$respid,$symb,$uname,$udom,
-                                         undef,$type,$trial,$rndseed);
+		    my $order=&get_order($partid,$respid,$symb,$uname,$udom);
 		    if ($env{'form.lastSub'} eq 'lastonly' || 
 			($env{'form.lastSub'} eq 'hdgrade' && 
 			 $$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) {
@@ -2322,7 +2170,7 @@ KEYWORDS
                             '</span>&nbsp; &nbsp;';
 			my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record);
 			if (@$files) {
-                            if ($hide eq 'anon') {
+                            if ($hide) {
                                 $lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files}));
                             } else {
                                 $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />';
@@ -2333,12 +2181,12 @@ KEYWORDS
                             }
 			    $lastsubonly.='<br />';
 			}
-                        if ($hide eq 'anon') {
+                        if ($hide) {
                             $lastsubonly.='<b>'.&mt('Anonymous Survey').'</b>'; 
                         } else {
 			    $lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'.
 			        &cleanRecord($subval,$responsetype,$symb,$partid,
-					     $respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed);
+					     $respid,\%record,$order,undef,$uname,$udom);
                         }
 			if ($similar) {$lastsubonly.="<br /><br />$similar\n";}
 			$lastsubonly.='</div>';
@@ -2349,7 +2197,7 @@ KEYWORDS
 	}
 	$request->print($lastsubonly);
    } elsif ($env{'form.lastSub'} eq 'datesub') {
-	my (undef,$responseType,undef,$parts) = &showResourceInfo($symb);
+        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,
@@ -2357,27 +2205,19 @@ KEYWORDS
 								 $last,'.submission',
 								 'Apache::grades::keywords_highlight'));
     }
-
     $request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'
 	.$udom.'" />'."\n");
     # return if view submission with no grading option
-    if ($env{'form.showgrading'} eq '' || (!&canmodify($usec))) {
-	my $toGrade.='<input type="button" value="Grade Student" '.
-	    'onclick="javascript:checksubmit(this.form,\'Grade Student\',\''
-	    .$counter.'\');" target="_self" /> &nbsp;'."\n" if (&canmodify($usec));
-	$toGrade.='</div>'."\n";
-	if (($env{'form.command'} eq 'submission') || 
-	    ($env{'form.command'} eq 'processGroup' && $counter == $total)) {
-	    $toGrade.='</form>'.&show_grading_menu_form($symb); 
-	}
-	$request->print($toGrade);
+    if (!&canmodify($usec)) {
+	$request->print('<p><span class="LC_warning">'.&mt('No grading privileges').'</span></p></div>');
 	return;
     } else {
 	$request->print('</div>'."\n");
     }
 
     # essay grading message center
-    if ($env{'form.handgrade'} eq 'yes') {
+#    if ($env{'form.handgrade'} eq 'yes') {
+    if (1) {
 	my $result='<div class="LC_grade_message_center">';
     
 	$result.='<div class="LC_grade_message_center_header">'.
@@ -2469,7 +2309,6 @@ KEYWORDS
         $endform.="<input type='hidden' value='".&get_increment().
             "' name='increment' />";
 	$endform.='</td></tr></table></form>';
-	$endform.=&show_grading_menu_form($symb);
 	$request->print($endform);
     }
     return '';
@@ -2546,51 +2385,35 @@ sub get_last_submission {
 		    &Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'});
 	    }
 	}
-        my (%typeparts,%randombytry);
+        my %typeparts;
         my $showsurv = 
             &Apache::lonnet::allowed('vas',$env{'request.course.id'});
         foreach my $key (sort(keys(%lasthash))) {
             if ($key =~ /\.type$/) {
                 if (($lasthash{$key} eq 'anonsurvey') || 
-                    ($lasthash{$key} eq 'anonsurveycred') ||
-                    ($lasthash{$key} eq 'randomizetry')) {
+                    ($lasthash{$key} eq 'anonsurveycred')) {
                     my ($ign,@parts) = split(/\./,$key);
                     pop(@parts);
-                    my $id = join('.',@parts);
-                    if ($lasthash{$key} eq 'randomizetry') {
-                        $randombytry{$ign.'.'.$id} = $lasthash{$key};
-                    } else {
-                        unless ($showsurv) {
-                            $typeparts{$ign.'.'.$id} = $lasthash{$key};
-                        }
+                    unless ($showsurv) {
+                        my $id = join(',',@parts);
+                        $typeparts{$ign.'.'.$id} = $lasthash{$key};
                     }
                     delete($lasthash{$key});
                 }
             }
         }
         my @hidden = keys(%typeparts);
-        my @randomize = keys(%randombytry);
 	foreach my $key (keys(%lasthash)) {
 	    next if ($key !~ /\.submission$/);
             my $hide;
             if (@hidden) {
                 foreach my $id (@hidden) {
                     if ($key =~ /^\Q$id\E/) {
-                        $hide = 'anon';
+                        $hide = 1;
                         last;
                     }
                 }
             }
-            unless ($hide) {
-                if (@randomize) {
-                    foreach my $id (@hidden) {
-                        if ($key =~ /^\Q$id\E/) {
-                            $hide = 'rand';
-                            last;
-                        }
-                    }
-                }
-            }
 	    my ($partid,$foo) = split(/submission$/,$key);
 	    my $draft  = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ?
 		'<span class="LC_warning">Draft Copy</span> ' : '';
@@ -2617,187 +2440,9 @@ sub keywords_highlight {
     return $string;
 }
 
-# For Tasks provide a mechanism to display previous version for one specific student
-
-sub show_previous_task_version {
-    my ($request,$symb) = @_;
-    if ($symb eq '') {
-        $request->print("Unable to handle ambiguous references.");
-
-        return '';
-    }
-    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>');
-        return;
-    }
-    my $mode = 'both';
-    my $isTask = ($symb =~/\.task$/);
-    if ($isTask) {
-        if ($env{'form.previousversion'} =~ /^\d+$/) {
-            if ($env{'form.fullname'} eq '') {
-                $env{'form.fullname'} =
-                    &Apache::loncommon::plainname($uname,$udom,'lastname');
-            }
-            my $probtitle=&Apache::lonnet::gettitle($symb);
-            $request->print("\n\n".
-                            '<div class="LC_grade_show_user">'.
-                            '<h2>'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).
-                            '</h2>'."\n");
-            &Apache::lonxml::clear_problem_counter();
-            $request->print(&show_problem($request,$symb,$uname,$udom,1,1,$mode,
-                            {'previousversion' => $env{'form.previousversion'} }));
-            $request->print("\n</div>");
-        }
-    }
-    return;
-}
-
-sub choose_task_version_form {
-    my ($symb,$uname,$udom,$nomenu) = @_;
-    my $isTask = ($symb =~/\.task$/);
-    my ($current,$version,$result,$js,$displayed,$rowtitle);
-    if ($isTask) {
-        my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},
-                                              $udom,$uname);
-        if (($record{'resource.0.version'} eq '') ||
-            ($record{'resource.0.version'} < 2)) {
-            return ($record{'resource.0.version'},
-                    $record{'resource.0.version'},$result,$js);
-        } else {
-            $current = $record{'resource.0.version'};
-        }
-        if ($env{'form.previousversion'}) {
-            $displayed = $env{'form.previousversion'};
-            $rowtitle = &mt('Choose another version:')
-        } else {
-            $displayed = $current;
-            $rowtitle = &mt('Show earlier version:');
-        }
-        $result = '<div class="LC_left_float">';
-        my $list;
-        my $numversions = 0;
-        for (my $i=1; $i<=$record{'resource.0.version'}; $i++) {
-            if ($i == $current) {
-                if (!$env{'form.previousversion'} || $nomenu) {
-                    next;
-                } else {
-                    $list .= '<option value="'.$i.'">'.&mt('Current').'</option>'."\n";
-                    $numversions ++;
-                }
-            } elsif (defined($record{'resource.'.$i.'.0.status'})) {
-                unless ($i == $env{'form.previousversion'}) {
-                    $numversions ++;
-                }
-                $list .= '<option value="'.$i.'">'.$i.'</option>'."\n";
-            }
-        }
-        if ($numversions) {
-            $symb = &HTML::Entities::encode($symb,'<>"&');
-            $result .=
-                '<form name="getprev" method="post" action=""'.
-                ' onsubmit="return previousVersion('."'$uname','$udom','$symb','$displayed'".');">'.
-                &Apache::loncommon::start_data_table().
-                &Apache::loncommon::start_data_table_row().
-                '<th align="left">'.$rowtitle.'</th>'.
-                '<td><select name="version">'.
-                '<option>'.&mt('Select').'</option>'.
-                $list.
-                '</select></td>'.
-                &Apache::loncommon::end_data_table_row();
-            unless ($nomenu) {
-                $result .= &Apache::loncommon::start_data_table_row().
-                '<th align="left">'.&mt('Open in new window').'</th>'.
-                '<td><span class="LC_nobreak">'.
-                '<label><input type="radio" name="prevwin" value="1" />'.
-                &mt('Yes').'</label>'.
-                '<label><input type="radio" name="prevwin" value="0" checked="checked" />'.&mt('No').'</label>'.
-                '</span></td>'.
-                &Apache::loncommon::end_data_table_row();
-            }
-            $result .=
-                &Apache::loncommon::start_data_table_row().
-                '<th align="left">&nbsp;</th>'.
-                '<td>'.
-                '<input type="submit" name="prevsub" value="'.&mt('Display').'" />'.
-                '</td>'.
-                &Apache::loncommon::end_data_table_row().
-                &Apache::loncommon::end_data_table().
-                '</form>';
-            $js = &previous_display_javascript($nomenu,$current);
-        } elsif ($displayed && $nomenu) {
-            $result .= '<a href="javascript:window.close()">'.&mt('Close window').'</a>';
-        } else {
-            $result .= &mt('No previous versions to show for this student');
-        }
-        $result .= '</div>';
-    }
-    return ($current,$displayed,$result,$js);
-}
-
-sub previous_display_javascript {
-    my ($nomenu,$current) = @_;
-    my $js = <<"JSONE";
-<script type="text/javascript">
-// <![CDATA[
-function previousVersion(uname,udom,symb) {
-    var current = '$current';
-    var version = document.getprev.version.options[document.getprev.version.selectedIndex].value;
-    var prevstr = new RegExp("^\\\\d+\$");
-    if (!prevstr.test(version)) {
-        return false;
-    }
-    var url = '';
-    if (version == current) {
-        url = '/adm/grades?student='+uname+'&userdom='+udom+'&symb='+symb+'&command=submission';
-    } else {
-        url = '/adm/grades?student='+uname+'&userdom='+udom+'&symb='+symb+'&command=versionsub&previousversion='+version;
-    }
-JSONE
-    if ($nomenu) {
-        $js .= <<"JSTWO";
-    document.location.href = url;
-JSTWO
-    } else {
-        $js .= <<"JSTHREE";
-    var newwin = 0;
-    for (var i=0; i<document.getprev.prevwin.length; i++) {
-        if (document.getprev.prevwin[i].checked == true) {
-            newwin = document.getprev.prevwin[i].value;
-        }
-    }
-    if (newwin == 1) {
-        var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no';
-        url = url+'&inhibitmenu=yes';
-        if (typeof(previousWin) == 'undefined' || previousWin.closed) {
-            previousWin = window.open(url,'',options,1);
-        } else {
-            previousWin.location.href = url;
-        }
-        previousWin.focus();
-        return false;
-    } else {
-        document.location.href = url;
-        return false;
-    }
-JSTHREE
-    }
-    $js .= <<"ENDJS";
-    return false;
-}
-// ]]>
-</script>
-ENDJS
-
-}
-
 #--- Called from submission routine
 sub processHandGrade {
-    my ($request) = shift;
-    my ($symb)   = &get_symb($request);
+    my ($request,$symb) = @_;
     my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb);
     my $button = $env{'form.gradeOpt'};
     my $ngrade = $env{'form.NCT'};
@@ -2837,7 +2482,7 @@ sub processHandGrade {
 		if ($env{'form.withgrades'.$ctr}) {
 		    $message.="\n\nPoint".($pts > 1 ? 's':'').' awarded = '.$pts.' out of '.$wgt;
 		    $messagetail = " for <a href=\"".
-		                   $feedurl."?symb=$showsymb\">$env{'form.probTitle'}</a>";
+		                   $feedurl."?symb=$showsymb\">$restitle</a>";
 		}
 		$msgstatus = 
                     &Apache::lonmsg::user_normal_msg($uname,$udom,$subject,
@@ -2846,7 +2491,7 @@ sub processHandGrade {
                                                      undef,undef,$showsymb,
                                                      $restitle);
 		$request->print('<br />'.&mt('Sending message to [_1]',$uname.':'.$udom).': '.
-				$msgstatus.'<br />');
+				$msgstatus);
 	    }
 	    if ($env{'form.collaborator'.$ctr}) {
 		my @collabstrs=&Apache::loncommon::get_env_multiple("form.collaborator$ctr");
@@ -2865,7 +2510,7 @@ sub processHandGrade {
 						      $udom);
 			    if ($env{'form.withgrades'.$ctr}) {
 				$messagetail = " for <a href=\"".
-                                    $baseurl."?symb=$showsymb\">$env{'form.probTitle'}</a>";
+                                    $baseurl."?symb=$showsymb\">$restitle</a>";
 			    }
 			    $msgstatus = 
 				&Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle);
@@ -2877,7 +2522,8 @@ sub processHandGrade {
 	}
     }
 
-    if ($env{'form.handgrade'} eq 'yes') {
+#    if ($env{'form.handgrade'} eq 'yes') {
+    if (1) {
 	# Keywords sorted in alphabatical order
 	my $loginuser = $env{'user.name'}.':'.$env{'user.domain'};
 	my %keyhash = ();
@@ -2930,22 +2576,12 @@ sub processHandGrade {
 	    my $processUser = $env{'form.unamedom'.$ctr};
 	    ($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser);
 	    $env{'form.fullname'} = $$fullname{$processUser};
-	    &submission($request,$ctr,$total-1);
+	    &submission($request,$ctr,$total-1,$symb);
 	    $ctr++;
 	}
 	return '';
     }
 
-# Go directly to grade student - from submission or link from chart page
-    if ($button eq 'Grade Student') {
-	(undef,undef,$env{'form.handgrade'},undef,undef) = &showResourceInfo($symb);
-	my $processUser = $env{'form.unamedom'.$env{'form.studentNo'}};
-	($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser);
-	$env{'form.fullname'} = $$fullname{$processUser};
-	&submission($request,0,0);
-	return '';
-    }
-
     # Get the next/previous one or group of students
     my $firststu = $env{'form.unamedom0'};
     my $laststu = $env{'form.unamedom'.($ngrade-1)};
@@ -2965,6 +2601,7 @@ sub processHandGrade {
 		 }
 		 return $a cmp $b;
 	     } (keys(%$fullname))) {
+# FIXME: this is fishy, looks like the button label
 	if ($nextflg == 1 && $button =~ /Next$/) {
 	    push(@parsedlist,$item);
 	}
@@ -2975,6 +2612,7 @@ sub processHandGrade {
 	}
     }
     $ctr = 0;
+# FIXME: this is fishy, looks like the button label
     @parsedlist = reverse @parsedlist if ($button eq 'Previous');
     my $res_error;
     my ($partlist) = &response_type($symb,\$res_error);
@@ -3027,14 +2665,11 @@ sub processHandGrade {
 	$env{'form.student'}  = $uname;
 	$env{'form.userdom'}  = $udom;
 	$env{'form.fullname'} = $$fullname{$_};
-	&submission($request,$ctr,$total);
+	&submission($request,$ctr,$total,$symb);
 	$ctr++;
     }
     if ($total < 0) {
-	my $the_end = '<h3><span class="LC_info">'.&mt('LON-CAPA User Message').'</span></h3><br />'."\n";
-	$the_end.='<p>'.&mt('[_1]Message:[_2] No more students for this section or class.','<b>','</b>').'</p>'."\n";
-	$the_end.=&mt('Click on the button below to return to the grading menu.').'<br /><br />'."\n";
-	$the_end.=&show_grading_menu_form($symb);
+	my $the_end.=&mt('<b>Message: </b> No more students for this section or class.').'<br /><br />'."\n";
 	$request->print($the_end);
     }
     return '';
@@ -3185,79 +2820,64 @@ sub handback_files {
         $request->print('<br />'.&navmap_errormsg().'<br />');
         return;
     }
-    my @handedback;
-    my $file_msg;
     my @part_response_id = &flatten_responseType($responseType);
     foreach my $part_response_id (@part_response_id) {
     	my ($part_id,$resp_id) = @{ $part_response_id };
 	my $part_resp = join('_',@{ $part_response_id });
-        if (($env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'} =~ /^\d+$/) & ($new_part eq $part_id)) {
-            for (my $counter=1; $counter<=$env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'}; $counter++) {
+            if (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) {
                 # if multiple files are uploaded names will be 'returndoc2','returndoc3'
-		if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) {
-                    my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter.'.filename'};
+                my $file_counter = 1;
+		my $file_msg;
+                while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) {
+                    my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'};
                     my ($directory,$answer_file) = 
-                        ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/);
+                        ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter} =~ /^(.*?)([^\/]*)$/);
                     my ($answer_name,$answer_ver,$answer_ext) =
 		        &file_name_version_ext($answer_file);
 		    my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/);
                     my $getpropath = 1;
-                    my ($dir_list,$listerror) =
-                        &Apache::lonnet::dirlist($portfolio_root.$portfolio_path,
-                                                 $domain,$stuname,$getpropath);
-		    my $version = &get_next_version($answer_name,$answer_ext,$dir_list);
+		    my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$portfolio_path,$domain,$stuname,$getpropath);
+		    my $version = &get_next_version($answer_name, $answer_ext, \@dir_list);
                     # fix file name
                     my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/);
                     my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain,
-            	                                $newflg.'_'.$part_resp.'_returndoc'.$counter,
+            	                                $newflg.'_'.$part_resp.'_returndoc'.$file_counter,
             	                                $save_file_name);
                     if ($result !~ m|^/uploaded/|) {
                         $request->print('<br /><span class="LC_error">'.
                             &mt('An error occurred ([_1]) while trying to upload [_2].',
-                                $result,$newflg.'_'.$part_resp.'_returndoc'.$counter).
+                                $result,$newflg.'_'.$part_resp.'_returndoc'.$file_counter).
                                         '</span>');
                     } else {
                         # mark the file as read only
-                        push(@handedback,$save_file_name);
+                        my @files = ($save_file_name);
+                        my @what = ($symb,$env{'request.course.id'},'handback');
+                        &Apache::lonnet::mark_as_readonly($domain,$stuname,\@files,\@what);
 			if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) {
 			    $$newrecord{"resource.$new_part.$resp_id.handback"}.=',';
 			}
                         $$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name;
-			$file_msg.='<span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span> <br />";
+			$file_msg.= "\n".'<br /><span class="LC_filename"><a href="/uploaded/'."$domain/$stuname/".$save_file_name.'">'.$save_file_name."</a></span><br />";
 
                     }
-                    $request->print('<br />'.&mt('[_1] will be the uploaded file name [_2]','<span class="LC_info">'.$fname.'</span>','<span class="LC_filename">'.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter}.'</span>'));
+                    $request->print("<br />".$fname." will be the uploaded file name");
+                    $request->print(" ".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter});
+                    $file_counter++;
                 }
+		my $subject = "File Handed Back by Instructor ";
+		my $message = "A file has been returned that was originally submitted in reponse to: <br />";
+		$message .= "<strong>".&Apache::lonnet::gettitle($symb)."</strong><br />";
+		$message .= ' The returned file(s) are named: '. $file_msg;
+		$message .= " and can be found in your portfolio space.";
+		my ($feedurl,$showsymb) = 
+		    &get_feedurl_and_symb($symb,$domain,$stuname);
+                my $restitle = &Apache::lonnet::gettitle($symb);
+		my $msgstatus = 
+                   &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject.
+			 ' (File Returned) ['.$restitle.']',$message,undef,
+                         $feedurl,undef,undef,undef,$showsymb,$restitle);
             }
         }
-    }
-    if (@handedback > 0) {
-        $request->print('<br />');
-        my @what = ($symb,$env{'request.course.id'},'handback');
-        &Apache::lonnet::mark_as_readonly($domain,$stuname,\@handedback,\@what);
-        my $user_lh = &Apache::loncommon::user_lang($stuname,$domain,$env{'request.course.id'});
-        my ($subject,$message);
-        if (scalar(@handedback) == 1) {
-            $subject = &mt_user($user_lh,'File Handed Back by Instructor');
-        } else {
-            $subject = &mt_user($user_lh,'Files Handed Back by Instructor');
-            $message = &mt_user($user_lh,'Files have been returned that were originally submitted in response to: ');
-        }
-        $message .= "<p><strong>".&Apache::lonnet::gettitle($symb)." </strong></p>";
-        $message .= &mt_user($user_lh,'The returned file(s) are named: [_1]',"<br />$file_msg <br />").
-                    &mt_user($user_lh,'The file(s) can be found in your [_1]portfolio[_2].','<a href="/adm/portfolio">','</a>');
-        my ($feedurl,$showsymb) =
-            &get_feedurl_and_symb($symb,$domain,$stuname);
-        my $restitle = &Apache::lonnet::gettitle($symb);
-        $subject .= ' '.&mt_user($user_lh,'(File Returned)').' ['.$restitle.']';
-        my $msgstatus =
-             &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject,
-                 $message,undef,$feedurl,undef,undef,undef,$showsymb,
-                 $restitle);
-        if ($msgstatus) {
-            $request->print(&mt('Notification message status: [_1]','<span class="LC_info">'.$msgstatus.'</span>').'<br />');
-        }
-    }
     return;
 }
 
@@ -3365,11 +2985,9 @@ sub version_portfiles {
                 my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/);
 		my ($answer_name,$answer_ver,$answer_ext) =
 		    &file_name_version_ext($answer_file);
-                my $getpropath = 1;
-                my ($dir_list,$listerror) =
-                    &Apache::lonnet::dirlist($portfolio_root.$directory,$domain,
-                                             $stu_name,$getpropath);
-                my $version = &get_next_version($answer_name,$answer_ext,$dir_list);
+                my $getpropath = 1;    
+                my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$directory,$domain,$stu_name,$getpropath);
+                my $version = &get_next_version($answer_name, $answer_ext, \@dir_list);
                 my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version);
                 if ($new_answer ne 'problem getting file') {
                     push(@versioned_portfiles, $directory.$new_answer);
@@ -3388,24 +3006,21 @@ sub version_portfiles {
 sub get_next_version {
     my ($answer_name, $answer_ext, $dir_list) = @_;
     my $version;
-    if (ref($dir_list) eq 'ARRAY') {
-        foreach my $row (@{$dir_list}) {
-            my ($file) = split(/\&/,$row,2);
-            my ($file_name,$file_version,$file_ext) =
-	        &file_name_version_ext($file);
-            if (($file_name eq $answer_name) && 
-	        ($file_ext eq $answer_ext)) {
-                # gets here if filename and extension match, 
-                # regardless of version
+    foreach my $row (@$dir_list) {
+        my ($file) = split(/\&/,$row,2);
+        my ($file_name,$file_version,$file_ext) =
+	    &file_name_version_ext($file);
+        if (($file_name eq $answer_name) && 
+	    ($file_ext eq $answer_ext)) {
+                # gets here if filename and extension match, regardless of version
                 if ($file_version ne '') {
-                    # a versioned file is found  so save it for later
-                    if ($file_version > $version) {
-		        $version = $file_version;
-                    }
+                # a versioned file is found  so save it for later
+                if ($file_version > $version) {
+		    $version = $file_version;
 	        }
             }
         }
-    }
+    } 
     $version ++;
     return($version);
 }
@@ -3452,8 +3067,7 @@ sub viewgrades_js {
     my ($request) = shift;
 
     my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = ');
-    $request->print(<<VIEWJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<VIEWJAVASCRIPT));
    function writePoint(partid,weight,point) {
 	var radioButton = document.classgrade["RADVAL_"+partid];
 	var textbox = document.classgrade["TEXTVAL_"+partid];
@@ -3614,16 +3228,14 @@ sub viewgrades_js {
 	}
     }
 
-</script>
 VIEWJAVASCRIPT
 }
 
 #--- show scores for a section or whole class w/ option to change/update a score
 sub viewgrades {
-    my ($request) = shift;
+    my ($request,$symb) = @_;
     &viewgrades_js($request);
 
-    my ($symb) = &get_symb($request);
     #need to make sure we have the correct data for later EXT calls, 
     #thus invalidate the cache
     &Apache::lonnet::devalidatecourseresdata(
@@ -3632,7 +3244,6 @@ sub viewgrades {
     &Apache::lonnet::clear_EXT_cache_status();
 
     my $result='<h3><span class="LC_info">'.&mt('Manual Grading').'</span></h3>';
-    $result.='<h4>'.&mt('<b>Current Resource: </b>[_1]',$env{'form.probTitle'}).'</h4>'."\n";
 
     #view individual student submission form - called using Javascript viewOneStudent
     $result.=&jscriptNform($symb);
@@ -3643,9 +3254,7 @@ sub viewgrades {
 	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
 	'<input type="hidden" name="command" value="editgrades" />'."\n".
 	&build_section_inputs().
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n".
 	'<input type="hidden" name="Status" value="'.$env{'stu_status'}.'" />'."\n".
-	'<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n";
 
     my ($common_header,$specific_header);
     if ($env{'form.section'} eq 'all') {
@@ -3740,6 +3349,9 @@ sub viewgrades {
 	if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
 	my ($partid) = &split_part_type($part);
         push(@partids,$partid);
+#
+# FIXME: Looks like $display looks at English text
+#
 	my $display_part=&get_display_part($partid,$symb);
 	if ($display =~ /^Partial Credit Factor/) {
 	    $result.='<th>'.
@@ -3791,7 +3403,6 @@ sub viewgrades {
 	        $section_display, $stu_status).
 	    '</span>';
     }
-    $result.=&show_grading_menu_form($symb);
     return $result;
 }
 
@@ -3863,12 +3474,10 @@ sub viewstudentgrade {
 #--- change scores for all the students in a section/class
 #    record does not get update if unchanged
 sub editgrades {
-    my ($request) = @_;
+    my ($request,$symb) = @_;
 
-    my ($symb)=&get_symb($request);
     my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section'));
     my $title='<h2>'.&mt('Current Grade Status').'</h2>';
-    $title.='<h4>'.&mt('<b>Current Resource: </b>[_1]',$env{'form.probTitle'}).'</h4>'."\n";
     $title.='<h4>'.&mt('<b>Section: </b>[_1]',$section_display).'</h4>'."\n";
 
     my $result= &Apache::loncommon::start_data_table().
@@ -4076,8 +3685,7 @@ sub editgrades {
 		&Apache::loncommon::end_data_table_row();
 	}
     }
-    $result .= &Apache::loncommon::end_data_table().
-	&show_grading_menu_form($symb);
+    $result .= &Apache::loncommon::end_data_table();
     my $msg = '<p><b>'.
 	&mt('Number of records updated = [_1] for [quant,_2,student].',
 	    $rec_update,$count).'</b><br />'.
@@ -4190,21 +3798,14 @@ sub csvuploadmap_header {
 	$javascript=&csvupload_javascript_forward_associate();
     }
 
-    my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
-    my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
-    my $ignore=&mt('Ignore First Line');
     $symb = &Apache::lonenc::check_encrypt($symb);
+    $request->print('<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">'.
+                    &mt('Total number of records found in file: [_1]',$distotal).'<hr />'.
+                    &mt('Associate entries from the uploaded file with as many fields as you can.'));
+    my $reverse=&mt("Reverse Association");
     $request->print(<<ENDPICK);
-<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
-<h3><span class="LC_info">Uploading Class Grades</span></h3>
-$result
-<hr />
-<h3>Identify fields</h3>
-Total number of records found in file: $distotal <hr />
-Enter as many fields as you can. The system will inform you and bring you back
-to this page if the data selected is insufficient to run your class.<hr />
-<input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
-<label><input type="checkbox" name="noFirstLine" $checked />$ignore</label>
+<br />
+<input type="button" value="$reverse" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
 <input type="hidden" name="associate"  value="" />
 <input type="hidden" name="phase"      value="three" />
 <input type="hidden" name="datatoken"  value="$datatoken" />
@@ -4213,14 +3814,10 @@ to this page if the data selected is ins
 <input type="hidden" name="upfile_associate" 
                                        value="$env{'form.upfile_associate'}" />
 <input type="hidden" name="symb"       value="$symb" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
-<input type="hidden" name="probTitle"  value="$env{'form.probTitle'}" />
 <input type="hidden" name="command"    value="csvuploadoptions" />
 <hr />
-<script type="text/javascript" language="Javascript">
-$javascript
-</script>
 ENDPICK
+    $request->print(&Apache::lonhtmlcommon::scripttag($javascript));
     return '';
 
 }
@@ -4264,9 +3861,8 @@ ENDPICK
 }
 
 sub checkforfile_js {
-    my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
-    my $result =<<CSVFORMJS;
-<script type="text/javascript" language="javascript">
+    my $alertmsg = &mt('Please use the "Choose File" button to select a file from your local directory.');
+    my $result = &Apache::lonhtmlcommon::scripttag(<<CSVFORMJS);
     function checkUpload(formname) {
 	if (formname.upfile.value == "") {
 	    alert("$alertmsg");
@@ -4274,24 +3870,19 @@ sub checkforfile_js {
 	}
 	formname.submit();
     }
-    </script>
 CSVFORMJS
     return $result;
 }
 
 sub upcsvScores_form {
-    my ($request) = shift;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb) = @_;
     if (!$symb) {return '';}
     my $result=&checkforfile_js();
-    $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
-    my ($table) = &showResourceInfo($symb,$env{'form.probTitle'});
-    $result.=$table;
-    $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n";
-    $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n";
-    $result.='&nbsp;<b>'.&mt('Specify a file containing the class scores for current resource.').
-	'</b></td></tr>'."\n";
-    $result.='<tr bgcolor="#ffffe6"><td>'."\n";
+    $result.=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Specify a file containing the class scores for current resource.').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row().'<td>';
     my $upload=&mt("Upload Scores");
     my $upfile_select=&Apache::loncommon::upfile_select_html();
     my $ignore=&mt('Ignore First Line');
@@ -4300,25 +3891,21 @@ sub upcsvScores_form {
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="csvuploadmap" />
-<input type="hidden" name="probTitle" value="$env{'form.probTitle'}" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 $upfile_select
 <br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" />
-<label><input type="checkbox" name="noFirstLine" />$ignore</label>
 </form>
 ENDUPFORM
     $result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
-                           &mt("How do I create a CSV file from a spreadsheet"))
-    .'</td></tr></table>'."\n";
-    $result.='</td></tr></table><br /><br />'."\n";
-    $result.=&show_grading_menu_form($symb);
+                           &mt("How do I create a CSV file from a spreadsheet")).
+             '</td>'.
+            &Apache::loncommon::end_data_table_row().
+            &Apache::loncommon::end_data_table();
     return $result;
 }
 
 
 sub csvuploadmap {
-    my ($request)= @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb)= @_;
     if (!$symb) {return '';}
 
     my $datatoken;
@@ -4329,7 +3916,6 @@ sub csvuploadmap {
 	&Apache::loncommon::load_tmp_file($request);
     }
     my @records=&Apache::loncommon::upfile_record_sep();
-    if ($env{'form.noFirstLine'}) { shift(@records); }
     &csvuploadmap_header($request,$symb,$datatoken,$#records+1);
     my ($i,$keyfields);
     if (@records) {
@@ -4359,39 +3945,27 @@ sub csvuploadmap {
 	}
     }
     &csvuploadmap_footer($request,$i,$keyfields);
-    $request->print(&show_grading_menu_form($symb));
 
     return '';
 }
 
 sub csvuploadoptions {
-    my ($request)= @_;
-    my ($symb)=&get_symb($request);
-    my $checked=(($env{'form.noFirstLine'})?'1':'0');
-    my $ignore=&mt('Ignore First Line');
+    my ($request,$symb)= @_;
+    my $overwrite=&mt('Overwrite any existing score');
     $request->print(<<ENDPICK);
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
-<h3><span class="LC_info">Uploading Class Grade Options</span></h3>
 <input type="hidden" name="command"    value="csvuploadassign" />
-<!--
-<p>
-<label>
-   <input type="checkbox" name="show_full_results" />
-   Show a table of all changes
-</label>
-</p>
--->
 <p>
 <label>
    <input type="checkbox" name="overwite_scores" checked="checked" />
-   Overwrite any existing score
+   $overwrite
 </label>
 </p>
 ENDPICK
     my %fields=&get_fields();
     if (!defined($fields{'domain'})) {
 	my $domform = &Apache::loncommon::select_dom_form($env{'request.role.domain'},'default_domain');
-	$request->print("\n<p> Users are in domain: ".$domform."</p>\n");
+	$request->print("\n<p>".&mt('Users are in domain: [_1]',$domform)."</p>\n");
     }
     foreach my $key (sort(keys(%env))) {
 	if ($key !~ /^form\.(.*)$/) { next; }
@@ -4404,7 +3978,6 @@ ENDPICK
     # FIXME do a check for any invalid user ids?...
     $request->print('<input type="submit" value="Assign Grades" /><br />
 <hr /></form>'."\n");
-    $request->print(&show_grading_menu_form($symb));
     return '';
 }
 
@@ -4426,20 +3999,16 @@ sub get_fields {
 }
 
 sub csvuploadassign {
-    my ($request)= @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb)= @_;
     if (!$symb) {return '';}
     my $error_msg = '';
     &Apache::loncommon::load_tmp_file($request);
     my @gradedata = &Apache::loncommon::upfile_record_sep();
-    if ($env{'form.noFirstLine'}) { shift(@gradedata); }
     my %fields=&get_fields();
-    $request->print('<h3>Assigning Grades</h3>');
     my $courseid=$env{'request.course.id'};
     my ($classlist) = &getclasslist('all',0);
     my @notallowed;
     my @skipped;
-    my @warnings;
     my $countdone=0;
     foreach my $grade (@gradedata) {
 	my %entries=&Apache::loncommon::record_sep($grade);
@@ -4488,9 +4057,6 @@ sub csvuploadassign {
                     my $pcr=$entries{$fields{$dest}} / $wgt;
                     my $award=($pcr == 0) ? 'incorrect_by_override'
                                           : 'correct_by_override';
-                    if ($pcr>1) {
-                        push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain"));
-                    }
                     $grades{"resource.$part.awarded"}=$pcr;
                     $grades{"resource.$part.solved"}=$award;
                     $points{$part}=1;
@@ -4518,26 +4084,23 @@ sub csvuploadassign {
 					   $env{'request.course.id'},
 					   $domain,$username);
 	   if ($result eq 'ok') {
+# Successfully stored
 	      $request->print('.');
 # Remove from grading queue
               &Apache::bridgetask::remove_from_queue('gradingqueue',$symb,
                                              $env{'course.'.$env{'request.course.id'}.'.domain'},
                                              $env{'course.'.$env{'request.course.id'}.'.num'},
                                              $domain,$username);
-	   } else {
+              $countdone++;
+           } else {
 	      $request->print("<p><span class=\"LC_error\">".
                               &mt("Failed to save data for student [_1]. Message when trying to save was: [_2]",
                                   "$username:$domain",$result)."</span></p>");
 	   }
 	   $request->rflush();
-	   $countdone++;
         }
     }
     $request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0));
-    if (@warnings) {
-        $request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('Warnings generated for the following saved scores:'),1).'<br />');
-        $request->print(join(', ',@warnings));
-    }
     if (@skipped) {
 	$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt('No scores stored for the following username(s):'),1).'<br />');
         $request->print(join(', ',@skipped));
@@ -4547,7 +4110,6 @@ sub csvuploadassign {
 	$request->print(join(', ',@notallowed));
     }
     $request->print("<br />\n");
-    $request->print(&show_grading_menu_form($symb));
     return $error_msg;
 }
 #------------- end of section for handling csv file upload ---------
@@ -4558,11 +4120,10 @@ sub csvuploadassign {
 #
 #--- Select a page/sequence and a student to grade
 sub pickStudentPage {
-    my ($request) = shift;
+    my ($request,$symb) = @_;
 
     my $alertmsg = &mt('Please select the student you wish to grade.');
-    $request->print(<<LISTJAVASCRIPT);
-<script type="text/javascript" language="javascript">
+    $request->print(&Apache::lonhtmlcommon::scripttag(<<LISTJAVASCRIPT));
 
 function checkPickOne(formname) {
     if (radioSelection(formname.student) == null) {
@@ -4575,10 +4136,9 @@ function checkPickOne(formname) {
     formname.submit();
 }
 
-</script>
 LISTJAVASCRIPT
     &commonJSfunctions($request);
-    my ($symb) = &get_symb($request);
+
     my $cdom      = $env{"course.$env{'request.course.id'}.domain"};
     my $cnum      = $env{"course.$env{'request.course.id'}.num"};
     my $getsec    = $env{'form.section'} eq '' ? 'all' : $env{'form.section'};
@@ -4633,8 +4193,7 @@ LISTJAVASCRIPT
     my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
     $result.='<input type="hidden" name="Status"  value="'.$stu_status.'" />'."\n".
 	'<input type="hidden" name="command" value="displayPage" />'."\n".
-	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."<br />\n";
+	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."<br />\n";
 
     $result.='&nbsp;<b>'.&mt('Use CODE').': </b> <input type="text" name="CODE" value="" /> <br />'."\n";
 
@@ -4680,7 +4239,6 @@ LISTJAVASCRIPT
     $studentTable.='<input type="button" '.
                    'onclick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' &rarr;" /></form>'."\n";
 
-    $studentTable.=&show_grading_menu_form($symb);
     $request->print($studentTable);
 
     return '';
@@ -4717,9 +4275,7 @@ sub getSymbMap {
 #
 #--- Displays a page/sequence w/wo problems, w/wo submissions
 sub displayPage {
-    my ($request) = shift;
-
-    my ($symb) = &get_symb($request);
+    my ($request,$symb) = @_;
     my $cdom      = $env{"course.$env{'request.course.id'}.domain"};
     my $cnum      = $env{"course.$env{'request.course.id'}.num"};
     my $getsec    = $env{'form.section'} eq '' ? 'all' : $env{'form.section'};
@@ -4737,7 +4293,6 @@ sub displayPage {
 
     if (!&canview($usec)) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to view requested student. ([_1])',$env{'form.student'}).'</span>');
-	$request->print(&show_grading_menu_form($symb));
 	return;
     }
     my $result='<h3><span class="LC_info">&nbsp;'.$env{'form.title'}.'</span></h3>';
@@ -4755,14 +4310,12 @@ sub displayPage {
     my $navmap = Apache::lonnavmaps::navmap->new();
     unless (ref($navmap)) {
         $request->print(&navmap_errormsg());
-        $request->print(&show_grading_menu_form($symb));
         return;
     }
     my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($env{'form.page'});
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
     if (!$map) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to view requested sequence. ([_1])',$resUrl).'</span>');
-	$request->print(&show_grading_menu_form($symb));
 	return; 
     }
     my $iterator = $navmap->getIterator($map->map_start(),
@@ -4775,8 +4328,7 @@ sub displayPage {
 	'<input type="hidden" name="page"    value="'.$pageTitle.'" />'."\n".
 	'<input type="hidden" name="title"   value="'.$env{'form.title'}.'" />'."\n".
 	'<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="overRideScore" value="no" />'."\n".
-	'<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n";
+	'<input type="hidden" name="overRideScore" value="no" />'."\n";
 
     if (defined($env{'form.CODE'})) {
 	$studentTable.=
@@ -4810,8 +4362,8 @@ sub displayPage {
 		&Apache::loncommon::start_data_table_row().
 		'<td align="center" valign="top" >'.$prob.
 		(scalar(@{$parts}) == 1 ? '' 
-		                        : '<br />('.&mt('[_1]parts',
-							scalar(@{$parts}).'&nbsp;').')'
+		                        : '<br />('.&mt('[_1]&nbsp;parts)',
+							scalar(@{$parts}))
 		 ).
 		 '</td>';
 	    $studentTable.='<td valign="top">';
@@ -4878,7 +4430,6 @@ sub displayPage {
         '<input type="button" value="'.&mt('Save').'" '.
         'onclick="javascript:checkSubmitPage(this.form,'.$question.');" />'.
         '</form>'."\n";
-    $studentTable.=&show_grading_menu_form($symb);
     $request->print($studentTable);
 
     return '';
@@ -4893,7 +4444,6 @@ sub displaySubByDates {
 	&Apache::loncommon::start_data_table_header_row().
 	'<th>'.&mt('Date/Time').'</th>'.
 	($isCODE?'<th>'.&mt('CODE').'</th>':'').
-        ($isTask?'<th>'.&mt('Version').'</th>':'').
 	'<th>'.&mt('Submission').'</th>'.
 	'<th>'.&mt('Status').'</th>'.
 	&Apache::loncommon::end_data_table_header_row();
@@ -4907,16 +4457,13 @@ sub displaySubByDates {
 
     my $interaction;
     my $no_increment = 1;
-    my %lastrndseed;
     for ($version=1;$version<=$$record{'version'};$version++) {
 	my $timestamp = 
 	    &Apache::lonlocal::locallocaltime($$record{$version.':timestamp'});
 	if (exists($$record{$version.':resource.0.version'})) {
 	    $interaction = $$record{$version.':resource.0.version'};
 	}
-        if ($isTask && $env{'form.previousversion'}) {
-            next unless ($interaction == $env{'form.previousversion'});
-        }
+
 	my $where = ($isTask ? "$version:resource.$interaction"
 		             : "$version:resource");
 	$studentTable.=&Apache::loncommon::start_data_table_row().
@@ -4924,15 +4471,12 @@ sub displaySubByDates {
 	if ($isCODE) {
 	    $studentTable.='<td>'.$record->{$version.':resource.CODE'}.'</td>';
 	}
-        if ($isTask) {
-            $studentTable.='<td>'.$interaction.'</td>';
-        }
 	my @versionKeys = split(/\:/,$$record{$version.':keys'});
 	my @displaySub = ();
 	foreach my $partid (@{$parts}) {
-            my ($hidden,$type);
-            $type = $$record{$version.':resource.'.$partid.'.type'};
-            if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) {
+            my $hidden;
+            if (($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurvey') ||
+                ($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurveycred')) {
                 $hidden = 1;
             }
 	    my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)
@@ -4946,7 +4490,7 @@ sub displaySubByDates {
                     
 		    my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/)
 				               : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/));
-                    $displaySub[0].='<span class="LC_nobreak">';
+                    $displaySub[0].='<span class="LC_nobreak"';
                     $displaySub[0].='<b>'.&mt('Part: [_1]',$display_part).'</b>'
                                    .' <span class="LC_internal_info">'
                                    .'('.&mt('Response ID: [_1]',$responseId).')'
@@ -4955,33 +4499,23 @@ sub displaySubByDates {
                     if ($hidden) {
                         $displaySub[0].= &mt('Anonymous Survey').'</b>';
                     } else {
-                        my ($trial,$rndseed,$newvariation);
-                        if ($type eq 'randomizetry') {
-                            $trial = $$record{"$where.$partid.tries"};
-                            $rndseed = $$record{"$where.$partid.rndseed"};
-                        }
 		        if ($$record{"$where.$partid.tries"} eq '') {
 			    $displaySub[0].=&mt('Trial not counted');
 		        } else {
 			    $displaySub[0].=&mt('Trial: [_1]',
 					    $$record{"$where.$partid.tries"});
-                            if ($rndseed || $lastrndseed{$partid}) {
-                                if ($rndseed ne $lastrndseed{$partid}) {
-                                    $newvariation = '&nbsp;('.&mt('New variation this try').')';
-                                }
-                            }
 		        }
 		        my $responseType=($isTask ? 'Task'
                                               : $responseType->{$partid}->{$responseId});
 		        if (!exists($orders{$partid})) { $orders{$partid}={}; }
-		        if ((!exists($orders{$partid}->{$responseId})) || ($trial)) {
+		        if (!exists($orders{$partid}->{$responseId})) {
 			    $orders{$partid}->{$responseId}=
 			        &get_order($partid,$responseId,$symb,$uname,$udom,
-                                           $no_increment,$type,$trial,$rndseed);
+                                           $no_increment);
 		        }
-		        $displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak
+		        $displaySub[0].='</b></span>'; # /nobreak
 		        $displaySub[0].='&nbsp; '.
-			    &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />';
+			    &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />';
                     }
 		}
 	    }
@@ -5022,7 +4556,7 @@ sub displaySubByDates {
 }
 
 sub updateGradeByPage {
-    my ($request) = shift;
+    my ($request,$symb) = @_;
 
     my $cdom      = $env{"course.$env{'request.course.id'}.domain"};
     my $cnum      = $env{"course.$env{'request.course.id'}.num"};
@@ -5033,7 +4567,6 @@ sub updateGradeByPage {
     my $usec=$classlist->{$env{'form.student'}}[5];
     if (!&canmodify($usec)) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to modify requested student ([_1])',$env{'form.student'}).'</span>');
-	$request->print(&show_grading_menu_form($env{'form.symb'}));
 	return;
     }
     my $result='<h3><span class="LC_info">&nbsp;'.$env{'form.title'}.'</span></h3>';
@@ -5052,8 +4585,6 @@ sub updateGradeByPage {
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
     if (!$map) {
 	$request->print('<span class="LC_warning">'.&mt('Unable to grade requested sequence ([_1]).',$resUrl).'</span>');
-	my ($symb)=&get_symb($request);
-	$request->print(&show_grading_menu_form($symb));
 	return; 
     }
     my $iterator = $navmap->getIterator($map->map_start(),
@@ -5083,7 +4614,7 @@ sub updateGradeByPage {
 		&Apache::loncommon::start_data_table_row().
 		'<td align="center" valign="top" >'.$prob.
 		(scalar(@{$parts}) == 1 ? '' 
-                                        : '<br />('.&mt('[quant,_1,part]',scalar(@{$parts}))
+                                        : '<br />('.&mt('[quant,_1,&nbsp;part]',scalar(@{$parts}))
 		.')').'</td>';
 	    $studentTable.='<td valign="top">&nbsp;<b>'.$title.'</b>&nbsp;</td>';
 
@@ -5179,7 +4710,6 @@ sub updateGradeByPage {
     }
 
     $studentTable.=&Apache::loncommon::end_data_table();
-    $studentTable.=&show_grading_menu_form($env{'form.symb'});
     my $grademsg=($changeflag == 0 ? &mt('No score was changed or updated.') :
 		  &mt('The scores were changed for [quant,_1,problem].',
 		  $changeflag));
@@ -5206,12 +4736,12 @@ sub updateGradeByPage {
    from the file that we are parsing that represents one entire sheet
 
    'bubble line' refers to the data
-   representing the line of bubbles that are on the physical bubblesheet
+   representing the line of bubbles that are on the physical bubble sheet
 
 
-The overall process is that a scanned in bubblesheet data is uploaded
+The overall process is that a scanned in bubble sheet data is uploaded
 into a course. When a user wants to grade, they select a
-sequence/folder of resources, a file of bubblesheet info, and pick
+sequence/folder of resources, a file of bubble sheet info, and pick
 one of the predefined configurations for what each scanline looks
 like.
 
@@ -5227,14 +4757,14 @@ username:domain.
 
 During the validation phase the instructor can choose to skip scanlines. 
 
-After the validation phase, there are now 3 bubblesheet files
+After the validation phase, there are now 3 bubble sheet files
 
   scantron_original_filename (unmodified original file)
   scantron_corrected_filename (file where the corrected information has replaced the original information)
   scantron_skipped_filename (contains the exact text of scanlines that where skipped)
 
 Also there is a separate hash nohist_scantrondata that contains extra
-correction information that isn't representable in the bubblesheet
+correction information that isn't representable in the bubble sheet
 file (see &scantron_getfile() for more information)
 
 After all scanlines are either valid, marked as valid or skipped, then
@@ -5257,9 +4787,7 @@ the homework problem.
 
 sub defaultFormData {
     my ($symb)=@_;
-    return '<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-     '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n".
-     '<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n";
+    return '<input type="hidden" name="symb"    value="'.&Apache::lonenc::check_encrypt($symb).'" />';
 }
 
 
@@ -5370,16 +4898,14 @@ sub scantron_filenames {
     my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $getpropath = 1;
-    my ($dirlist,$listerror) = &Apache::lonnet::dirlist('userfiles',$cdom,
-                                                        $cname,$getpropath);
+    my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname,
+                                       $getpropath);
     my @possiblenames;
-    if (ref($dirlist) eq 'ARRAY') {
-        foreach my $filename (sort(@{$dirlist})) {
-	    ($filename)=split(/&/,$filename);
-	    if ($filename!~/^scantron_orig_/) { next ; }
-	    $filename=~s/^scantron_orig_//;
-	    push(@possiblenames,$filename);
-        }
+    foreach my $filename (sort(@files)) {
+	($filename)=split(/&/,$filename);
+	if ($filename!~/^scantron_orig_/) { next ; }
+	$filename=~s/^scantron_orig_//;
+	push(@possiblenames,$filename);
     }
     return @possiblenames;
 }
@@ -5533,7 +5059,7 @@ sub scantron_CODEunique {
 
 =item scantron_selectphase
 
-  Generates the initial screen to start the bubblesheet process.
+  Generates the initial screen to start the bubble sheet process.
   Allows for - starting a grading run.
              - downloading existing scan data (original, corrected
                                                 or skipped info)
@@ -5547,8 +5073,7 @@ sub scantron_CODEunique {
 =cut
 
 sub scantron_selectphase {
-    my ($r,$file2grade) = @_;
-    my ($symb)=&get_symb($r);
+    my ($r,$file2grade,$symb) = @_;
     if (!$symb) {return '';}
     my $map_error;
     my $sequence_selector=&getSequenceDropDown($symb,\$map_error);
@@ -5557,7 +5082,6 @@ sub scantron_selectphase {
         return;
     }
     my $default_form_data=&defaultFormData($symb);
-    my $grading_menu_button=&show_grading_menu_form($symb);
     my $file_selector=&scantron_uploads($file2grade);
     my $format_selector=&scantron_scantab();
     my $CODE_selector=&scantron_CODElist();
@@ -5569,7 +5093,7 @@ sub scantron_selectphase {
     if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) ||
         &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
 
-        # Chunk of form to prompt for a scantron file upload.
+	# Chunk of form to prompt for a scantron file upload.
 
         $r->print('
     <br />
@@ -5582,20 +5106,18 @@ sub scantron_selectphase {
        '.&Apache::loncommon::start_data_table_row().'
             <td>
 ');
-    my $default_form_data=&defaultFormData(&get_symb($r,1));
+    my $default_form_data=&defaultFormData($symb);
     my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
-    $r->print('
-              <script type="text/javascript" language="javascript">
+    $r->print(&Apache::lonhtmlcommon::scripttag('
     function checkUpload(formname) {
-        if (formname.upfile.value == "") {
-            alert("'.&mt('Please use the browse button to select a file from your local directory.').'");
-            return false;
-        }
-        formname.submit();
-    }
-              </script>
-
+	if (formname.upfile.value == "") {
+	    alert("'.&mt('Please use the browse button to select a file from your local directory.').'");
+	    return false;
+	}
+	formname.submit();
+    }'));
+    $r->print('
               <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post">
                 '.$default_form_data.'
                 <input name="courseid" type="hidden" value="'.$cnum.'" />
@@ -5661,6 +5183,8 @@ sub scantron_selectphase {
    
     $r->print($result);
 
+
+
     # Chunk of the form that prompts to view a scoring office file,
     # corrected file, skipped records in a file.
 
@@ -5719,7 +5243,6 @@ sub scantron_selectphase {
               &Apache::loncommon::end_data_table_row()."\n".
               &Apache::loncommon::end_data_table()."\n".
               '</form><br />');
-    $r->print($grading_menu_button);
     return;
 }
 
@@ -5777,8 +5300,6 @@ sub scantron_selectphase {
  
       LastName    - column that the last name starts in
       LastNameLength - number of columns that the last name spans
-      BubblesPerRow - number of bubbles available in each row used to
-                      bubble an answer. (If not specified, 10 assumed).
 
 =cut
 
@@ -5809,7 +5330,6 @@ sub get_scantron_config {
 	$config{'FirstNamelength'}=$config[14];
 	$config{'LastName'}=$config[15];
 	$config{'LastNamelength'}=$config[16];
-        $config{'BubblesPerRow'}=$config[17];
 	last;
     }
     return %config;
@@ -6559,7 +6079,7 @@ sub remember_current_skipped {
 =item check_for_error
 
     Checks if there was an error when attempting to remove a specific
-    scantron_.. bubblesheet data file. Prints out an error if
+    scantron_.. bubble sheet data file. Prints out an error if
     something went wrong.
 
 =cut
@@ -6594,12 +6114,6 @@ sub scantron_warning_screen {
 	    '<tr><td><b>'.&mt('List of CODES to validate against:').'</b></td><td><tt>'.
 	    $env{'form.scantron_CODElist'}.'</tt></td></tr>';
     }
-    my $lastbubblepoints;
-    if ($env{'form.scantron_lastbubblepoints'} ne '') {
-        $lastbubblepoints =
-            '<tr><td><b>'.&mt('Hand-graded items: points from last bubble in row').'</b></td><td><tt>'.
-            $env{'form.scantron_lastbubblepoints'}.'</tt></td></tr>';
-    }
     return ('
 <p>
 <span class="LC_warning">
@@ -6608,11 +6122,11 @@ sub scantron_warning_screen {
 <table>
 <tr><td><b>'.&mt('Sequence to be Graded:').'</b></td><td>'.$title.'</td></tr>
 <tr><td><b>'.&mt('Data File that will be used:').'</b></td><td><tt>'.$env{'form.scantron_selectfile'}.'</tt></td></tr>
-'.$CODElist.$lastbubblepoints.'
+'.$CODElist.'
 </table>
 <br />
-<p> '.&mt("If this information is correct, please click on '[_1]'.",&mt($button_text)).'</p>
-<p> '.&mt("If something is incorrect, please click the 'Grading Menu' button to start over.").'</p>
+<p> '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'</p>
+<p> '.&mt('If something is incorrect, please click the \'Grading Menu\' button to start over.').'</p>
 
 <br />
 ');
@@ -6628,34 +6142,32 @@ sub scantron_warning_screen {
 =cut
 
 sub scantron_do_warning {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
     my $default_form_data=&defaultFormData($symb);
     $r->print(&scantron_form_start().$default_form_data);
     if ( $env{'form.selectpage'} eq '' ||
 	 $env{'form.scantron_selectfile'} eq '' ||
 	 $env{'form.scantron_format'} eq '' ) {
-	$r->print("<p>".&mt('You have forgotten to specify some information. Please go Back and try again.')."</p>");
+	$r->print("<p>".&mt('You have forgetten to specify some information. Please go Back and try again.')."</p>");
 	if ( $env{'form.selectpage'} eq '') {
 	    $r->print('<p><span class="LC_error">'.&mt('You have not selected a Sequence to grade').'</span></p>');
 	} 
 	if ( $env{'form.scantron_selectfile'} eq '') {
-	    $r->print('<p><span class="LC_error">'.&mt("You have not selected a file that contains the student's response data.").'</span></p>');
+	    $r->print('<p><span class="LC_error">'.&mt('You have not selected a file that contains the student\'s response data.').'</span></p>');
 	} 
 	if ( $env{'form.scantron_format'} eq '') {
-	    $r->print('<p><span class="LC_error">'.&mt("You have not selected the format of the student's response data.").'</span></p>');
+	    $r->print('<p><span class="LC_error">'.&mt('You have not selected a the format of the student\'s response data.').'</span></p>');
 	} 
     } else {
 	my $warning=&scantron_warning_screen('Grading: Validate Records');
-        my $bubbledbyhand=&hand_bubble_option();
 	$r->print('
-'.$warning.$bubbledbyhand.'
+'.$warning.'
 <input type="submit" name="submit" value="'.&mt('Grading: Validate Records').'" />
 <input type="hidden" name="command" value="scantron_validate" />
 ');
     }
-    $r->print("</form><br />".&show_grading_menu_form($symb));
+    $r->print("</form><br />");
     return '';
 }
 
@@ -6702,7 +6214,7 @@ SCANTRONFORM
 
 =item scantron_validate_file
 
-    Dispatch routine for doing validation of a bubblesheet data file.
+    Dispatch routine for doing validation of a bubble sheet data file.
 
     Also processes any necessary information resets that need to
     occur before validation begins (ignore previous corrections,
@@ -6711,8 +6223,7 @@ SCANTRONFORM
 =cut
 
 sub scantron_validate_file {
-    my ($r) = @_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb) = @_;
     if (!$symb) {return '';}
     my $default_form_data=&defaultFormData($symb);
     
@@ -6740,16 +6251,12 @@ sub scantron_validate_file {
     #get the student pick code ready
     $r->print(&Apache::loncommon::studentbrowser_javascript());
     my $nav_error;
-    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
-    my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
+    my $max_bubble=&scantron_get_maxbubble(\$nav_error);
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
     }
     my $result=&scantron_form_start($max_bubble).$default_form_data;
-    if ($env{'form.scantron_lastbubblepoints'} ne '') {
-        $result .= '<input type="hidden" name="scantron_lastbubblepoints" value="'.$env{'form.scantron_lastbubblepoints'}.'" />';
-    }
     $r->print($result);
     
     my @validate_phases=( 'sequence',
@@ -6808,7 +6315,7 @@ sub scantron_validate_file {
 	    $r->print(" ".&mt("this scanline saving it for later."));
 	}
     }
-    $r->print(" </form><br />".&show_grading_menu_form($symb));
+    $r->print(" </form><br />");
     return '';
 }
 
@@ -6817,7 +6324,7 @@ sub scantron_validate_file {
 
 =item scantron_remove_file
 
-   Removes the requested bubblesheet data file, makes sure that
+   Removes the requested bubble sheet data file, makes sure that
    scantron_original_<filename> is never removed
 
 
@@ -6842,7 +6349,7 @@ sub scantron_remove_file {
 
 =item scantron_remove_scan_data
 
-   Removes all scan_data correction for the requested bubblesheet
+   Removes all scan_data correction for the requested bubble sheet
    data file.  (In the case that both the are doing skipped records we need
    to remember the old skipped lines for the time being so that element
    persists for a while.)
@@ -6879,7 +6386,7 @@ sub scantron_remove_scan_data {
 
 =item scantron_getfile
 
-    Fetches the requested bubblesheet data file (all 3 versions), and
+    Fetches the requested bubble sheet data file (all 3 versions), and
     the scan_data hash
   
   Arguments:
@@ -6979,7 +6486,7 @@ sub lonnet_putfile {
 
 =item scantron_putfile
 
-    Stores the current version of the bubblesheet data files, and the
+    Stores the current version of the bubble sheet data files, and the
     scan_data hash. (Does not modify the original version only the
     corrected and skipped versions.
 
@@ -7073,7 +6580,7 @@ sub get_todo_count {
 
 =item scantron_put_line
 
-    Updates the 'corrected' or 'skipped' versions of the bubblesheet
+    Updates the 'corrected' or 'skipped' versions of the bubble sheet
     data file.
 
  Arguments:
@@ -7175,12 +6682,7 @@ sub scantron_validate_sequence {
 	my @resources=
 	    $navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0);
 	if (@resources) {
-	    $r->print('<p class="LC_warning">'
-               .&mt('Some resources in the sequence currently are not set to'
-                   .' exam mode. Grading these resources currently may not'
-                   .' work correctly.')
-               .'</p>'
-            );
+	    $r->print("<p>".&mt('Some resources in the sequence currently are not set to exam mode. Grading these resources currently may not work correctly.')."</p>");
 	    return (1,$currentphase);
 	}
     }
@@ -7202,7 +6704,7 @@ sub scantron_validate_ID {
     my ($scanlines,$scan_data)=&scantron_getfile();
 
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble_lines.. array.
+    &scantron_get_maxbubble(\$nav_error); # parse needs the bubble_lines.. array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return(1,$currentphase);
@@ -7267,28 +6769,19 @@ sub scantron_get_correction {
 #the previous one or the current one
 
     if ( $$scan_record{'scantron.PaperID'} =~ /\S/) {
-        $r->print(
-            '<p class="LC_warning">'
-           .&mt('An error was detected ([_1]) for PaperID [_2]',
-                "<b>$error</b>",
-                '<tt>'.$$scan_record{'scantron.PaperID'}.'</tt>')
-           ."</p> \n");
-    } else {
-        $r->print(
-            '<p class="LC_warning">'
-           .&mt('An error was detected ([_1]) in scanline [_2] [_3]',
-                "<b>$error</b>", $i, "<pre>$line</pre>")
-           ."</p> \n");
-    }
-    my $message =
-        '<p>'
-       .&mt('The ID on the form is [_1]',
-            "<tt>$$scan_record{'scantron.ID'}</tt>")
-       .'<br />'
-       .&mt('The name on the paper is [_1], [_2]',
-            $$scan_record{'scantron.LastName'},
-            $$scan_record{'scantron.FirstName'})
-       .'</p>';
+	$r->print("<p>".&mt("<b>An error was detected ($error)</b>".
+			    " for PaperID <tt>[_1]</tt>",
+			    $$scan_record{'scantron.PaperID'})."</p> \n");
+    } else {
+	$r->print("<p>".&mt("<b>An error was detected ($error)</b>".
+			    " in scanline [_1] <pre>[_2]</pre>",
+			    $i,$line)."</p> \n");
+    }
+    my $message="<p>".&mt("The ID on the form is  <tt>[_1]</tt><br />".
+			  "The name on the paper is [_2],[_3]",
+			  $$scan_record{'scantron.ID'},
+			  $$scan_record{'scantron.LastName'},
+			  $$scan_record{'scantron.FirstName'})."</p>";
 
     $r->print('<input type="hidden" name="scantron_corrections" value="'.$error.'" />'."\n");
     $r->print('<input type="hidden" name="scantron_line" value="'.$i.'" />'."\n");
@@ -7298,10 +6791,10 @@ sub scantron_get_correction {
 
     if ($error =~ /ID$/) {
 	if ($error eq 'incorrectID') {
-	    $r->print('<p class="LC_warning">'.&mt("The encoded ID is not in the classlist").
+	    $r->print("<p>".&mt("The encoded ID is not in the classlist").
 		      "</p>\n");
 	} elsif ($error eq 'duplicateID') {
-	    $r->print('<p class="LC_warning">'.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n");
+	    $r->print("<p>".&mt("The encoded ID has also been used by a previous paper [_1]",$arg)."</p>\n");
 	}
 	$r->print($message);
 	$r->print("<p>".&mt("How should I handle this?")." <br /> \n");
@@ -7317,15 +6810,14 @@ sub scantron_get_correction {
 	$r->print('</li>');
     } elsif ($error =~ /CODE$/) {
 	if ($error eq 'incorrectCODE') {
-	    $r->print('<p class="LC_warning">'.&mt("The encoded CODE is not in the list of possible CODEs.")."</p>\n");
+	    $r->print("<p>".&mt("The encoded CODE is not in the list of possible CODEs.")."</p>\n");
 	} elsif ($error eq 'duplicateCODE') {
-	    $r->print('<p class="LC_warning">'.&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n");
+	    $r->print("<p>".&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))."</p>\n");
 	}
-        $r->print("<p>".&mt('The CODE on the form is [_1]',
-                            "<tt>'$$scan_record{'scantron.CODE'}'</tt>")
-                 ."</p>\n");
+	$r->print("<p>".&mt("The CODE on the form is  <tt>'[_1]'</tt>",
+			    $$scan_record{'scantron.CODE'})."<br />\n");
 	$r->print($message);
-	$r->print("<p>".&mt("How should I handle this?")."</p>\n");
+	$r->print("<p>".&mt("How should I handle this?")." <br /> \n");
 	$r->print("\n<br /> ");
 	my $i=0;
 	if ($error eq 'incorrectCODE' 
@@ -7352,14 +6844,13 @@ sub scantron_get_correction {
 	    $r->print("
     <label>
         <input type='radio' name='scantron_CODE_resolution' value='use_unfound'$checked />
-       ".&mt("Use the CODE [_1] that was on the paper, ignoring the error.",
+       ".&mt("Use the CODE [_1] that is was on the paper, ignoring the error.",
 	     "<b><tt>".$$scan_record{'scantron.CODE'}."</tt></b>")."
     </label>");
 	    $r->print("\n<br />");
 	}
 
-	$r->print(<<ENDSCRIPT);
-<script type="text/javascript">
+	$r->print(&Apache::lonhtmlcommon::scripttag(<<ENDSCRIPT));
 function change_radio(field) {
     var slct=document.scantronupload.scantron_CODE_resolution;
     var i;
@@ -7367,7 +6858,6 @@ function change_radio(field) {
         if (slct[i].value==field) { slct[i].checked=true; }
     }
 }
-</script>
 ENDSCRIPT
 	my $href="/adm/pickcode?".
 	   "form=".&escape("scantronupload").
@@ -7392,7 +6882,7 @@ ENDSCRIPT
 	     "</label><input type='text' size='8' name='scantron_CODE_newvalue' onfocus=\"javascript:change_radio('use_typed')\" onkeypress=\"javascript:change_radio('use_typed')\" />"));
 	$r->print("\n<br /><br />");
     } elsif ($error eq 'doublebubble') {
-	$r->print('<p class="LC_warning">'.&mt("There have been multiple bubbles scanned for some question(s)")."</p>\n");
+	$r->print("<p>".&mt("There have been multiple bubbles scanned for some question(s)")."</p>\n");
 
 	# The form field scantron_questions is acutally a list of line numbers.
 	# represented by this form so:
@@ -7410,7 +6900,7 @@ ENDSCRIPT
 	}
         $r->print(&verify_bubbles_checked(@lines_to_correct));
     } elsif ($error eq 'missingbubble') {
-	$r->print('<p class="LC_warning">'.&mt("There have been [_1]no[_2] bubbles scanned for some question(s)",'<b>','</b>')."</p>\n");
+	$r->print("<p>".&mt("There have been <b>no</b> bubbles scanned for some question(s)")."</p>\n");
 	$r->print($message);
 	$r->print("<p>".&mt("Please indicate which bubble should be used for grading.")."</p>");
 	$r->print(&mt("Some questions have no scanned bubbles.")."\n");
@@ -7439,8 +6929,7 @@ sub verify_bubbles_checked {
     my (@ansnums) = @_;
     my $ansnumstr = join('","',@ansnums);
     my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines.");
-    my $output = (<<ENDSCRIPT);
-<script type="text/javascript">
+    my $output = &Apache::lonhtmlcommon::scripttag((<<ENDSCRIPT));
 function verify_bubble_radio(form) {
     var ansnumArray = new Array ("$ansnumstr");
     var need_bubble_count = 0;
@@ -7463,7 +6952,6 @@ function verify_bubble_radio(form) {
     }
     form.submit(); 
 }
-</script>
 ENDSCRIPT
     return $output;
 }
@@ -7615,19 +7103,7 @@ sub scantron_bubble_selector {
     my $max=$$scan_config{'Qlength'};
 
     my $scmode=$$scan_config{'Qon'};
-    if ($scmode eq 'number' || $scmode eq 'letter') {
-        if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) &&
-            ($$scan_config{'BubblesPerRow'} > 0)) {
-            $max=$$scan_config{'BubblesPerRow'};
-            if (($scmode eq 'number') && ($max > 10)) {
-                $max = 10;
-            } elsif (($scmode eq 'letter') && $max > 26) {
-                $max = 26;
-            }
-        } else {
-            $max = 10;
-        }
-    }
+    if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; }	     
 
     my @alphabet=('A'..'Z');
     $r->print(&Apache::loncommon::start_data_table().
@@ -7782,7 +7258,7 @@ sub scantron_validate_CODE {
     my %allcodes=&get_codes();
 
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the lines per response array.
+    &scantron_get_maxbubble(\$nav_error); # parse needs the lines per response array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return(1,$currentphase);
@@ -7841,7 +7317,7 @@ sub scantron_validate_doublebubble {
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble line array.
+    &scantron_get_maxbubble(\$nav_error); # parse needs the bubble line array.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return(1,$currentphase);
@@ -7863,7 +7339,7 @@ sub scantron_validate_doublebubble {
 
 
 sub scantron_get_maxbubble {
-    my ($nav_error,$scantron_config) = @_;
+    my ($nav_error) = @_;
     if (defined($env{'form.scantron_maxbubble'}) &&
 	$env{'form.scantron_maxbubble'}) {
 	&restore_bubble_lines();
@@ -7882,7 +7358,6 @@ sub scantron_get_maxbubble {
     }
     my $map=$navmap->getResourceByUrl($sequence);
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    my $bubbles_per_row = &bubblesheet_bubbles_per_row($scantron_config);
 
     &Apache::lonxml::clear_problem_counter();
 
@@ -7898,8 +7373,7 @@ sub scantron_get_maxbubble {
     my $response_number = 0;
     my $bubble_line     = 0;
     foreach my $resource (@resources) {
-        my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,
-                                                          $udom,$bubbles_per_row);
+        my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom);
         if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
 	    foreach my $part_id (@{$parts}) {
                 my $lines;
@@ -7928,10 +7402,9 @@ sub scantron_get_maxbubble {
                     if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') {
                         $numshown = scalar(@{$analysis->{$part_id.'.shown'}});
                     }
-                    my $bubbles_per_row =
-                        &bubblesheet_bubbles_per_row($scantron_config);
-                    my $inner_bubble_lines = int($numbub/$bubbles_per_row);
-                    if (($numbub % $bubbles_per_row) != 0) {
+                    my $bubbles_per_line = 10;
+                    my $inner_bubble_lines = int($numbub/$bubbles_per_line);
+                    if (($numbub % $bubbles_per_line) != 0) {
                         $inner_bubble_lines++;
                     }
                     for (my $i=0; $i<$numshown; $i++) {
@@ -7942,7 +7415,7 @@ sub scantron_get_maxbubble {
                     $lines = $numshown * $inner_bubble_lines;
                 } else {
                     $lines = $analysis->{"$part_id.bubble_lines"};
-                }
+                } 
 
                 $first_bubble_line{$response_number} = $bubble_line;
 	        $bubble_lines_per_response{$response_number} = $lines;
@@ -7963,18 +7436,6 @@ sub scantron_get_maxbubble {
     return $env{'form.scantron_maxbubble'};
 }
 
-sub bubblesheet_bubbles_per_row {
-    my ($scantron_config) = @_;
-    my $bubbles_per_row;
-    if (ref($scantron_config) eq 'HASH') {
-        $bubbles_per_row = $scantron_config->{'BubblesPerRow'};
-    }
-    if ((!$bubbles_per_row) || ($bubbles_per_row < 1)) {
-        $bubbles_per_row = 10;
-    }
-    return $bubbles_per_row;
-}
-
 sub scantron_validate_missingbubbles {
     my ($r,$currentphase) = @_;
     #get student info
@@ -7985,7 +7446,7 @@ sub scantron_validate_missingbubbles {
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $nav_error;
-    my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
+    my $max_bubble=&scantron_get_maxbubble(\$nav_error);
     if ($nav_error) {
         return(1,$currentphase);
     }
@@ -8032,55 +7493,17 @@ sub scantron_validate_missingbubbles {
     return (0,$currentphase+1);
 }
 
-sub hand_bubble_option {
-    my (undef, undef, $sequence) =
-        &Apache::lonnet::decode_symb($env{'form.selectpage'});
-    return if ($sequence eq '');
-    my $navmap = Apache::lonnavmaps::navmap->new();
-    unless (ref($navmap)) {
-        return;
-    }
-    my $needs_hand_bubbles;
-    my $map=$navmap->getResourceByUrl($sequence);
-    my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    foreach my $res (@resources) {
-        if (ref($res)) {
-            if ($res->is_problem()) {
-                my $partlist = $res->parts();
-                foreach my $part (@{ $partlist }) {
-                    my @types = $res->responseType($part);
-                    if (grep(/^(chem|essay|image|formula|math|string|functionplot)$/,@types)) {
-                        $needs_hand_bubbles = 1;
-                        last;
-                    }
-                }
-            }
-        }
-    }
-    if ($needs_hand_bubbles) {
-        my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
-        my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
-        return &mt('The sequence to be graded contains response types which are handgraded.').'<p>'.
-               &mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?','<br />').
-               '<label><input type="radio" name="scantron_lastbubblepoints" value="'.$bubbles_per_row.'" checked="checked" />'.&mt('[quant,_1,point]',$bubbles_per_row).'</label>&nbsp;'.&mt('or').'&nbsp;'.
-               '<label><input type="radio" name="scantron_lastbubblepoints" value="0"/>0 points</label></p>';
-    }
-    return;
-}
 
 sub scantron_process_students {
-    my ($r) = @_;
+    my ($r,$symb) = @_;
 
     my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($env{'form.selectpage'});
-    my ($symb)=&get_symb($r);
     if (!$symb) {
 	return '';
     }
     my $default_form_data=&defaultFormData($symb);
 
     my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
-    my $bubbles_per_row =
-        &bubblesheet_bubbles_per_row(\%scantron_config);
     my ($scanlines,$scan_data)=&scantron_getfile();
     my $classlist=&Apache::loncoursedata::get_classlist();
     my %idmap=&username_to_idmap($classlist);
@@ -8090,29 +7513,22 @@ sub scantron_process_students {
         return '';
     }  
     my $map=$navmap->getResourceByUrl($sequence);
-    my $randomorder;
-    if (ref($map)) {
-        $randomorder = $map->randomorder();
-    }
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    my (%grader_partids_by_symb,%grader_randomlists_by_symb,%ordered);
+    my (%grader_partids_by_symb,%grader_randomlists_by_symb);
     &graders_resources_pass(\@resources,\%grader_partids_by_symb,
-                            \%grader_randomlists_by_symb,$bubbles_per_row);
-    my ($resource_error,%symb_to_resource,@master_seq);
+                            \%grader_randomlists_by_symb);
+    my $resource_error;
     foreach my $resource (@resources) {
         my $ressymb;
         if (ref($resource)) {
             $ressymb = $resource->symb();
-            push(@master_seq,$ressymb);
-            $symb_to_resource{$ressymb} = $resource;
         } else {
             $resource_error = 1;
             last;
         }
         my ($analysis,$parts) =
             &scantron_partids_tograde($resource,$env{'request.course.id'},
-                                      $env{'user.name'},$env{'user.domain'},
-                                      1,$bubbles_per_row);
+                                      $env{'user.name'},$env{'user.domain'},1);
         $grader_partids_by_symb{$ressymb} = $parts;
         if (ref($analysis) eq 'HASH') {
             if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
@@ -8139,7 +7555,9 @@ SCANTRONFORM
     
     my $lock=&Apache::lonnet::set_lock(&mt('Grading bubblesheet exam'));
     my $count=&get_todo_count($scanlines,$scan_data);
-    my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count);
+    my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet Status',
+ 				    'Bubblesheet Progress',$count,
+				    'inline',undef,'scantronupload');
     &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,
 					  'Processing first student');
     $r->print('<br />');
@@ -8148,7 +7566,7 @@ SCANTRONFORM
     my $started;
 
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
+    &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
@@ -8160,7 +7578,6 @@ SCANTRONFORM
     if ($ssi_error) {
 	$r->print("</form>");
 	&ssi_print_error($r);
-	$r->print(&show_grading_menu_form($symb));
         &Apache::lonnet::remove_lock($lock);
 	return '';		# Dunno why the other returns return '' rather than just returning.
     }
@@ -8191,26 +7608,10 @@ SCANTRONFORM
  				'Student '.$uname.' has multiple sheets',2);
  	    next;
  	}
-        my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION];
-        my $user = $uname.':'.$usec;
   	($uname,$udom)=split(/:/,$uname);
 
-        my $scancode;
-        if ((exists($scan_record->{'scantron.CODE'})) &&
-            (&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) {
-            $scancode = $scan_record->{'scantron.CODE'};
-        } else {
-            $scancode = '';
-        }
-
-        my @mapresources = @resources;
-        if ($randomorder) {
-            @mapresources =
-                &users_order($user,$scancode,$sequence,\@master_seq,\%ordered,
-                             \%symb_to_resource);
-        }
         my (%partids_by_symb,$res_error);
-        foreach my $resource (@mapresources) {
+        foreach my $resource (@resources) {
             my $ressymb;
             if (ref($resource)) {
                 $ressymb = $resource->symb();
@@ -8221,8 +7622,7 @@ SCANTRONFORM
             if ((exists($grader_randomlists_by_symb{$ressymb})) ||
                 (ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) {
                 my ($analysis,$parts) =
-                    &scantron_partids_tograde($resource,$env{'request.course.id'},
-                                              $uname,$udom,undef,$bubbles_per_row);
+                    &scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom);
                 $partids_by_symb{$ressymb} = $parts;
             } else {
                 $partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb};
@@ -8242,13 +7642,19 @@ SCANTRONFORM
 	    &scantron_putfile($scanlines,$scan_data);
 	}
 	
+        my $scancode;
+        if ((exists($scan_record->{'scantron.CODE'})) &&
+            (&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) {
+            $scancode = $scan_record->{'scantron.CODE'};
+        } else {
+            $scancode = '';
+        }
+
         if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
-                                   \@mapresources,\%partids_by_symb,
-                                   $bubbles_per_row) eq 'ssi_error') {
+                                   \@resources,\%partids_by_symb) eq 'ssi_error') {
             $ssi_error = 0; # So end of handler error message does not trigger.
             $r->print("</form>");
             &ssi_print_error($r);
-            $r->print(&show_grading_menu_form($symb));
             &Apache::lonnet::remove_lock($lock);
             return '';      # Why return ''?  Beats me.
         }
@@ -8261,7 +7667,7 @@ SCANTRONFORM
             $studentdata =~ s/\r$//;
             my $studentrecord = '';
             my $counter = -1;
-            foreach my $resource (@mapresources) {
+            foreach my $resource (@resources) {
                 my $ressymb = $resource->symb();
                 ($counter,my $recording) =
                     &verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'},
@@ -8272,19 +7678,17 @@ SCANTRONFORM
             if ($studentrecord ne $studentdata) {
                 &Apache::lonxml::clear_problem_counter();
                 if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
-                                           \@mapresources,\%partids_by_symb,
-                                           $bubbles_per_row) eq 'ssi_error') {
+                                           \@resources,\%partids_by_symb) eq 'ssi_error') {
                     $ssi_error = 0; # So end of handler error message does not trigger.
                     $r->print("</form>");
                     &ssi_print_error($r);
-                    $r->print(&show_grading_menu_form($symb));
                     &Apache::lonnet::remove_lock($lock);
                     delete($completedstudents{$uname});
                     return '';
                 }
                 $counter = -1;
                 $studentrecord = '';
-                foreach my $resource (@mapresources) {
+                foreach my $resource (@resources) {
                     my $ressymb = $resource->symb();
                     ($counter,my $recording) =
                         &verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'},
@@ -8293,12 +7697,12 @@ SCANTRONFORM
                     $studentrecord .= $recording;
                 }
                 if ($studentrecord ne $studentdata) {
-                    $r->print('<p><span class="LC_warning">');
+                    $r->print('<p><span class="LC_error">');
                     if ($scancode eq '') {
-                        $r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2].',
+                        $r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2].',
                                   $uname.':'.$udom,$scan_record->{'scantron.ID'}));
                     } else {
-                        $r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2] and CODE: [_3].',
+                        $r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2] and CODE: [_3].',
                                   $uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode));
                     }
                     $r->print('</span><br />'.&Apache::loncommon::start_data_table()."\n".
@@ -8306,11 +7710,11 @@ SCANTRONFORM
                               '<th>'.&mt('Source').'</th><th>'.&mt('Bubbled responses').'</th>'.
                               &Apache::loncommon::end_data_table_header_row()."\n".
                               &Apache::loncommon::start_data_table_row().
-                              '<td>'.&mt('Bubblesheet').'</td>'.
+                              '<td>'.&mt('Bubble Sheet').'</td>'.
                               '<td><span class="LC_nobreak">'.$studentdata.'</span></td>'.
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::start_data_table_row().
-                              '<td>'.&mt('Stored submissions').'</td>'.
+                              '<td>Stored submissions</td>'.
                               '<td><span class="LC_nobreak">'.$studentrecord.'</span></td>'."\n".
                               &Apache::loncommon::end_data_table_row().
                               &Apache::loncommon::end_data_table().'</p>');
@@ -8333,21 +7737,18 @@ SCANTRONFORM
 #    $r->print("<p>took $lasttime</p>");
 
     $r->print("</form>");
-    $r->print(&show_grading_menu_form($symb));
     return '';
 }
 
 sub graders_resources_pass {
-    my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb,
-        $bubbles_per_row) = @_;
+    my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb) = @_;
     if ((ref($resources) eq 'ARRAY') && (ref($grader_partids_by_symb)) && 
         (ref($grader_randomlists_by_symb) eq 'HASH')) {
         foreach my $resource (@{$resources}) {
             my $ressymb = $resource->symb();
             my ($analysis,$parts) =
                 &scantron_partids_tograde($resource,$env{'request.course.id'},
-                                          $env{'user.name'},$env{'user.domain'},
-                                          1,$bubbles_per_row);
+                                          $env{'user.name'},$env{'user.domain'},1);
             $grader_partids_by_symb->{$ressymb} = $parts;
             if (ref($analysis) eq 'HASH') {
                 if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
@@ -8360,55 +7761,8 @@ sub graders_resources_pass {
     return;
 }
 
-=pod
-
-=item users_order
-
-  Returns array of resources in current map, ordered based on either CODE,
-  if this is a CODEd exam, or based on student's identity if this is a
-  "NAMEd" exam.
-
-  Should be used when randomorder applied when the corresponding exam was
-  printed, prior to students completing bubblesheets for the version of the
-  exam the student received.
-
-=cut
-
-sub users_order  {
-    my ($user,$scancode,$mapurl,$master_seq,$ordered,$symb_to_resource) = @_;
-    my @mapresources;
-    unless ((ref($ordered) eq 'HASH') && (ref($symb_to_resource) eq 'HASH')) {
-        return @mapresources;
-    }
-    if (($scancode) && (ref($ordered->{$scancode}) eq 'ARRAY')) {
-        @mapresources = @{$ordered->{$scancode}};
-    } elsif ($scancode) {
-        $env{'form.CODE'} = $scancode;
-        my $actual_seq =
-            &Apache::lonprintout::master_seq_to_person_seq($mapurl,
-                                                           $master_seq,
-                                                           $user,$scancode);
-        if (ref($actual_seq) eq 'ARRAY') {
-            @{$ordered->{$scancode}} =
-                map { $symb_to_resource->{$_}; } @{$actual_seq};
-            @mapresources = @{$ordered->{$scancode}};
-        }
-        delete($env{'form.CODE'});
-    } else {
-        my $actual_seq =
-            &Apache::lonprintout::master_seq_to_person_seq($mapurl,
-                                                           $master_seq,
-                                                           $user);
-        if (ref($actual_seq) eq 'ARRAY') {
-            @mapresources =
-                map { $symb_to_resource->{$_}; } @{$actual_seq};
-        }
-     }
-     return @mapresources;
-}
-
 sub grade_student_bubbles {
-    my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row) = @_;
+    my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts) = @_;
     if (ref($resources) eq 'ARRAY') {
         my $count = 0;
         foreach my $resource (@{$resources}) {
@@ -8421,12 +7775,6 @@ sub grade_student_bubbles {
                         'grade_symb'     => $ressymb,
                         'CODE'           => $scancode
                        );
-            if ($bubbles_per_row ne '') {
-                $form{'bubbles_per_row'} = $bubbles_per_row;
-            }
-            if ($env{'form.scantron_lastbubblepoints'} ne '') {
-                $form{'scantron_lastbubblepoints'} = $env{'form.scantron_lastbubblepoints'};
-            }
             if (ref($parts) eq 'HASH') {
                 if (ref($parts->{$ressymb}) eq 'ARRAY') {
                     foreach my $part (@{$parts->{$ressymb}}) {
@@ -8445,7 +7793,7 @@ sub grade_student_bubbles {
 }
 
 sub scantron_upload_scantron_data {
-    my ($r)=@_;
+    my ($r,$symb)=@_;
     my $dom = $env{'request.role.domain'};
     my $domdesc = &Apache::lonnet::domain($dom,'description');
     $r->print(&Apache::loncommon::coursebrowser_javascript($dom));
@@ -8453,13 +7801,11 @@ sub scantron_upload_scantron_data {
 							  'domainid',
 							  'coursename',$dom);
     my $syllabuslink = '<a href="javascript:ToSyllabus();">'.&mt('Syllabus').'</a>'.
-                       ('&nbsp'x2).&mt('(shows course personnel)');
-    my ($symb) = &get_symb($r,1);
+                       ('&nbsp'x2).&mt('(shows course personnel)'); 
     my $default_form_data=&defaultFormData($symb);
     my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.');
     my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded.");
-    $r->print('
-<script type="text/javascript" language="javascript">
+    $r->print(&Apache::lonhtmlcommon::scripttag('
     function checkUpload(formname) {
 	if (formname.upfile.value == "") {
 	    alert("'.$nofile_alert.'");
@@ -8486,9 +7832,9 @@ sub scantron_upload_scantron_data {
         return;
     }
 
-</script>
-
-<h3>'.&mt('Send bubblesheet data to a course').'</h3>
+'));
+    $r->print('
+<h3>'.&mt('Send scanned bubblesheet data to a course').'</h3>
 
 <form enctype="multipart/form-data" action="/adm/grades" name="rules" method="post">
 '.$default_form_data.
@@ -8516,8 +7862,7 @@ sub scantron_upload_scantron_data {
 
 
 sub scantron_upload_scantron_data_save {
-    my($r)=@_;
-    my ($symb)=&get_symb($r,1);
+    my($r,$symb)=@_;
     my $doanotherupload=
 	'<br /><form action="/adm/grades" method="post">'."\n".
 	'<input type="hidden" name="command" value="scantronupload" />'."\n".
@@ -8527,9 +7872,7 @@ sub scantron_upload_scantron_data_save {
 	!&Apache::lonnet::allowed('usc',
 			    $env{'form.domainid'}.'_'.$env{'form.courseid'})) {
 	$r->print(&mt("You are not allowed to upload bubblesheet data to the requested course.")."<br />");
-	if ($symb) {
-	    $r->print(&show_grading_menu_form($symb));
-	} else {
+	unless ($symb) {
 	    $r->print($doanotherupload);
 	}
 	return '';
@@ -8557,7 +7900,7 @@ sub scantron_upload_scantron_data_save {
 	}
     }
     if ($symb) {
-	$r->print(&scantron_selectphase($r,$uploadedfile));
+	$r->print(&scantron_selectphase($r,$uploadedfile,$symb));
     } else {
 	$r->print($doanotherupload);
     }
@@ -8659,8 +8002,7 @@ sub valid_file {
 }
 
 sub scantron_download_scantron_data {
-    my ($r)=@_;
-    my ($symb) = &get_symb($r,1);
+    my ($r,$symb)=@_;
     my $default_form_data=&defaultFormData($symb);
     my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -8671,7 +8013,6 @@ sub scantron_download_scantron_data {
 	    '.&mt('The requested file name was invalid.').'
         </p>
 ');
-	$r->print(&show_grading_menu_form($symb));
 	return;
     }
     my $orig='/uploaded/'.$cdom.'/'.$cname.'/scantron_orig_'.$file;
@@ -8694,15 +8035,12 @@ sub scantron_download_scantron_data {
 	      '<a href="'.$skipped.'">','</a>').'
     </p>
 ');
-    $r->print(&show_grading_menu_form($symb));
     return '';
 }
 
 sub checkscantron_results {
-    my ($r) = @_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb) = @_;
     if (!$symb) {return '';}
-    my $grading_menu_button=&show_grading_menu_form($symb);
     my $cid = $env{'request.course.id'};
     my %lettdig = &letter_to_digits();
     my $numletts = scalar(keys(%lettdig));
@@ -8712,7 +8050,6 @@ sub checkscantron_results {
     my %record;
     my %scantron_config =
         &Apache::grades::get_scantron_config($env{'form.scantron_format'});
-    my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
     my ($scanlines,$scan_data)=&Apache::grades::scantron_getfile();
     my $classlist=&Apache::loncoursedata::get_classlist();
     my %idmap=&Apache::grades::username_to_idmap($classlist);
@@ -8722,21 +8059,10 @@ sub checkscantron_results {
         return '';
     }
     my $map=$navmap->getResourceByUrl($sequence);
-    my ($randomorder,@master_seq,%symb_to_resource);
-    if (ref($map)) {
-        $randomorder=$map->randomorder();
-    }
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
-    foreach my $resource (@resources) {
-        if (ref($resource)) {
-            my $ressymb = $resource->symb();
-            push(@master_seq,$ressymb);
-            $symb_to_resource{$ressymb} = $resource;
-        }
-    }
     my (%grader_partids_by_symb,%grader_randomlists_by_symb);
-    &graders_resources_pass(\@resources,\%grader_partids_by_symb,
-                            \%grader_randomlists_by_symb,$bubbles_per_row);
+    &graders_resources_pass(\@resources,\%grader_partids_by_symb,                             \%grader_randomlists_by_symb);
+
     my ($uname,$udom);
     my (%scandata,%lastname,%bylast);
     $r->print('
@@ -8746,10 +8072,12 @@ sub checkscantron_results {
     my %completedstudents;
 
     my $count=&Apache::grades::get_todo_count($scanlines,$scan_data);
-    my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$count);
-    my ($username,$domain,$started,%ordered);
+    my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Bubblesheet/Submissions Comparison Status',
+                                    'Progress of Bubblesheet Data/Submission Records Comparison',$count,
+                                    'inline',undef,'checkscantron');
+    my ($username,$domain,$started);
     my $nav_error;
-    &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
+    &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse.
     if ($nav_error) {
         $r->print(&navmap_errormsg());
         return '';
@@ -8791,34 +8119,15 @@ sub checkscantron_results {
         $scandata{$pid} = substr($line,$scantron_config{'Qstart'}-1,$lastpos);
         chomp($scandata{$pid});
         $scandata{$pid} =~ s/\r$//;
-        my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION];
-        my $user = $uname.':'.$usec;
         ($username,$domain)=split(/:/,$uname);
-
-        my $scancode;
-        if ((exists($scan_record->{'scantron.CODE'})) &&
-            (&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) {
-            $scancode = $scan_record->{'scantron.CODE'};
-        } else {
-            $scancode = '';
-        }
-
-        my @mapresources = @resources;
-        if ($randomorder) {
-            @mapresources =
-                &users_order($user,$scancode,$sequence,\@master_seq,\%ordered,
-                             \%symb_to_resource);
-        }
         my $counter = -1;
-        foreach my $resource (@mapresources) {
+        foreach my $resource (@resources) {
             my $parts;
             my $ressymb = $resource->symb();
             if ((exists($grader_randomlists_by_symb{$ressymb})) ||
                 (ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) {
                 (my $analysis,$parts) =
-                    &scantron_partids_tograde($resource,$env{'request.course.id'},
-                                              $username,$domain,undef,
-                                              $bubbles_per_row);
+                    &scantron_partids_tograde($resource,$env{'request.course.id'},$username,$domain);
             } else {
                 $parts = $grader_partids_by_symb{$ressymb};
             }
@@ -8863,19 +8172,8 @@ sub checkscantron_results {
             }
         }
     }
-    $r->print('<p>'.
-              &mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for [_1][quant,_2,student][_3] ([quant,_4,bubblesheet line] per student).',
-                  '<b>',
-                  $numstudents,
-                  '</b>',
-                  $env{'form.scantron_maxbubble'}).
-              '</p>'
-    );
-    $r->print('<p>'
-             .&mt('Exact matches for [_1][quant,_2,student][_3].','<b>',$passed,'</b>')
-             .'<br />'
-             .&mt('Discrepancies detected for [_1][quant,_2,student][_3].','<b>',$failed,'</b>')
-             .'</p>');
+    $r->print('<p>'.&mt('Comparison of bubblesheet data (including corrections) with corresponding submission records (most recent submission) for <b>[quant,_1,student]</b>  ([_2] scantron lines/student).',$numstudents,$env{'form.scantron_maxbubble'}).'</p>');
+    $r->print('<p>'.&mt('Exact matches for <b>[quant,_1,student]</b>.',$passed).'<br />'.&mt('Discrepancies detected for <b>[quant,_1,student]</b>.',$failed).'</p>');
     if ($passed) {
         $r->print(&mt('Students with exact correspondence between bubblesheet data and submissions are as follows:').'<br /><br />');
         $r->print(&Apache::loncommon::start_data_table()."\n".
@@ -8895,7 +8193,7 @@ sub checkscantron_results {
                  &Apache::loncommon::end_data_table()).'<br />'.
                  &mt('Differences can occur if submissions were modified using manual grading after a bubblesheet grading pass.').'<br />'.&mt('If unexpected discrepancies were detected, it is recommended that you inspect the original bubblesheets.');  
     }
-    $r->print('</form><br />'.$grading_menu_button);
+    $r->print('</form><br />');
     return;
 }
 
@@ -9037,55 +8335,34 @@ sub letter_to_digits {
 
 #-------------------------- Menu interface -------------------------
 #
-#--- Show a Grading Menu button - Calls the next routine ---
-sub show_grading_menu_form {
-    my ($symb)=@_;
-    my $result.='<br /><form action="/adm/grades" method="post">'."\n".
-	'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="saveState"  value="'.$env{'form.saveState'}.'" />'."\n".
-	'<input type="hidden" name="command" value="gradingmenu" />'."\n".
-	'<input type="submit" name="submit" value="'.&mt('Grading Menu').'" />'."\n".
-	'</form>'."\n";
-    return $result;
-}
-
-# -- Retrieve choices for grading form
-sub savedState {
-    my %savedState = ();
-    if ($env{'form.saveState'}) {
-	foreach (split(/:/,$env{'form.saveState'})) {
-	    my ($key,$value) = split(/=/,$_,2);
-	    $savedState{$key} = $value;
-	}
-    }
-    return \%savedState;
-}
-
 #--- Href with symb and command ---
 
 sub href_symb_cmd {
     my ($symb,$cmd)=@_;
-    return '/adm/grades?symb='.&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'<>&"').'&amp;command='.$cmd;
+    return '/adm/grades?symb='.&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'<>&"').'&command='.$cmd;
 }
 
 sub grading_menu {
-    my ($request) = @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb) = @_;
     if (!$symb) {return '';}
-    my $probTitle = &Apache::lonnet::gettitle($symb);
-    my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle);
 
-    $request->print($table);
     my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb),
-                  'handgrade'=>$hdgrade,
-                  'probTitle'=>$probTitle,
-                  'command'=>'submit_options',
-                  'saveState'=>"",
-                  'gradingMenu'=>1,
-                  'showgrading'=>"yes");
-    
-    my $url1 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+                  'command'=>'individual');
     
+    my $url1a = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'}='ungraded';
+    my $url1b=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'}='table';
+    my $url1c=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'}='all_for_one';
+    my $url1d=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'}='downloadfilesselect';
+    my $url1e=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
     $fields{'command'} = 'csvform';
     my $url2 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
     
@@ -9094,15 +8371,46 @@ sub grading_menu {
     
     $fields{'command'} = 'scantron_selectphase';
     my $url4 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+
+    $fields{'command'} = 'initialverifyreceipt';
+    my $url5 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
     
-    my @menu = ({	categorytitle=>'Course Grading',
+    my @menu = ({	categorytitle=>'Hand Grading',
             items =>[
-                        {	linktext => 'Manual Grading/View Submissions',
-                    		url => $url1,
+                        {	linktext => 'Select individual students to grade',
+                    		url => $url1a,
                     		permission => 'F',
                     		icon => 'edit-find-replace.png',
-                    		linktitle => 'Start the process of hand grading submissions.'
+                    		linktitle => 'Grade current resource for a selection of students.'
+                        }, 
+                        {       linktext => 'Grade ungraded submissions.',
+                                url => $url1b,
+                                permission => 'F',
+                                icon => 'edit-find-replace.png',
+                                linktitle => 'Grade all submissions that have not been graded yet.'
+                        },
+
+                        {       linktext => 'Grading table',
+                                url => $url1c,
+                                permission => 'F',
+                                icon => 'edit-find-replace.png',
+                                linktitle => 'Grade current resource for all students.'
                         },
+                        {       linktext => 'Grade page/folder for one student',
+                                url => $url1d,
+                                permission => 'F',
+                                icon => 'edit-find-replace.png',
+                                linktitle => 'Grade all resources in current page/sequence/folder for one student.'
+                        },
+                        {       linktext => 'Download submissions',
+                                url => $url1e,
+                                permission => 'F',
+                                icon => 'edit-find-replace.png',
+                                linktitle => 'Download all students submissions.'
+                        }]},
+                         { categorytitle=>'Automated Grading',
+               items =>[
+
                 	    {	linktext => 'Upload Scores',
                     		url => $url2,
                     		permission => 'F',
@@ -9119,167 +8427,131 @@ sub grading_menu {
                     		url => $url4,
                     		permission => 'F',
                     		icon => 'stat.png',
-                    		linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.'
-                	    }
+                    		linktitle => 'Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.'
+                	    },
+                            {   linktext => 'Verify Receipt Number',
+                                url => $url5,
+                                permission => 'F',
+                                icon => 'edit-find-replace.png',
+                                linktitle => 'Verify a system-generated receipt number for correct problem solution.'
+                            }
+
                     ]
             });
 
-    #$fields{'command'} = 'verify';
-    #$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
-    #
     # Create the menu
     my $Str;
-    # $Str .= '<h2>'.&mt('Please select a grading task').'</h2>';
     $Str .= '<form method="post" action="" name="gradingMenu">';
     $Str .= '<input type="hidden" name="command" value="" />'.
-    	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="handgrade"   value="'.$hdgrade.'" />'."\n".
-	'<input type="hidden" name="probTitle"   value="'.$probTitle.'" />'."\n".
-	'<input type="hidden" name="saveState"   value="" />'."\n".
-	'<input type="hidden" name="gradingMenu" value="1" />'."\n".
-	'<input type="hidden" name="showgrading" value="yes" />'."\n";
-
-    $Str .= Apache::lonhtmlcommon::generate_menu(@menu);
-    #$menudata->{'jscript'}
-    $Str .='<hr /><input type="button" value="'.&mt('Verify Receipt No.').'" '.
-        ' onclick="javascript:checkChoice(document.forms.gradingMenu,\'5\',\'verify\')" '.
-        ' /> '.
-        &Apache::lonnet::recprefix($env{'request.course.id'}).
-        '-<input type="text" name="receipt" size="4" onchange="javascript:checkReceiptNo(this.form,\'OK\')" />';
+    	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
 
-    $Str .="</form>\n";
-    my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box.");
-    $request->print(<<GRADINGMENUJS);
-<script type="text/javascript" language="javascript">
-    function checkChoice(formname,val,cmdx) {
-	if (val <= 2) {
-	    var cmd = radioSelection(formname.radioChoice);
-	    var cmdsave = cmd;
-	} else {
-	    cmd = cmdx;
-	    cmdsave = 'submission';
-	}
-	formname.command.value = cmd;
-	if (val < 5) formname.submit();
-	if (val == 5) {
-	    if (!checkReceiptNo(formname,'notOK')) { 
-	        return false;
-	    } else {
-	        formname.submit();
-	    }
-	}
-    }
+    $Str .= &Apache::lonhtmlcommon::generate_menu(@menu);
+    return $Str;    
+}
 
-    function checkReceiptNo(formname,nospace) {
-	var receiptNo = formname.receipt.value;
-	var checkOpt = false;
-	if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;}
-	if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;}
-	if (checkOpt) {
-	    alert("$receiptalert");
-	    formname.receipt.value = "";
-	    formname.receipt.focus();
-	    return false;
-	}
-	return true;
-    }
-</script>
-GRADINGMENUJS
+
+sub ungraded {
+    my ($request)=@_;
+    &submit_options($request);
+}
+
+sub submit_options_sequence {
+    my ($request,$symb) = @_;
+    if (!$symb) {return '';}
     &commonJSfunctions($request);
-    return $Str;    
+    my $result;
+
+    $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+    $result.=&selectfield(0).
+            '<input type="hidden" name="command" value="pickStudentPage" />
+            <div>
+              <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+        </div>
+  </form>';
+    return $result;
 }
 
+sub submit_options_table {
+    my ($request,$symb) = @_;
+    if (!$symb) {return '';}
+    &commonJSfunctions($request);
+    my $result;
+
+    $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+
+    $result.=&selectfield(0).
+            '<input type="hidden" name="command" value="viewgrades" />
+            <div>
+              <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+        </div>
+  </form>';
+    return $result;
+}
+
+sub submit_options_download {
+    my ($request,$symb) = @_;
+    if (!$symb) {return '';}
+
+    &commonJSfunctions($request);
+
+    my $result='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
+        '<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+    $result.='
+<h2>
+  '.&mt('Select Students for Which to Download Submissions').'
+</h2>'.&selectfield(1).'
+                <input type="hidden" name="command" value="downloadfileslink" /> 
+              <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+          </div>
+
+
+  </form>';
+    return $result;
+}
 
 #--- Displays the submissions first page -------
 sub submit_options {
-    my ($request) = @_;
-    my ($symb)=&get_symb($request);
+    my ($request,$symb) = @_;
     if (!$symb) {return '';}
-    my $probTitle = &Apache::lonnet::gettitle($symb);
 
-    my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box."); 
-    $request->print(<<GRADINGMENUJS);
-<script type="text/javascript" language="javascript">
-    function checkChoice(formname,val,cmdx) {
-	if (val <= 2) {
-	    var cmd = radioSelection(formname.radioChoice);
-	    var cmdsave = cmd;
-	} else {
-	    cmd = cmdx;
-	    cmdsave = 'submission';
-	}
-	formname.command.value = cmd;
-	formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+
-	    ":saveSub="+pullDownSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status);
-	if (val < 5) formname.submit();
-	if (val == 5) {
-	    if (!checkReceiptNo(formname,'notOK')) { return false;}
-	    formname.submit();
-	}
-	if (val < 7) formname.submit();
-    }
-
-    function checkReceiptNo(formname,nospace) {
-	var receiptNo = formname.receipt.value;
-	var checkOpt = false;
-	if (nospace == "OK" && isNaN(receiptNo)) {checkOpt = true;}
-	if (nospace == "notOK" && (isNaN(receiptNo) || receiptNo == "")) {checkOpt = true;}
-	if (checkOpt) {
-	    alert("$receiptalert");
-	    formname.receipt.value = "";
-	    formname.receipt.focus();
-	    return false;
-	}
-	return true;
-    }
-</script>
-GRADINGMENUJS
     &commonJSfunctions($request);
-    my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle);
     my $result;
-    my (undef,$sections) = &getclasslist('all','0');
-    my $savedState = &savedState();
-    my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'});
-    my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'});
-    my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'});
-    my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'});
-
-    # Preselect sections
-    my $selsec="";
-    if (ref($sections)) {
-        foreach my $section (sort(@$sections)) {
-            $selsec.='<option value="'.$section.'" '.
-                ($saveSec eq $section ? 'selected="selected"':'').'>'.$section.'</option>'."\n";
-        }
-    }
 
     $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
-	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n".
-	'<input type="hidden" name="handgrade"   value="'.$hdgrade.'" />'."\n".
-	'<input type="hidden" name="probTitle"   value="'.$probTitle.'" />'."\n".
-	'<input type="hidden" name="command"     value="" />'."\n".
-	'<input type="hidden" name="saveState"   value="" />'."\n".
-	'<input type="hidden" name="gradingMenu" value="1" />'."\n".
-	'<input type="hidden" name="showgrading" value="yes" />'."\n";
+	'<input type="hidden" name="symb"        value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n";
+    $result.=&selectfield(1).'
+                <input type="hidden" name="command" value="submission" /> 
+	      <input type="submit" value="'.&mt('Next').' &rarr;" />
+            </div>
+          </div>
 
-    $result.='
-<h2>
-  '.&mt('Grade Current Resource').'
-</h2>
-<div>
-  '.$table.'
-</div>
 
-<div class="LC_columnSection">
+  </form>';
+    return $result;
+}
+
+sub selectfield {
+   my ($full)=@_;
+   my %options = 
+          (&Apache::lonlocal::texthash(
+             'yes'       => 'with submissions',
+             'queued'    => 'in grading queue',
+             'graded'    => 'with ungraded submissions',
+             'incorrect' => 'with incorrect submissions',
+             'all'       => 'with any status'),
+             'select_form_order' => ['yes','queued','graded','incorrect','all']);
+   my $result='<div class="LC_columnSection">
   
     <fieldset>
       <legend>
        '.&mt('Sections').'
       </legend>
-      <select name="section" multiple="multiple" size="5">'."\n";
-    $result.= $selsec;
-    $result.= '<option value="all" '.($saveSec eq 'all' ? 'selected="selected"' : ''). '>all</option></select> &nbsp; ';
-    $result.='
+      '.&Apache::lonstatistics::SectionSelect('section','multiple',5).'
     </fieldset>
   
     <fieldset>
@@ -9293,63 +8565,18 @@ GRADINGMENUJS
       <legend>
         '.&mt('Access Status').'
       </legend>
-      '.&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,5,undef,'mult').'
-    </fieldset>
-  
+      '.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').'
+    </fieldset>';
+    if ($full) {
+       $result.='
     <fieldset>
       <legend>
         '.&mt('Submission Status').'
-      </legend>
-      <select name="submitonly" size="5">
-	         <option value="yes" '.      ($saveSub eq 'yes'       ? 'selected="selected"' : '').'>'.&mt('with submissions').'</option>
-	         <option value="queued" '.   ($saveSub eq 'queued'    ? 'selected="selected"' : '').'>'.&mt('in grading queue').'</option>
-	         <option value="graded" '.   ($saveSub eq 'graded'    ? 'selected="selected"' : '').'>'.&mt('with ungraded submissions').'</option>
-	         <option value="incorrect" '.($saveSub eq 'incorrect' ? 'selected="selected"' : '').'>'.&mt('with incorrect submissions').'</option>
-                 <option value="all" '.      ($saveSub eq 'all'       ? 'selected="selected"' : '').'>'.&mt('with any status').'</option>
-      </select>
-    </fieldset>
-  
-</div>
-
-<br />
-          <div>
-            <div>
-              <label>
-                <input type="radio" name="radioChoice" value="submission" '.
-                  ($saveCmd eq 'submission' ? 'checked="checked"' : '').' /> '.
-             &mt('Select individual students to grade and view submissions.').'
-	      </label> 
-            </div>
-            <div>
-	      <label>
-                <input type="radio" name="radioChoice" value="viewgrades" '.
-                  ($saveCmd eq 'viewgrades' ? 'checked="checked"' : '').' /> '.
-                    &mt('Grade all selected students in a grading table.').'
-              </label>
-            </div>
-            <div>
-	      <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
-            </div>
-          </div>
-
-
-        <h2>
-         '.&mt('Grade Complete Folder for One Student').'
-        </h2>
-        <div>
-            <div>
-              <label>
-                <input type="radio" name="radioChoice" value="pickStudentPage" '.
-	  ($saveCmd eq 'pickStudentPage' ? 'checked="checked"' : '').' /> '.
-  &mt('The <b>complete</b> page/sequence/folder: For one student').'
-              </label>
-            </div>
-            <div>
-	      <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
-            </div>
-        </div>
-  </form>';
-    $result .= &show_grading_menu_form($symb);
+      </legend>'.
+       &Apache::loncommon::select_form('all','submitonly',\%options).
+   '</fieldset>';
+    }
+    $result.='</div><br />';
     return $result;
 }
 
@@ -9375,21 +8602,6 @@ sub init_perm {
     }
 }
 
-sub init_old_essays {
-    my ($symb,$apath,$adom,$aname) = @_;
-    if ($symb ne '') {
-        my %essays = &Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname);
-        if (keys(%essays) > 0) {
-            $old_essays{$symb} = \%essays;
-        }
-    }
-    return;
-}
-
-sub reset_old_essays {
-    undef(%old_essays);
-}
-
 sub gather_clicker_ids {
     my %clicker_ids;
 
@@ -9452,18 +8664,14 @@ sub clicker_grading_parameters {
 }
 
 sub process_clicker {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
     my $result=&checkforfile_js();
-    $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
-    my ($table) = &showResourceInfo($symb,$env{'form.probTitle'});
-    $result.=$table;
-    $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n";
-    $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n";
-    $result.='&nbsp;<b>'.&mt('Specify a file containing the clicker information for this resource.').
-        '</b></td></tr>'."\n";
-    $result.='<tr bgcolor="#ffffe6"><td>'."\n";
+    $result.=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Specify a file containing clicker information and set grading options.').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row()."<td>\n";
 # Attempt to restore parameters from last session, set defaults if not present
     my %Saveable_Parameters=&clicker_grading_parameters();
     &Apache::loncommon::restore_course_settings('grades_clicker',
@@ -9480,7 +8688,7 @@ sub process_clicker {
        }
     }
 
-    my $upload=&mt("Upload File");
+    my $upload=&mt("Evaluate File");
     my $type=&mt("Type");
     my $attendance=&mt("Award points just for participation");
     my $personnel=&mt("Correctness determined from response by course personnel");
@@ -9490,12 +8698,10 @@ sub process_clicker {
     my $pcorrect=&mt("Percentage points for correct solution");
     my $pincorrect=&mt("Percentage points for incorrect solution");
     my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype',
-                                                   {'iclicker' => 'i>clicker',
-                                                    'interwrite' => 'interwrite PRS',
-                                                    'turning' => 'Turning Technologies'});
+						   {'iclicker' => 'i>clicker',
+                                                    'interwrite' => 'interwrite PRS'});
     $symb = &Apache::lonenc::check_encrypt($symb);
-    $result.=<<ENDUPFORM;
-<script type="text/javascript">
+    $result.= &Apache::lonhtmlcommon::scripttag(<<ENDUPFORM);
 function sanitycheck() {
 // Accept only integer percentages
    document.forms.gradesupload.pcorrect.value=Math.round(document.forms.gradesupload.pcorrect.value);
@@ -9533,15 +8739,17 @@ function sanitycheck() {
 // Remember the old state
    document.forms.gradesupload.waschecked.value=newgradingchoice;
 }
-</script>
+ENDUPFORM
+    $result.= <<ENDUPFORM;
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="processclickerfile" />
-<input type="hidden" name="probTitle" value="$env{'form.probTitle'}" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 <input type="file" name="upfile" size="50" />
 <br /><label>$type: $selectform</label>
-<br /><label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label>
+ENDUPFORM
+    $result.='</td>'.&Apache::loncommon::end_data_table_row().
+                     &Apache::loncommon::start_data_table_row().'<td>'.(<<ENDGRADINGFORM);
+      <label><input type="radio" name="gradingmechanism" value="attendance"$checked{'attendance'} onclick="sanitycheck()" />$attendance </label>
 <br /><label><input type="radio" name="gradingmechanism" value="personnel"$checked{'personnel'} onclick="sanitycheck()" />$personnel</label>
 <br /><label><input type="radio" name="gradingmechanism" value="specific"$checked{'specific'} onclick="sanitycheck()" />$specific </label>
 <input type="text" name="specificid" value="$env{'form.specificid'}" size="20" />
@@ -9549,40 +8757,41 @@ function sanitycheck() {
 <br />&nbsp;&nbsp;&nbsp;
 <input type="text" name="givenanswer" size="50" />
 <input type="hidden" name="waschecked" value="$env{'form.gradingmechanism'}" />
-<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label>
+ENDGRADINGFORM
+         $result.='</td>'.&Apache::loncommon::end_data_table_row().
+                     &Apache::loncommon::start_data_table_row().'<td>'.(<<ENDPERCFORM);
+      <label>$pcorrect: <input type="text" name="pcorrect" size="4" value="$env{'form.pcorrect'}" onchange="sanitycheck()" /></label>
 <br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="$env{'form.pincorrect'}" onchange="sanitycheck()" /></label>
 <br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" />
-</form>
-ENDUPFORM
-    $result.='</td></tr></table>'."\n".
-             '</td></tr></table><br /><br />'."\n";
-    $result.=&show_grading_menu_form($symb);
+</form>'
+ENDPERCFORM
+    $result.='</td>'.
+             &Apache::loncommon::end_data_table_row().
+             &Apache::loncommon::end_data_table();
     return $result;
 }
 
 sub process_clicker_file {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
 
     my %Saveable_Parameters=&clicker_grading_parameters();
     &Apache::loncommon::store_course_settings('grades_clicker',
                                               \%Saveable_Parameters);
-
-    my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
+    my $result='';
     if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) {
 	$result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>';
-	return $result.&show_grading_menu_form($symb);
+	return $result;
     }
     if (($env{'form.gradingmechanism'} eq 'given') && ($env{'form.givenanswer'}!~/\S/)) {
         $result.='<span class="LC_error">'.&mt('You need to specify the correct answer').'</span>';
-        return $result.&show_grading_menu_form($symb);
+        return $result;
     }
     my $foundgiven=0;
     if ($env{'form.gradingmechanism'} eq 'given') {
         $env{'form.givenanswer'}=~s/^\s*//gs;
         $env{'form.givenanswer'}=~s/\s*$//gs;
-        $env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-\+]+/\,/g;
+        $env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-]+/\,/g;
         $env{'form.givenanswer'}=uc($env{'form.givenanswer'});
         my @answers=split(/\,/,$env{'form.givenanswer'});
         $foundgiven=$#answers+1;
@@ -9623,7 +8832,7 @@ sub process_clicker_file {
         $result.="</p>\n";
 	if ($number==0) {
 	    $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>';
-	    return $result.&show_grading_menu_form($symb);
+	    return $result;
 	}
     }
     if (length($env{'form.upfile'}) < 2) {
@@ -9631,23 +8840,22 @@ sub process_clicker_file {
 		     '<span class="LC_error">',
 		     '</span>',
 		     '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>');
-        return $result.&show_grading_menu_form($symb);
+        return $result;
     }
 
 # Were able to get all the info needed, now analyze the file
 
     $result.=&Apache::loncommon::studentbrowser_javascript();
     $symb = &Apache::lonenc::check_encrypt($symb);
-    my $heading=&mt('Scanning clicker file');
-    $result.=(<<ENDHEADER);
-<br /><table width="100%" border="0"><tr><td bgcolor="#777777">
-<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>
-<b>$heading</b></td></tr><tr bgcolor="#ffffe6"><td>
+    $result.=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Evaluate clicker file').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row().(<<ENDHEADER);
+<td>
 <form method="post" action="/adm/grades" name="clickeranalysis">
 <input type="hidden" name="symb" value="$symb" />
 <input type="hidden" name="command" value="assignclickergrades" />
-<input type="hidden" name="probTitle" value="$env{'form.probTitle'}" />
-<input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 <input type="hidden" name="gradingmechanism" value="$env{'form.gradingmechanism'}" />
 <input type="hidden" name="pcorrect" value="$env{'form.pcorrect'}" />
 <input type="hidden" name="pincorrect" value="$env{'form.pincorrect'}" />
@@ -9665,9 +8873,6 @@ ENDHEADER
     if ($env{'form.upfiletype'} eq 'interwrite') {
         ($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses);
     }
-    if ($env{'form.upfiletype'} eq 'turning') {
-        ($errormsg,$number)=&turning_eval(\@questiontitles,\%responses);
-    }
     $result.='<br />'.&mt('Found [_1] question(s)',$number).'<br />'.
              '<input type="hidden" name="number" value="'.$number.'" />'.
              &mt('Awarding [_1] percent for correct and [_2] percent for incorrect responses',
@@ -9675,7 +8880,7 @@ ENDHEADER
              '<br />';
     if (($env{'form.gradingmechanism'} eq 'given') && ($number!=$foundgiven)) {
        $result.='<span class="LC_error">'.&mt('Number of given answers does not agree with number of questions in file.').'</span>';
-       return $result.&show_grading_menu_form($symb);
+       return $result;
     } 
 # Remember Question Titles
 # FIXME: Possibly need delimiter other than ":"
@@ -9695,7 +8900,9 @@ ENDHEADER
        } elsif ($clicker_ids{$id}) {
           if ($clicker_ids{$id}=~/\,/) {
 # More than one user with the same clicker!
-             $result.="\n<hr />".&mt('Clicker registered more than once').": <tt>".$id."</tt><br />";
+             $result.="</td>".&Apache::loncommon::end_data_table_row().
+                           &Apache::loncommon::start_data_table_row()."<td>".
+                       &mt('Clicker registered more than once').": <tt>".$id."</tt><br />";
              $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'.
                            "<select name='multi".$id."'>";
              foreach my $reguser (sort(split(/\,/,$clicker_ids{$id}))) {
@@ -9709,12 +8916,14 @@ ENDHEADER
              $student_count++;
           }
        } else {
-          $result.="\n<hr />".&mt('Unregistered Clicker')." <tt>".$id."</tt><br />";
+          $result.="</td>".&Apache::loncommon::end_data_table_row().
+                           &Apache::loncommon::start_data_table_row()."<td>".
+                    &mt('Unregistered Clicker')." <tt>".$id."</tt><br />";
           $result.="\n".'<input type="hidden" name="unknown:'.$id.'" value="'.$responses{$id}.'" />'.
                    "\n".&mt("Username").": <input type='text' name='uname".$id."' />&nbsp;".
                    "\n".&mt("Domain").": ".
                    &Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).'&nbsp;'.
-                   &Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,0,$id);
+                   &Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id);
           $unknown_count++;
        }
     }
@@ -9735,9 +8944,10 @@ ENDHEADER
     } else {
        $result.='<br /><input type="submit" name="finalize" value="'.&mt('Finalize Grading').'" />';
     }
-    $result.='</form></td></tr></table>'."\n".
-             '</td></tr></table><br /><br />'."\n";
-    return $result.&show_grading_menu_form($symb);
+    $result.='</form></td>'.
+             &Apache::loncommon::end_data_table_row().
+             &Apache::loncommon::end_data_table();
+    return $result;
 }
 
 sub iclicker_eval {
@@ -9759,7 +8969,6 @@ sub iclicker_eval {
 	    $id=~s/^[\#0]+//;
 	    for (my $i=0;$i<$number;$i++) {
 		my $idx=3+$i*6;
-                $entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+]+//g;
 		push(@idresponses,$entries[$idx]);
 	    }
 	    $$responses{$id}=join(',',@idresponses);
@@ -9799,34 +9008,8 @@ sub interwrite_eval {
     return ($errormsg,$number);
 }
 
-sub turning_eval {
-    my ($questiontitles,$responses)=@_;
-    my $number=0;
-    my $errormsg='';
-    foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) {
-        my %components=&Apache::loncommon::record_sep($line);
-        my @entries=map {$components{$_}} (sort(keys(%components)));
-        if ($#entries>$number) { $number=$#entries; }
-        my $id=$entries[0];
-        my @idresponses;
-        $id=~s/^[\#0]+//;
-        unless ($id) { next; }
-        for (my $idx=1;$idx<=$#entries;$idx++) {
-            $entries[$idx]=~s/\,/\;/g;
-            $entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+\;]+//g;
-            push(@idresponses,$entries[$idx]);
-        }
-        $$responses{$id}=join(',',@idresponses);
-    }
-    for (my $i=1; $i<=$number; $i++) {
-        $$questiontitles[$i]=&mt('Question [_1]',$i);
-    }
-    return ($errormsg,$number);
-}
-
 sub assign_clicker_grades {
-    my ($r)=@_;
-    my ($symb)=&get_symb($r);
+    my ($r,$symb)=@_;
     if (!$symb) {return '';}
 # See which part we are saving to
     my $res_error;
@@ -9837,15 +9020,11 @@ sub assign_clicker_grades {
 # FIXME: This should probably look for the first handgradeable part
     my $part=$$partlist[0];
 # Start screen output
-    my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
-
-    $result .= '<br />'.
-               &Apache::loncommon::start_data_table().
-               &Apache::loncommon::start_data_table_header_row().
-               '<th>'.&mt('Assigning grades based on clicker file').'</th>'.
-               &Apache::loncommon::end_data_table_header_row().
-               &Apache::loncommon::start_data_table_row().'<td>';
-
+    my $result=&Apache::loncommon::start_data_table().
+             &Apache::loncommon::start_data_table_header_row().
+             '<th>'.&mt('Assigning grades based on clicker file').'</th>'.
+             &Apache::loncommon::end_data_table_header_row().
+             &Apache::loncommon::start_data_table_row().'<td>';
 # Get correct result
 # FIXME: Possibly need delimiter other than ":"
     my @correct=();
@@ -9861,20 +9040,20 @@ sub assign_clicker_grades {
                     $result.='<br /><span class="LC_warning">'.
                              &mt('More than one correct result given for question "[_1]": [_2] versus [_3].',
                                  $env{'form.question:'.$i},$correct[$i],$input[$i]).'</span>';
-                 } elsif (($input[$i]) || ($input[$i] eq '0')) {
+                 } elsif ($input[$i]) {
                     $correct[$i]=$input[$i];
                  }
              }
           }
        }
        for (my $i=0;$i<$number;$i++) {
-          if ((!$correct[$i]) && ($correct[$i] ne '0')) {
+          if (!$correct[$i]) {
              $result.='<br /><span class="LC_error">'.
                       &mt('No correct result given for question "[_1]"!',
                           $env{'form.question:'.$i}).'</span>';
           }
        }
-       $result.='<br />'.&mt("Correct answer: [_1]",join(', ',map { ((($_) || ($_ eq '0'))?$_:'-') } @correct));
+       $result.='<br />'.&mt("Correct answer: [_1]",join(', ',map { ($_?$_:'-') } @correct));
     }
 # Start grading
     my $pcorrect=$env{'form.pcorrect'};
@@ -9900,7 +9079,7 @@ sub assign_clicker_grades {
                       &mt("More than one entry found for <tt>[_1]</tt>!",$user).
                       '</span><br />';
           }
-          $users{$user}=1;
+          $users{$user}=1; 
           my @answer=split(/\,/,$env{$key});
           my $sum=0;
           my $realnumber=$number;
@@ -9913,23 +9092,11 @@ sub assign_clicker_grades {
                 } elsif ($correct[$i] eq '*') {
                    $sum+=$pcorrect;
                 } else {
-# We actually grade if correct or not
-                   my $increment=$pincorrect;
-# Special case: numerical answer "0"
-                   if ($correct[$i] eq '0') {
-                      if ($answer[$i]=~/^[0\.]+$/) {
-                         $increment=$pcorrect;
-                      }
-# General numerical answer, both evaluate to something non-zero
-                   } elsif ((1.0*$correct[$i]!=0) && (1.0*$answer[$i]!=0)) {
-                      if (1.0*$correct[$i]==1.0*$answer[$i]) {
-                         $increment=$pcorrect;
-                      }
-# Must be just alphanumeric
-                   } elsif ($answer[$i] eq $correct[$i]) {
-                      $increment=$pcorrect;
+                   if ($answer[$i] eq $correct[$i]) {
+                      $sum+=$pcorrect;
+                   } else {
+                      $sum+=$pincorrect;
                    }
-                   $sum+=$increment;
                 }
              }
           }
@@ -9954,8 +9121,8 @@ sub assign_clicker_grades {
     $result.='<br />'.&mt('Successfully stored grades for [quant,_1,student].',$storecount).
              '</td>'.
              &Apache::loncommon::end_data_table_row().
-             &Apache::loncommon::end_data_table()."<br /><br />\n";
-    return $result.&show_grading_menu_form($symb);
+             &Apache::loncommon::end_data_table();
+    return $result;
 }
 
 sub navmap_errormsg {
@@ -9966,29 +9133,38 @@ sub navmap_errormsg {
 }
 
 sub startpage {
-    my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js) = @_;
-    if ($nomenu) {
-        $r->print(&Apache::loncommon::start_page("Student's Version",$js,{'only_body' => '1'}));
-    } else {
-        $r->print(&Apache::loncommon::start_page('Grading',$js,
-                                                 {'bread_crumbs' => $crumbs}));
-    }
+    my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag) = @_;
+    unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
+    $r->print(&Apache::loncommon::start_page('Grading',undef,
+                                          {'bread_crumbs' => $crumbs}));
+    $r->print('<h3>'.$$crumbs[-1]{'text'}.'</h3>');
     unless ($nodisplayflag) {
-       $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp));
+       $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag));
     }
 }
 
+sub select_problem {
+    my ($r)=@_;
+    $r->print('<h3>'.&mt('Select the problem or one of the problems you want to grade').'</h3><form action="/adm/grades">');
+    $r->print(&Apache::lonstathelpers::problem_selector('.',undef,1));
+    $r->print('<input type="hidden" name="command" value="gradingmenu" />');
+    $r->print('<input type="submit" value="'.&mt('Next').' &rarr;" /></form>');
+}
+
 sub handler {
     my $request=$_[0];
     &reset_caches();
-    if ($request->header_only) {
-        &Apache::loncommon::content_type($request,'text/html');
-        $request->send_http_header;
-        return OK;
+    if ($env{'browser.mathml'}) {
+	&Apache::loncommon::content_type($request,'text/xml');
+    } else {
+	&Apache::loncommon::content_type($request,'text/html');
     }
+    $request->send_http_header;
+    return '' if $request->header_only;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
 
-    my $symb=&get_symb($request,1);
+# see what command we need to execute
+
     my @commands=&Apache::loncommon::get_env_multiple('form.command');
     my $command=$commands[0];
 
@@ -9996,156 +9172,158 @@ sub handler {
 	&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands));
     }
 
+# see what the symb is
+
+    my $symb=$env{'form.symb'};
+    unless ($symb) {
+       (my $url=$env{'form.url'}) =~ s-^https*://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
+       $symb=&Apache::lonnet::symbread($url);
+    }
+    &Apache::lonenc::check_decrypt(\$symb);                             
+
     $ssi_error = 0;
-    my $brcrum = [{href=>"/adm/grades",text=>"Grading"}];
-    my $start_page = &Apache::loncommon::start_page('Grading',undef,
-                                                    {'bread_crumbs' => $brcrum});
-    if ($symb eq '' && $command eq '') {
-	if ($env{'user.adv'}) {
-            &Apache::loncommon::content_type($request,'text/html');
-            $request->send_http_header;
-            $request->print($start_page);
-	    if (($env{'form.codeone'}) && ($env{'form.codetwo'}) &&
-		($env{'form.codethree'})) {
-		my $token=$env{'form.codeone'}.'*'.$env{'form.codetwo'}.'*'.
-		    $env{'form.codethree'};
-		my ($tsymb,$tuname,$tudom,$tcrsid)=
-		    &Apache::lonnet::checkin($token);
-		if ($tsymb) {
-		    my ($map,$id,$url)=&Apache::lonnet::decode_symb($tsymb);
-		    if (&Apache::lonnet::allowed('mgr',$tcrsid)) {
-			$request->print(&ssi_with_retries('/res/'.$url, $ssi_retries,
-					  ('grade_username' => $tuname,
-					   'grade_domain' => $tudom,
-					   'grade_courseid' => $tcrsid,
-					   'grade_symb' => $tsymb)));
-		    } else {
-			$request->print('<h3>Not authorized: '.$token.'</h3>');
-		    }
-		} else {
-		    $request->print('<h3>Not a valid DocID: '.$token.'</h3>');
-		}
-	    } else {
-		$request->print(&Apache::lonxml::tokeninputfield());
-	    }
-        } elsif ($env{'request.course.id'}) {
-            &init_perm(); 
-            if (!%perm) {
-                $request->internal_redirect('/adm/quickgrades');
-            } else {
-                &Apache::loncommon::content_type($request,'text/html');
-                $request->send_http_header;
-                $request->print($start_page);
-            }
-        }
+    if ($symb eq '' || $command eq '') {
+#
+# Not called from a resource
+#    
+        &startpage($request,undef,[],1,1);
+        &select_problem($request);
     } else {
-        &init_perm();
-        if (!$env{'request.course.id'}) {
-            unless ((&Apache::lonnet::allowed('usc',$env{'request.role.domain'})) &&
-                    ($command =~ /^scantronupload/)) {
-                # Not in a course.
-                $env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context";
-                return HTTP_NOT_ACCEPTABLE;
-            }
-        } elsif (!%perm) {
-            $request->internal_redirect('/adm/quickgrades');
-        }
-        &Apache::loncommon::content_type($request,'text/html');
-        $request->send_http_header;
-        unless ((($command eq 'submission' || $command eq 'versionsub')) && ($perm{'vgr'})) {
-            $request->print($start_page); 
-        }
+	&init_perm();
 	if ($command eq 'submission' && $perm{'vgr'}) {
-            my ($stuvcurrent,$stuvdisp,$versionform,$js);
-            if (($env{'form.student'} ne '') && ($env{'form.userdom'} ne '')) {
-                ($stuvcurrent,$stuvdisp,$versionform,$js) =
-                    &choose_task_version_form($symb,$env{'form.student'},
-                                              $env{'form.userdom'});
-            }
-            &startpage($request,$symb,[{href=>"", text=>"Student Submissions"}],undef,undef,$stuvcurrent,$stuvdisp,undef,$js);
-            if ($versionform) {
-                $request->print($versionform);
-            }
-            $request->print('<br clear="all" />');
-	    ($env{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0));
-        } elsif ($command eq 'versionsub' && $perm{'vgr'}) {
-            my ($stuvcurrent,$stuvdisp,$versionform,$js) =
-                &choose_task_version_form($symb,$env{'form.student'},
-                                          $env{'form.userdom'},
-                                          $env{'form.inhibitmenu'});
-            &startpage($request,$symb,[{href=>"", text=>"Previous Student Version"}],undef,undef,$stuvcurrent,$stuvdisp,$env{'form.inhibitmenu'},$js);
-            if ($versionform) {
-                $request->print($versionform);
-            }
-            $request->print('<br clear="all" />');
-            $request->print(&show_previous_task_version($request,$symb));
+            &startpage($request,$symb,[{href=>"", text=>"Student Submissions"}]);
+	    ($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb));
 	} elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {
-	    &pickStudentPage($request);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
+                                       {href=>'',text=>'Select student'}],1,1);
+	    &pickStudentPage($request,$symb);
 	} elsif ($command eq 'displayPage' && $perm{'vgr'}) {
-	    &displayPage($request);
+            &startpage($request,$symb,
+                                      [{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
+                                       {href=>'',text=>'Select student'},
+                                       {href=>'',text=>'Grade student'}],1,1);
+	    &displayPage($request,$symb);
 	} elsif ($command eq 'gradeByPage' && $perm{'mgr'}) {
-	    &updateGradeByPage($request);
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
+                                       {href=>'',text=>'Select student'},
+                                       {href=>'',text=>'Grade student'},
+                                       {href=>'',text=>'Store grades'}],1,1);
+	    &updateGradeByPage($request,$symb);
 	} elsif ($command eq 'processGroup' && $perm{'vgr'}) {
-	    &processGroup($request);
+            &startpage($request,$symb,[{href=>'',text=>'...'},
+                                       {href=>'',text=>'Modify grades'}]);
+	    &processGroup($request,$symb);
 	} elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
-	    $request->print(&grading_menu($request));
-	} elsif ($command eq 'submit_options' && $perm{'vgr'}) {
-	    $request->print(&submit_options($request));
+            &startpage($request,$symb);
+	    $request->print(&grading_menu($request,$symb));
+	} elsif ($command eq 'individual' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>'',text=>'Select individual students to grade'}]);
+	    $request->print(&submit_options($request,$symb));
+        } elsif ($command eq 'ungraded' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>'',text=>'Grade ungraded submissions'}]);
+            $request->print(&listStudents($request,$symb,'graded'));
+        } elsif ($command eq 'table' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>"", text=>"Grading table"}]);
+            $request->print(&submit_options_table($request,$symb));
+        } elsif ($command eq 'all_for_one' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>'',text=>'Grade page/folder for one student'}],1,1);
+            $request->print(&submit_options_sequence($request,$symb));
 	} elsif ($command eq 'viewgrades' && $perm{'vgr'}) {
-	    $request->print(&viewgrades($request));
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"table"), text=>"Grading table"},{href=>'', text=>"Modify grades"}]);
+	    $request->print(&viewgrades($request,$symb));
 	} elsif ($command eq 'handgrade' && $perm{'mgr'}) {
-	    $request->print(&processHandGrade($request));
+            &startpage($request,$symb,[{href=>'',text=>'...'},
+                                       {href=>'',text=>'Store grades'}]);
+	    $request->print(&processHandGrade($request,$symb));
 	} elsif ($command eq 'editgrades' && $perm{'mgr'}) {
-	    $request->print(&editgrades($request));
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"table"), text=>"Grading table"},
+                                       {href=>&href_symb_cmd($symb,'viewgrades').'&group=all&section=all&Status=Active',
+                                                                             text=>"Modify grades"},
+                                       {href=>'', text=>"Store grades"}]);
+	    $request->print(&editgrades($request,$symb));
+        } elsif ($command eq 'initialverifyreceipt' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>'',text=>'Verify Receipt Number'}]);
+            $request->print(&initialverifyreceipt($request,$symb));
 	} elsif ($command eq 'verify' && $perm{'vgr'}) {
-	    $request->print(&verifyreceipt($request));
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"initialverifyreceipt"),text=>'Verify Receipt Number'},
+                                       {href=>'',text=>'Verification Result'}]);
+	    $request->print(&verifyreceipt($request,$symb));
         } elsif ($command eq 'processclicker' && $perm{'mgr'}) {
-            $request->print(&process_clicker($request));
+            &startpage($request,$symb,[{href=>'', text=>'Process clicker'}]);
+            $request->print(&process_clicker($request,$symb));
         } elsif ($command eq 'processclickerfile' && $perm{'mgr'}) {
-            $request->print(&process_clicker_file($request));
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'processclicker'), text=>'Process clicker'},
+                                       {href=>'', text=>'Process clicker file'}]);
+            $request->print(&process_clicker_file($request,$symb));
         } elsif ($command eq 'assignclickergrades' && $perm{'mgr'}) {
-            $request->print(&assign_clicker_grades($request));
+            &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'processclicker'), text=>'Process clicker'},
+                                       {href=>'', text=>'Process clicker file'},
+                                       {href=>'', text=>'Store grades'}]);
+            $request->print(&assign_clicker_grades($request,$symb));
 	} elsif ($command eq 'csvform' && $perm{'mgr'}) {
-	    $request->print(&upcsvScores_form($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&upcsvScores_form($request,$symb));
 	} elsif ($command eq 'csvupload' && $perm{'mgr'}) {
-	    $request->print(&csvupload($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&csvupload($request,$symb));
 	} elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) {
-	    $request->print(&csvuploadmap($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&csvuploadmap($request,$symb));
 	} elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) {
 	    if ($env{'form.associate'} ne 'Reverse Association') {
-		$request->print(&csvuploadoptions($request));
+                &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+		$request->print(&csvuploadoptions($request,$symb));
 	    } else {
 		if ( $env{'form.upfile_associate'} ne 'reverse' ) {
 		    $env{'form.upfile_associate'} = 'reverse';
 		} else {
 		    $env{'form.upfile_associate'} = 'forward';
 		}
-		$request->print(&csvuploadmap($request));
+                &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+		$request->print(&csvuploadmap($request,$symb));
 	    }
 	} elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) {
-	    $request->print(&csvuploadassign($request));
+            &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
+	    $request->print(&csvuploadassign($request,$symb));
 	} elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
-	    $request->print(&scantron_selectphase($request));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+	    $request->print(&scantron_selectphase($request,undef,$symb));
  	} elsif ($command eq 'scantron_warning' && $perm{'mgr'}) {
- 	    $request->print(&scantron_do_warning($request));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+ 	    $request->print(&scantron_do_warning($request,$symb));
 	} elsif ($command eq 'scantron_validate' && $perm{'mgr'}) {
-	    $request->print(&scantron_validate_file($request));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+	    $request->print(&scantron_validate_file($request,$symb));
 	} elsif ($command eq 'scantron_process' && $perm{'mgr'}) {
-	    $request->print(&scantron_process_students($request));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+	    $request->print(&scantron_process_students($request,$symb));
  	} elsif ($command eq 'scantronupload' && 
  		 (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
 		  &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
- 	    $request->print(&scantron_upload_scantron_data($request)); 
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+ 	    $request->print(&scantron_upload_scantron_data($request,$symb)); 
  	} elsif ($command eq 'scantronupload_save' &&
  		 (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
 		  &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
- 	    $request->print(&scantron_upload_scantron_data_save($request));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+ 	    $request->print(&scantron_upload_scantron_data_save($request,$symb));
  	} elsif ($command eq 'scantron_download' &&
 		 &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
- 	    $request->print(&scantron_download_scantron_data($request));
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+ 	    $request->print(&scantron_download_scantron_data($request,$symb));
         } elsif ($command eq 'checksubmissions' && $perm{'vgr'}) {
-            $request->print(&checkscantron_results($request));     
+            &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+            $request->print(&checkscantron_results($request,$symb));
+        } elsif ($command eq 'downloadfilesselect' && $perm{'vgr'}) {
+            &startpage($request,$symb,[{href=>'', text=>'Select which submissions to download'}]);
+            $request->print(&submit_options_download($request,$symb));
+         } elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) {
+            &startpage($request,$symb,
+   [{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'},
+    {href=>'', text=>'Download submissions'}]);
+            &submit_download_link($request,$symb);
 	} elsif ($command) {
+            &startpage($request,$symb,[{href=>'', text=>'Access denied'}]);
 	    $request->print('<p class="LC_error">'.&mt('Access Denied ([_1])',$command).'</p>');
 	}
     }
@@ -10154,7 +9332,7 @@ sub handler {
     }
     $request->print(&Apache::loncommon::end_page());
     &reset_caches();
-    return OK;
+    return '';
 }
 
 1;
@@ -10258,8 +9436,6 @@ ssi_with_retries()
        calling routine should trap the error condition and display the warning
        found in &navmap_errormsg().
 
-       $scantron_config - Reference to bubblesheet format configuration hash.
-
    Returns the maximum number of bubble lines that are expected to
    occur. Does this by walking the selected sequence rendering the
    resource and then checking &Apache::lonxml::get_problem_counter()
@@ -10283,7 +9459,7 @@ ssi_with_retries()
 
 =item  scantron_process_students() : 
 
-   Routine that does the actual grading of the bubblesheet information.
+   Routine that does the actual grading of the bubble sheet information.
 
    The parsed scanline hash is added to %env 
 
@@ -10303,7 +9479,7 @@ ssi_with_retries()
 
 =item  scantron_upload_scantron_data() :
 
-    Creates the screen for adding a new bubblesheet data file to a course.
+    Creates the screen for adding a new bubble sheet data file to a course.
 
 =item  scantron_upload_scantron_data_save() : 
 
@@ -10317,7 +9493,7 @@ ssi_with_retries()
 =item  scantron_download_scantron_data() : 
 
    Shows a list of the three internal files (original, corrected,
-   skipped) for a specific bubblesheet data file that exists in the
+   skipped) for a specific bubble sheet data file that exists in the
    course.
 
 =item  scantron_validate_ID() :