[LON-CAPA-cvs] cvs: loncom /homework grades.pm

ng lon-capa-cvs@mail.lon-capa.org
Thu, 17 Jul 2003 22:08:25 -0000


This is a MIME encoded message

--ng1058479705
Content-Type: text/plain

ng		Thu Jul 17 18:08:25 2003 EDT

  Modified files:              
    /loncom/homework	grades.pm 
  Log:
  clean up a bunch of codes
  add ability to grade by part regardless whether it is essay response or not
  
  
  
--ng1058479705
Content-Type: text/plain
Content-Disposition: attachment; filename="ng-20030717180825.txt"

Index: loncom/homework/grades.pm
diff -u loncom/homework/grades.pm:1.117 loncom/homework/grades.pm:1.118
--- loncom/homework/grades.pm:1.117	Wed Jul 16 15:28:08 2003
+++ loncom/homework/grades.pm	Thu Jul 17 18:08:25 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.117 2003/07/16 19:28:08 bowersj2 Exp $
+# $Id: grades.pm,v 1.118 2003/07/17 22:08:25 ng Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -106,6 +106,7 @@
 	if (/^\w+response_\w+.*/) {
 	    my ($responsetype,$part) = split(/_/,$_,2);
 	    my ($partid,$respid) = split(/_/,$part);
+	    $responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!!
 	    $handgrade{$part} = $responsetype.':'.($allkeys =~ /parameter_$part\_handgrade/ ? 'yes' : 'no');
 	    next if ($seen{$partid} > 0);
 	    $seen{$partid}++;
@@ -115,6 +116,84 @@
     return \@partlist,\%handgrade;
 }
 
+#--- Show resource title
+#--- and parts and response type
+sub showResourceInfo {
+    my ($url,$probTitle) = @_;
+    my $result ='<table border="0">'.
+	'<tr><td colspan=3><font size=+1><b>Current Resource: </b>'.$probTitle.'</font></td></tr>'."\n";
+    my ($partlist,$handgrade) = &response_type($url);
+    my ($resptype,$hdgrade)=('','no');
+    for (sort keys(%$handgrade)) {
+	my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
+	$resptype = $responsetype;
+	$hdgrade = $handgrade if ($handgrade eq 'yes');
+	$result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.
+	    '<td><b>Type: </b>'.$responsetype.'</td></tr>';
+#	    '<td><b>Handgrade: </b>'.$handgrade.'</td></tr>';
+    }
+    $result.='</table>'."\n";
+    return $result,$resptype,$hdgrade,$partlist,$handgrade;
+}
+
+#--- Clean response type for display
+#--- Currently filters option response type only.
+sub cleanRecord {
+    my ($answer,$response) = @_;
+    $answer =~ s|^<br />||;
+    if ($response eq 'option') {
+	my (@IDs,@ans);
+	foreach (split(/\&/,&Apache::lonnet::unescape($answer))) {
+	    my ($optionID,$ans) = split(/=/);
+	    push @IDs,$optionID.'</font>';
+	    push @ans,$ans;
+	}
+	my $grayFont = '<font color="#999999">';
+	return '<table border="1">'.
+	    '<tr valign="top"><td>Answer</td><td>'.
+	    (join '</td><td>',@ans).'</td></tr>'.
+	    '<tr valign="top"><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont.
+	    (join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'.
+	    '</table>';
+    }
+    return $answer;
+}
+
+#-- A couple of common js functions
+sub commonJSfunctions {
+    my $request = shift;
+    $request->print(<<COMMONJSFUNCTIONS);
+<script type="text/javascript" language="javascript">
+    function radioSelection(radioButton) {
+	var selection=null;
+	if (radioButton.length > 1) {
+	    for (var i=0; i<radioButton.length; i++) {
+		if (radioButton[i].checked) {
+		    return radioButton[i].value;
+		}
+	    }
+	} else {
+	    if (radioButton.checked) return radioButton.value;
+	}
+	return selection;
+    }
+
+    function pullDownSelection(selectOne) {
+	var selection="";
+	if (selectOne.length > 1) {
+	    for (var i=0; i<selectOne.length; i++) {
+		if (selectOne[i].selected) {
+		    return selectOne[i].value;
+		}
+	    }
+	} else {
+	    if (selectOne.selected) return selectOne.value;
+	}
+    }
+</script>
+COMMONJSFUNCTIONS
+}
+
 #--- Dumps the class list with usernames,list of sections,
 #--- section, ids and fullnames for each user.
 sub getclasslist {
@@ -297,7 +376,7 @@
 
     my $title.='<h3><font color="#339933">Verifying Submission Receipt '.
 	$receipt.'</h3></font>'."\n".
-	'<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font><br><br>'."\n";
+	'<font size=+1><b>Resource: </b>'.$ENV{'form.probTitle'}.'</font><br><br>'."\n";
 
     my ($string,$contents,$matches) = ('','',0);
     my (undef,undef,$fullname) = &getclasslist('all','0');
@@ -345,26 +424,15 @@
     my $getsec    = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'};
     my $submitonly= $ENV{'form.submitonly'} eq '' ? 'all' : $ENV{'form.submitonly'};
 
-    my $result;
-    my ($partlist,$handgrade) = &response_type($url);
-    for (sort keys(%$handgrade)) {
-	my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
-	$ENV{'form.handgrade'} = 'yes' if ($handgrade eq 'yes');
-	$result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.
-	    '<td><b>Type: </b>'.$responsetype.'</td>'.
-	    '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';
-    }
-    $result.='</table>'."\n";
-
-    my $viewgrade = $ENV{'form.handgrade'} eq 'yes' ? 'View/Grade' : 'View';
+    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'};
 
-    $result='<h3><font color="#339933">&nbsp;'.
-	$viewgrade.
-	    ' Submissions for a Student or a Group of Students</font></h3>'.
-	    '<table border="0"><tr><td colspan=3><font size=+1>'.
-		    '<b>Problem: </b>'.$ENV{'form.probTitle'}.'</font></td></tr>'.$result;
+    my $result='<h3><font color="#339933">&nbsp;'.$viewgrade.
+	' Submissions for a Student or a Group of Students</font></h3>';
+
+    my ($table,$resptype,$hdgrade,$partlist,$handgrade) = &showResourceInfo($url,$ENV{'form.probTitle'});
+    $result.=$table;
 
     $request->print(<<LISTJAVASCRIPT);
 <script type="text/javascript" language="javascript">
@@ -396,34 +464,22 @@
 	formname.command.value = 'submission';
 	formname.submit();
     }
-
-    function pullDownSelection(selectOne) {
-	var selection="";
-	if (selectOne.length > 1) {
-	    for (var i=0; i<selectOne.length; i++) {
-		if (selectOne[i].selected) {
-		    return selectOne[i].value;
-		}
-	    }
-	} else {
-	    if (selectOne.selected) return selectOne.value;
-	}
-    }
 </script>
 LISTJAVASCRIPT
 
+    &commonJSfunctions($request);
     $request->print($result);
 
-    my $checkhdgrade = $ENV{'form.handgrade'} eq 'yes' ? 'checked' : '';
-    my $checklastsub = $ENV{'form.handgrade'} eq 'yes' ? '' : 'checked';
-
+    my $checkhdgrade = ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : '';
+    my $checklastsub = ($ENV{'form.handgrade'} eq 'no') ? 'checked' : '';
+    $checklastsub = 'checked' if ($checkhdgrade eq '' && $checklastsub eq '');
     my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n".
 	'&nbsp;<b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n".
 	'<input type="radio" name="vProb" value="yes" /> one student '."\n".
 	'<input type="radio" name="vProb" value="all" /> all students <br />'."\n".
 	'&nbsp;<b>Submissions: </b>'."\n";
-    if ($ENV{'form.handgrade'} eq 'yes') {
-	$gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> handgrade only'."\n";
+    if ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) {
+	$gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n";
     }
 
     my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'};
@@ -654,8 +710,8 @@
 
     function checkSolved(formname,id) {
 	if (eval("formname.solved"+id+".value") == "correct_by_student") {
-	    alert("This problem has been graded correct by the computer. The score cannot be changed.");
-	    return "noupdate";
+	    var reply = confirm("This problem has been graded correct by the computer. Do you want to change the score?");
+	    if (!reply) {return "noupdate";}
 	}
 	return "update";
     }
@@ -738,6 +794,7 @@
 sub sub_page_kw_js {
     my $request = shift;
     my $iconpath = $request->dir_config('lonIconsURL');
+    &commonJSfunctions($request);
     $request->print(<<SUBJAVASCRIPT);
 <script type="text/javascript" language="javascript">
 
@@ -818,7 +875,6 @@
     return;
   }
 
-//  var pWin = null;
   function savedMsgHeader(Nmsg,usrctr,fullname) {
     var height = 70*Nmsg+250;
     var scrollbar = "no";
@@ -827,7 +883,12 @@
 	scrollbar = "yes";
     }
 //    if (window.pWin) {window.pWin.close(); window.pWin=null}
-    pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx=70,screeny=75,width=600,height='+height);
+    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', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height);
     pWin.focus();
     pDoc = pWin.document;
     pDoc.write("<html><head>");
@@ -947,10 +1008,14 @@
     return;
   }
 
-//  var hwdWin = null;
   function highlightCentral() {
 //    if (window.hwdWin) window.hwdWin.close();
-    hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx=100,screeny=75');
+    var xpos = (screen.width-400)/2;
+    xpos = (xpos < 0) ? '0' : xpos;
+    var ypos = (screen.height-330)/2-30;
+    ypos = (ypos < 0) ? '0' : ypos;
+
+    hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx='+xpos+',screeny='+ypos);
     hwdWin.focus();
     var hDoc = hwdWin.document;
     hDoc.write("<html><head>");
@@ -958,9 +1023,9 @@
 
     hDoc.write("<script language=javascript>");
     hDoc.write("function updateChoice(flag) {");
-    hDoc.write("  opener.document.SCORE.kwclr.value = radioSelection(document.hlCenter.kwdclr);");
-    hDoc.write("  opener.document.SCORE.kwsize.value = radioSelection(document.hlCenter.kwdsize);");
-    hDoc.write("  opener.document.SCORE.kwstyle.value = radioSelection(document.hlCenter.kwdstyle);");
+    hDoc.write("  opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr);");
+    hDoc.write("  opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize);");
+    hDoc.write("  opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle);");
     hDoc.write("  opener.document.SCORE.refresh.value = \\"on\\";");
     hDoc.write("  if (opener.document.SCORE.keywords.value!=\\"\\"){");
     hDoc.write("     opener.document.SCORE.submit();");
@@ -968,7 +1033,7 @@
     hDoc.write("  self.close()");
     hDoc.write("}");
 
-    hDoc.write("function radioSelection(radioButton) {");
+/*    hDoc.write("function radioSelection(radioButton) {");
     hDoc.write("    var selection=null;");
     hDoc.write("    for (var i=0; i<radioButton.length; i++) {");
     hDoc.write("        if (radioButton[i].checked) {");
@@ -976,7 +1041,7 @@
     hDoc.write("            return selection;");
     hDoc.write("        }");
     hDoc.write("    }");
-    hDoc.write("}");
+    hDoc.write("}"); */
 
     hDoc.write("<");
     hDoc.write("/script>");
@@ -1125,12 +1190,20 @@
     # header info
     if ($counter == 0) {
 	&sub_page_js($request);
-	&sub_page_kw_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'};
 
 	$request->print('<h3>&nbsp;<font color="#339933">Submission Record</font></h3>'."\n".
-			'<font size=+1>&nbsp;<b>Problem: </b>'.$ENV{'form.probTitle'}.'</font>'."\n");
+			'<font size=+1>&nbsp;<b>Resource: </b>'.$ENV{'form.probTitle'}.'</font>'."\n");
+
+	if ($ENV{'form.handgrade'} eq 'no') {
+	    my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL').
+		'/check.gif" height="16" border="0" />';
+	    my $checkMark='<br /><br />&nbsp;<b>Note:</b> Part(s) graded correct by the computer is marked with a '.
+		$checkIcon.' symbol.'."\n";
+	    $request->print($checkMark);
+	}
 
 	# option to display problem, only once else it cause problems 
         # with the form later since the problem has a form.
@@ -1141,7 +1214,7 @@
 	# 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 '') {
+	if ($ENV{'form.kwclr'} eq '' && $ENV{'form.handgrade'} eq 'yes') {
 	    %keyhash = &Apache::lonnet::dump('nohist_handgrade',
 					     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
 					     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
@@ -1229,11 +1302,10 @@
     $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}.
 	'<font color="#999999">&nbsp; &nbsp;Username: '.$uname.
 	($ENV{'user.domain'} eq $udom ? '' : ' ('.$udom.')').'</font><br />'."\n";
-#	'<font color="#999999">&nbsp; &nbsp;Domain: '.$udom.'</font><br />'."\n";
     $result.='<input type="hidden" name="name'.$counter.
 	'" value="'.$ENV{'form.fullname'}.'" />'."\n";
 
-    # If this is an essay-response part(handgraded), then check for collaborators
+    # If any part of the problem is an essay-response (handgraded), then check for collaborators
     my @col_fullnames;
     my ($classlist,$fullname);
     if ($ENV{'form.handgrade'} eq 'yes') {
@@ -1309,44 +1381,53 @@
 		&get_last_submission (%record);
 	    my $lastsubonly=''.
 		($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '.
-		 $$timestamp).'';
+		 $$timestamp)."</td></tr>\n";
 	    if ($$timestamp eq '') {
-		$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0].'</td></tr>'."\n";
+		$lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; 
 	    } else {
 		for my $part (sort keys(%$handgrade)) {
-		    foreach (@$string) {
-			my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/;
-			if ($part eq ($partid.'_'.$respid)) {
-			    my ($ressub,$subval) = split(/:/,$_,2);
-# Similarity check
-                            my $similar='';
-                            my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);
-                            if ($osim) {
-				$osim=int($osim*100.0);
-				$similar='<hr /><h3><font color="#FF0000">Essay is '.$osim.
-				    '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).
-                                '</font></h3><blockquote><i>'.
-                                &keywords_highlight($oessay).'</i></blockquote><hr />';
-                            }
-			    $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
-				$partid.'</b> <font color="#999999">( ID '.$respid.
-				' )</font>&nbsp; &nbsp;'.
-                                ($record{"resource.$partid.$respid.uploadedurl"}?
-                                '<a href="'.
-                                &Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}).
-				 '"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '.
-				 '<font color="red" size="1">Like all files provided by users, '.
-				 'this file may contain virusses</font><br />':'').
-                                '<b>Answer: </b><blockquote>'.
-				&keywords_highlight($subval).'</blockquote><br />&nbsp;'.$similar.'</td></tr>'."\n"
-				if ($ENV{'form.lastSub'} eq 'lastonly' || 
-				    ($ENV{'form.lastSub'} eq 'hdgrade' && 
-				     $$handgrade{$part} =~ /:yes$/));
+		    my ($responsetype,$foo) = split(/:/,$$handgrade{$part});
+		    my ($partid,$respid) = split(/_/,$part);
+		    if (!exists($record{'resource.'.$partid.'.'.$respid.'.submission'})) {
+			$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
+			    $partid.'</b> <font color="#999999">( ID '.$respid.
+			    ' )</font>&nbsp; &nbsp;Nothing submitted<br /><br />';
+ 		    } else {
+			foreach (@$string) {
+			    my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/;
+			    if ($part eq ($partid.'_'.$respid)) {
+				my ($ressub,$subval) = split(/:/,$_,2);
+                            # Similarity check
+				my $similar='';
+				my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);
+				if ($osim) {
+				    $osim=int($osim*100.0);
+				    $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim.
+					'% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).
+					'</font></h3><blockquote><i>'.
+					&keywords_highlight($oessay).'</i></blockquote><hr />';
+				}
+				$lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
+				    $partid.'</b> <font color="#999999">( ID '.$respid.
+				    ' )</font>&nbsp; &nbsp;'.
+				    ($record{"resource.$partid.$respid.uploadedurl"}?
+				     '<a href="'.
+				     &Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}).
+				     '"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '.
+				     '<font color="red" size="1">Like all files provided by users, '.
+				     'this file may contain virusses</font><br />':'').
+				     '<b>Submitted Answer: </b>'.($responsetype eq 'essay' ? '<blockquote>' : '').
+				     &cleanRecord(&keywords_highlight($subval),$responsetype).
+				     ($responsetype eq 'essay' ? '</blockquote><br />' : '<br /><br />').$similar."\n"
+				     if ($ENV{'form.lastSub'} eq 'lastonly' || 
+					 ($ENV{'form.lastSub'} eq 'hdgrade' && 
+					  $$handgrade{$part} =~ /:yes$/));
+			    }
 			}
 		    }
 		}
 	    }
-	    $lastsubonly.='</td></tr>'."\n";
+	    $lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n";
 	    $request->print($lastsubonly);
 	}
     } else {
@@ -1357,8 +1438,8 @@
     }
     
     # return if view submission with no grading option
-#    if ($ENV{'form.showgrading'} eq '' || (!&canmodify($usec))) {
-    if (!&canmodify($usec)) {
+    if ($ENV{'form.showgrading'} eq '' || (!&canmodify($usec))) {
+#    if (!&canmodify($usec)) {
 	$request->print('</td></tr></table></td></tr></table></form>'."\n");
 	$request->print(&show_grading_menu_form($symb,$url)) 
 	    if (($ENV{'form.command'} eq 'submission') || 
@@ -1366,27 +1447,29 @@
 	return;
     }
 
-    # Grading options
-    $result='<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n".
-	'<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n".
-	'<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'
-	.$udom.'" />'."\n";
-    my ($lastname,$givenn) = split(/,/,$ENV{'form.fullname'});
-    my $msgfor = $givenn.' '.$lastname;
-    if (scalar(@col_fullnames) > 0) {
-	my $lastone = pop @col_fullnames;
-	$msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.';
-    }
-    $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript
-    $result.='<tr><td bgcolor="#ffffff">'."\n".
-	'&nbsp;<a href="javascript:msgCenter(document.SCORE,'.$counter.
-	',\''.$msgfor.'\')"; TARGET=_self>'.
-	'Compose Message to student'.(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> &nbsp;'.
-	'<img src="'.$request->dir_config('lonIconsURL').
-	'/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n".
-	'<br />&nbsp;(Message will be sent when you click on Save & Next below.)'."\n" 
-	if ($ENV{'form.handgrade'} eq 'yes');
-    $request->print($result);
+    # essay grading options
+    if ($ENV{'form.handgrade'} eq 'yes') {
+	$result='<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n".
+	    '<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n".
+	    '<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'
+	    .$udom.'" />'."\n";
+	my ($lastname,$givenn) = split(/,/,$ENV{'form.fullname'});
+	my $msgfor = $givenn.' '.$lastname;
+	if (scalar(@col_fullnames) > 0) {
+	    my $lastone = pop @col_fullnames;
+	    $msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.';
+	}
+	$msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript
+#	$result.='<tr><td bgcolor="#ffffff">'."\n".
+	$result.='&nbsp;<a href="javascript:msgCenter(document.SCORE,'.$counter.
+	    ',\''.$msgfor.'\')"; TARGET=_self>'.
+	    'Compose Message to student'.(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> &nbsp;'.
+	    '<img src="'.$request->dir_config('lonIconsURL').
+	    '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n".
+	    '<br />&nbsp;(Message will be sent when you click on Save & Next below.)'."\n" 
+	    if ($ENV{'form.handgrade'} eq 'yes');
+	$request->print($result);
+    }
 
     my %seen = ();
     my @partlist;
@@ -1394,7 +1477,7 @@
 	my ($partid,$respid) = split(/_/);
 	next if ($seen{$partid} > 0);
 	$seen{$partid}++;
-#	next if ($$handgrade{$_} =~ /:no$/);
+	next if ($$handgrade{$_} =~ /:no$/ && $ENV{'form.lastSub'} =~ /^(hdgrade)$/);
 	push @partlist,$partid;
 
 	$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record));
@@ -1413,7 +1496,7 @@
     if ($counter == $total) {
 	my $endform='<table border="0"><tr><td>'.
 	    '<input type="hidden" name="gradeOpt" value="" />'."\n";
-	if ($ENV{'form.handgrade'} eq 'yes') {
+#	if ($ENV{'form.handgrade'} eq 'yes') {
 	    $endform.='<input type="button" value="Save & Next" '.
 		'onClick="javascript:checksubmit(this.form,\'Save & Next\','.
 		$total.','.scalar(@partlist).');" TARGET=_self> &nbsp;'."\n";
@@ -1424,15 +1507,15 @@
 	    my $nsel = ($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1');
 	    $ntstu =~ s/<option>$nsel</<option selected="on">$nsel</;
 	    $endform.=$ntstu.'student(s) &nbsp;&nbsp;';
-	} else {
-	    $endform.='<input type="hidden" name="NTSTU" value="1" />'."\n";
-	}
+#	} else {
+#	    $endform.='<input type="hidden" name="NTSTU" value="1" />'."\n";
+#	}
 	$endform.='<input type="button" value="Next" '.
 	    'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> &nbsp;'."\n".
 	    '<input type="button" value="Previous" '.
 	    'onClick="javascript:checksubmit(this.form,\'Previous\');" TARGET=_self> &nbsp;';
-	$endform.='(Next and Previous do not save the scores.)'."\n" 
-	    if ($ENV{'form.handgrade'} eq 'yes');
+	$endform.='(Next and Previous do not save the scores.)'."\n" ;
+#	    if ($ENV{'form.handgrade'} eq 'yes');
 	$endform.='</td><tr></table></form>';
 	$endform.=&show_grading_menu_form($symb,$url);
 	$request->print($endform);
@@ -1895,7 +1978,7 @@
     my ($symb,$url) = ($ENV{'form.symb'},$ENV{'form.url'}); 
     my $result='<h3><font color="#339933">Manual Grading</font></h3>';
 
-    $result.='<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font>'."\n";
+    $result.='<font size=+1><b>Current Resource: </b>'.$ENV{'form.probTitle'}.'</font>'."\n";
 
     #view individual student submission form - called using Javascript viewOneStudent
     $result.=&jscriptNform($url,$symb);
@@ -2076,7 +2159,7 @@
     my $symb=$ENV{'form.symb'};
     my $url =$ENV{'form.url'};
     my $title='<h3><font color="#339933">Current Grade Status</font></h3>';
-    $title.='<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font><br />'."\n";
+    $title.='<font size=+1><b>Current Resource: </b>'.$ENV{'form.probTitle'}.'</font><br />'."\n";
     $title.='<font size=+1><b>Section: </b>'.$ENV{'form.section'}.'</font>'."\n";
     my $result= '<table border="0"><tr><td bgcolor="#777777">'."\n";
     $result.= '<table border="0"><tr bgcolor="#deffff">'.
@@ -2314,19 +2397,8 @@
 	$javascript=&csvupload_javascript_forward_associate();
     }
 
-    my $result='<table border="0">';
-    $result.='<tr><td colspan=3><font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font></td></tr>';
-    my ($partlist,$handgrade) = &response_type($url);
-    my ($resptype,$hdgrade)=('','no');
-    for (sort keys(%$handgrade)) {
-	my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
-	$resptype = $responsetype;
-	$hdgrade = $handgrade if ($handgrade eq 'yes');
-	$result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.
-	    '<td><b>Type: </b>'.$responsetype.'</td>'.
-	    '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';
-    }
-    $result.='</table>';
+    my ($result,$resptype,$hdgrade,$partlist,$handgrade) = &showResourceInfo($url,$ENV{'form.probTitle'});
+
     $request->print(<<ENDPICK);
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <h3><font color="#339933">Uploading Class Grades</font></h3>
@@ -2354,7 +2426,8 @@
 $javascript
 </script>
 ENDPICK
-return '';
+    $request->print(&show_grading_menu_form($symb,$url));
+    return '';
 
 }
 
@@ -2400,9 +2473,11 @@
     </script>
 CSVFORMJS
     $ENV{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
+    my ($table) = &showResourceInfo($url,$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>Specify a file containing the class scores for problem - '.$ENV{'form.probTitle'}.
+    $result.='&nbsp;<b>Specify a file containing the class scores for current resource'.
 	'.</b></td></tr>'."\n";
     $result.='<tr bgcolor=#ffffe6><td>'."\n";
     my $upfile_select=&Apache::loncommon::upfile_select_html();
@@ -2421,7 +2496,6 @@
     $result.='</td></tr></table>'."\n";
     $result.='</td></tr></table><br /><br />'."\n";
     $result.=&show_grading_menu_form($symb,$url);
-
     return $result;
 }
 
@@ -2555,35 +2629,9 @@
     formname.submit();
 }
 
-function radioSelection(radioButton) {
-    var selection=null;
-    if (radioButton.length > 1) {
-	for (var i=0; i<radioButton.length; i++) {
-	    if (radioButton[i].checked) {
-		return radioButton[i].value;
-	    }
-	}
-    } else {
-	if (radioButton.checked) return radioButton.value;
-    }
-    return selection;
-}
-    
-function pullDownSelection(selectOne) {
-    var selection="";
-    if (selectOne.length > 1) {
-	for (var i=0; i<selectOne.length; i++) {
-	    if (selectOne[i].selected) {
-		return selectOne[i].value;
-	    }
-	}
-    } else {
-	if (selectOne.selected) return selectOne.value;
-    }
-}
 </script>
 LISTJAVASCRIPT
-
+    &commonJSfunctions($request);
     my ($symb,$url) = &get_symb_and_url($request);
     my $cdom      = $ENV{"course.$ENV{'request.course.id'}.domain"};
     my $cnum      = $ENV{"course.$ENV{'request.course.id'}.num"};
@@ -2624,7 +2672,7 @@
 	'<input type="radio" name="lastSub" value="all" /> all details'."\n";
 
     $result.='<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
-	'<input type="hidden" name="Status"     value="'.$ENV{'form.Status'}.'" />'."\n".
+	'<input type="hidden" name="Status"  value="'.$ENV{'form.Status'}.'" />'."\n".
 	'<input type="hidden" name="command" value="displayPage" />'."\n".
 	'<input type="hidden" name="url"     value="'.$url.'" />'."\n".
 	'<input type="hidden" name="symb"    value="'.$symb.'" />'."\n".
@@ -2736,12 +2784,12 @@
     my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL').
 	'/check.gif" height="16" border="0" />';
 
-    $studentTable.='&nbsp;<b>Note:</b> A problem graded correct ('.$checkIcon.
-	') by the computer cannot be changed.'."\n".
+    $studentTable.='&nbsp;<b>Note:</b> Problems graded correct by the computer are marked with a '.$checkIcon.
+	' symbol.'."\n".
 	'<table border="0"><tr><td bgcolor="#777777">'.
 	'<table border="0"><tr bgcolor="#e6ffff">'.
-	'<td align="center"><b>&nbsp;No&nbsp;</b></td>'.
-	'<td><b>&nbsp;'.($ENV{'form.vProb'} eq 'no' ? 'Title' : 'Problem View').'/Grade</b></td></tr>';
+	'<td align="center"><b>&nbsp;Prob.&nbsp;</b></td>'.
+	'<td><b>&nbsp;'.($ENV{'form.vProb'} eq 'no' ? 'Title' : 'Problem Text').'/Grade</b></td></tr>';
 
     my ($depth,$question) = (1,1);
     $iterator->next(); # skip the first BEGIN_MAP
@@ -2786,6 +2834,8 @@
 			$responseType{$partid} = $curRes->responseType($partid);
 		    }
 		    my ($version);
+		    my %mark;
+		    $mark{'correct_by_student'} = $checkIcon;
 		    for ($version=1;$version<=$record{'version'};$version++) {
 			my $timestamp = scalar(localtime($record{$version.':timestamp'}));
 			$studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>';
@@ -2801,8 +2851,9 @@
 				&cleanRecord($record{$version.':'.$matchKey[0]},$responseType{$partid}).'<br />' : '';
 			    $displaySub[1].=(exists $record{"$version:resource.$partid.award"}) ?
 				'<b>Part&nbsp;'.$partid.'</b> &nbsp;'.
-				$record{"$version:resource.$partid.award"}.'/'.
-				$record{"$version:resource.$partid.solved"}.'<br />' : '';
+				lc($record{"$version:resource.$partid.award"}).' '.
+				$mark{$record{"$version:resource.$partid.solved"}}.'<br />' : '';
+#				$record{"$version:resource.$partid.solved"}.'<br />' : '';
 			    $displaySub[2].=(exists $record{"$version:resource.$partid.regrader"}) ?
 				$record{"$version:resource.$partid.regrader"}.' (<b>Part:</b> '.$partid.')' : '';
 			}
@@ -2845,26 +2896,6 @@
     return '';
 }
 
-sub cleanRecord {
-    my ($answer,$response) = @_;
-    if ($response eq 'option') {
-	my (@IDs,@ans);
-	foreach (split(/\&/,&Apache::lonnet::unescape($answer))) {
-	    my ($optionID,$ans) = split(/=/);
-	    push @IDs,$optionID.'</font>';
-	    push @ans,$ans;
-	}
-	my $grayFont = '<font color="#999999">';
-	return '<table border="1">'.
-	    '<tr valign="top"><td>Answer</td><td>'.
-	    (join '</td><td>',@ans).'</td></tr>'.
-	    '<tr><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont.
-	    (join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'.
-	    '</table>';
-    }
-    return $answer;
-}
-
 sub updateGradeByPage {
     my ($request) = shift;
 
@@ -3335,11 +3366,13 @@
     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="+cmd+":saveSec="+pullDownSelection(formname.section)+
+	formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+
 	    ":saveSub="+radioSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status);
 	if (val < 5) formname.submit();
 	if (val == 5) {
@@ -3361,57 +3394,17 @@
 	}
 	return true;
     }
-
-    function radioSelection(radioButton) {
-	var selection=null;
-	if (radioButton.length > 1) {
-	    for (var i=0; i<radioButton.length; i++) {
-		if (radioButton[i].checked) {
-		    return radioButton[i].value;
-		}
-	    }
-	} else {
-	    if (radioButton.checked) return radioButton.value;
-	}
-	return selection;
-    }
-
-    function pullDownSelection(selectOne) {
-	var selection="";
-	if (selectOne.length > 1) {
-	    for (var i=0; i<selectOne.length; i++) {
-		if (selectOne[i].selected) {
-		    return selectOne[i].value;
-		}
-	    }
-	} else {
-	    if (selectOne.selected) return selectOne.value;
-	}
-    }
-
 </script>
 GRADINGMENUJS
-
-    my $result='<h3>&nbsp;<font color="#339933">Manual Grading/View Submission</font></h3>'.
-	'<table border="0">'.
-	'<tr><td colspan=3><font size=+1><b>Problem: </b>'.$probTitle.'</font></td></tr>'."\n";
-    my ($partlist,$handgrade) = &response_type($url);
-    my ($resptype,$hdgrade)=('','no');
-    for (sort keys(%$handgrade)) {
-	my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
-	$resptype = $responsetype;
-	$hdgrade = $handgrade if ($handgrade eq 'yes');
-	$result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.
-	    '<td><b>Type: </b>'.$responsetype.'</td></tr>';
-#	    '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';
-    }
-    $result.='</table>'."\n";
-
+    &commonJSfunctions($request);
+    my $result='<h3>&nbsp;<font color="#339933">Manual Grading/View Submission</font></h3>';
+    my ($table,$resptype,$hdgrade) = &showResourceInfo($url,$probTitle);
+    $result.=$table;
     my (undef,$sections) = &getclasslist('all','0');
     my $savedState = &savedState();
-    my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'pickStudentPage' : $$savedState{'saveCmd'});
+    my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'});
     my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'});
-    my $saveSub = ($$savedState{'saveSub'} eq '' ? 'yes' : $$savedState{'saveSub'});
+    my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'});
     my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'});
 
     $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
@@ -3431,7 +3424,7 @@
 
     $result.='<table width="100%" border=0>';
     $result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n".
-	'&nbsp;Section: <select name="section">'."\n";
+	'&nbsp;Select Section: <select name="section">'."\n";
     if (ref($sections)) {
 	foreach (sort (@$sections)) {$result.='<option value="'.$_.'" '.
 					 ($saveSec eq $_ ? 'selected="on"' : '').'>'.$_.'</option>'."\n";}
@@ -3446,24 +3439,24 @@
     }
     $result.='</td></tr>';
 
-    $result.='<tr bgcolor="#ffffe6" valign="top"><td>'.
-	'<input type="radio" name="radioChoice" value="pickStudentPage" '.
-	($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '.
-	'One student for whole page/sequence/folder</td></tr>'."\n";
+    $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
+	'<input type="radio" name="radioChoice" value="submission" '.
+	($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students'.
+	'<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-->For students with '.
+	'<input type="radio" name="submitonly" value="yes" '.
+	($saveSub eq 'yes' ? 'checked' : '').' /> submissions or '.
+	'<input type="radio" name="submitonly" value="all" '.
+	($saveSub eq 'all' ? 'checked' : '').' /> for all</td></tr>'."\n";
 
     $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
 	'<input type="radio" name="radioChoice" value="viewgrades" '.
 	($saveCmd eq 'viewgrades' ? 'checked' : '').'> '.
-	'All students in section/course for current resource</td></tr>'."\n";
+	'<b>Current Resource:</b> For all students in selected section or course</td></tr>'."\n";
 
-    $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
-	'<input type="radio" name="radioChoice" value="submission" '.
-	($saveCmd eq 'submission' ? 'checked' : '').'> '.'One or more students for current resource'.
-	'<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-->For students who has: '.
-	'<input type="radio" name="submitonly" value="yes" '.
-	($saveSub eq 'yes' ? 'checked' : '').' /> submitted'.
-	'<input type="radio" name="submitonly" value="all" '.
-	($saveSub eq 'all' ? 'checked' : '').' /> everybody</td></tr>'."\n";
+    $result.='<tr bgcolor="#ffffe6" valign="top"><td>'.
+	'<input type="radio" name="radioChoice" value="pickStudentPage" '.
+	($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '.
+	'The <b>complete</b> set/page/sequence: For one student</td></tr>'."\n";
 
     $result.='<tr bgcolor="#ffffe6"><td><br />'.
 	'<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="View/Grade/Regrade" />'.

--ng1058479705--