--- loncom/homework/grades.pm	2005/09/20 06:45:02	1.285
+++ loncom/homework/grades.pm	2005/10/04 17:02:41	1.292
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.285 2005/09/20 06:45:02 albertel Exp $
+# $Id: grades.pm,v 1.292 2005/10/04 17:02:41 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -334,7 +334,16 @@ COMMONJSFUNCTIONS
 #--- section, ids and fullnames for each user.
 sub getclasslist {
     my ($getsec,$filterlist) = @_;
-    $getsec = $getsec eq '' ? 'all' : $getsec;
+    my @getsec;
+    if (!ref($getsec)) {
+	if ($getsec ne '' && $getsec ne 'all') {
+	    @getsec=($getsec);
+	}
+    } else {
+	@getsec=@{$getsec};
+    }
+    if (grep(/^all$/,@getsec)) { undef(@getsec); }
+
     my $classlist=&Apache::loncoursedata::get_classlist();
     # Bail out if we were unable to get the classlist
     return if (! defined($classlist));
@@ -363,7 +372,7 @@ sub getclasslist {
 	}
 	$section = ($section ne '' ? $section : 'none');
 	if (&canview($section)) {
-	    if ($getsec eq 'all' || $getsec eq $section) {
+	    if (!@getsec || grep(/^\Q$section\E$/,@getsec)) {
 		$sections{$section}++;
 		$fullnames{$student}=$fullname;
 	    } else {
@@ -1370,10 +1379,10 @@ sub gradeBox {
     my $ctr = 0;
     $result.='<table border="0"><tr>'."\n";  # display radio buttons in a nice table 10 across
     while ($ctr<=$wgt) {
-	$result.= '<td><nobr><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '.
+	$result.= '<td><nobr><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '.
 	    'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','.
 	    $ctr.')" value="'.$ctr.'" '.
-	    ($score eq $ctr ? 'checked':'').' /> '.$ctr."</nobr></td>\n";
+	    ($score eq $ctr ? 'checked':'').' /> '.$ctr."</label></nobr></td>\n";
 	$result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');
 	$ctr++;
     }
@@ -2332,7 +2341,7 @@ sub version_portfiles {
                 } else {
                    my $copy_result = &Apache::lonnet::finishuserfileupload($stuname,$domain,'copy',
                                     '/portfolio'.$directory.$answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]);
-                    push(@v_portfiles, $answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]);
+                    push(@v_portfiles, $directory.$answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]);
                     &Apache::lonnet::mark_as_readonly($domain,$stuname,
                                 ['/portfolio'.$directory.$answer_file_parts[0].'.'.$version.'.'.$answer_file_parts[-1]],
                                 [$symb,$env{'request.course.id'},'graded']);
@@ -2394,6 +2403,7 @@ sub viewgrades_js {
 	}
 	for (i=0;i<document.classgrade.total.value;i++) {
 	    var user = document.classgrade["ctr"+i].value;
+	    user = user.replace(new RegExp(':', 'g'),"_");
 	    var scorename = document.classgrade["GD_"+user+"_"+partid+"_awarded"];
 	    var saveval   = document.classgrade["GD_"+user+"_"+partid+"_solved_s"].value;
 	    var selname   = document.classgrade["GD_"+user+"_"+partid+"_solved"];
@@ -2421,6 +2431,7 @@ sub viewgrades_js {
 
 	    for (i=0;i<document.classgrade.total.value;i++) {
 		var user = document.classgrade["ctr"+i].value;
+		user = user.replace(new RegExp(':', 'g'),"_");
 		var scorename = document.classgrade["GD_"+user+"_"+partid+"_awarded"];
 		var saveval   = document.classgrade["GD_"+user+"_"+partid+"_solved_s"].value;
 		var selname   = document.classgrade["GD_"+user+"_"+partid+"_solved"];
@@ -2438,6 +2449,7 @@ sub viewgrades_js {
 	} else {
 	    for (i=0;i<document.classgrade.total.value;i++) {
 		var user = document.classgrade["ctr"+i].value;
+		user = user.replace(new RegExp(':', 'g'),"_");
 		var scorename = document.classgrade["GD_"+user+"_"+partid+"_awarded"];
 		var saveval   = document.classgrade["GD_"+user+"_"+partid+"_solved_s"].value;
 		var selname   = document.classgrade["GD_"+user+"_"+partid+"_solved"];
@@ -2496,6 +2508,7 @@ sub viewgrades_js {
 
 	    for (i=0;i<document.classgrade.total.value;i++) {
 		var user = document.classgrade["ctr"+i].value;
+		user = user.replace(new RegExp(':', 'g'),"_");
 		var resetscore = document.classgrade["GD_"+user+"_"+partid+"_awarded"];
 		resetscore.value = document.classgrade["GD_"+user+"_"+partid+"_awarded_s"].value;
 		var resettries = document.classgrade["GD_"+user+"_"+partid+"_tries"];
@@ -2579,9 +2592,9 @@ sub viewgrades {
 	$result.='<table border="0"><tr>';  
 	my $ctr = 0;
 	while ($ctr<=$weight{$partid}) { # display radio buttons in a nice table 10 across
-	    $result.= '<td><input type="radio" name="RADVAL_'.$partid.'" '.
+	    $result.= '<td><label><input type="radio" name="RADVAL_'.$partid.'" '.
 		'onclick="javascript:writePoint(\''.$partid.'\','.$weight{$partid}.
-		','.$ctr.')" />'.$ctr."</td>\n";
+		','.$ctr.')" />'.$ctr."</label></td>\n";
 	    $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');
 	    $ctr++;
 	}
@@ -2822,13 +2835,14 @@ sub editgrades {
 	    my $dropMenu = $env{'form.GD_'.$user.'_'.$_.'_solved'};
 	    $score = 'excused' if (($dropMenu eq 'excused') && ($score ne 'excused'));
 
+	    $newrecord{'resource.'.$_.'.regrader'}=
+		"$env{'user.name'}:$env{'user.domain'}";
 	    if ($dropMenu eq 'reset status' &&
 		$old_score ne '') { # ignore if no previous attempts => nothing to reset
 		$newrecord{'resource.'.$_.'.tries'} = 0;
 		$newrecord{'resource.'.$_.'.solved'} = '';
 		$newrecord{'resource.'.$_.'.award'} = '';
 		$newrecord{'resource.'.$_.'.awarded'} = 0;
-		$newrecord{'resource.'.$_.'.regrader'}="$env{'user.name'}:$env{'user.domain'}";
 		$updateflag = 1;
                 if ($env{'form.GD_'.$user.'_'.$_.'_aggtries'} > 0) {
                     my $aggtries = $env{'form.GD_'.$user.'_'.$_.'_aggtries'};
@@ -3162,7 +3176,6 @@ sub csvuploadoptions {
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <h3><font color="#339933">Uploading Class Grade Options</font></h3>
 <input type="hidden" name="command"    value="csvuploadassign" />
-<input type="submit" value="Assign Grades" /><br />
 <p>
 <label>
    <input type="checkbox" name="show_full_results" />
@@ -3190,7 +3203,8 @@ ENDPICK
     }
     # FIXME do a check for any duplicated user ids...
     # FIXME do a check for any invalid user ids?...
-    $request->print("<hr /></form>\n");
+    $request->print('<input type="submit" value="Assign Grades" /><br />
+<hr /></form>'."\n");
     $request->print(&show_grading_menu_form($symb,$url));
     return '';
 }
@@ -3365,13 +3379,13 @@ LISTJAVASCRIPT
     $result.='<input type="hidden" name="page" />'."\n".
 	'<input type="hidden" name="title" />'."\n";
 
-    $result.='&nbsp;<b>View Problems Text: </b><input type="radio" name="vProb" value="no" checked="on" /> no '."\n".
-	'<input type="radio" name="vProb" value="yes" /> yes '."<br>\n";
+    $result.='&nbsp;<b>View Problems Text: </b><label><input type="radio" name="vProb" value="no" checked="on" /> no </label>'."\n".
+	'<label><input type="radio" name="vProb" value="yes" /> yes </label>'."<br />\n";
 
     $result.='&nbsp;<b>Submission Details: </b>'.
-	'<input type="radio" name="lastSub" value="none" /> none'."\n".
-	'<input type="radio" name="lastSub" value="datesub" checked /> by dates and submissions'."\n".
-	'<input type="radio" name="lastSub" value="all" /> all details'."\n";
+	'<label><input type="radio" name="lastSub" value="none" /> none</label>'."\n".
+	'<label><input type="radio" name="lastSub" value="datesub" checked /> by dates and submissions</label>'."\n".
+	'<label><input type="radio" name="lastSub" value="all" /> all details</label>'."\n";
 
     $result.='<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
 	'<input type="hidden" name="Status"  value="'.$env{'form.Status'}.'" />'."\n".
@@ -3399,8 +3413,8 @@ LISTJAVASCRIPT
 	my ($uname,$udom) = split(/:/,$student);
 	$studentTable.=($ptr%2 == 1 ? '<tr bgcolor="#ffffe6">' : '</td>');
 	$studentTable.='<td align="right">'.$ptr.'&nbsp;</td>';
-	$studentTable.='<td>&nbsp;<input type="radio" name="student" value="'.$student.'" /> '
-	    .&nameUserString(undef,$$fullname{$student},$uname,$udom)."\n";
+	$studentTable.='<td>&nbsp;<label><input type="radio" name="student" value="'.$student.'" /> '
+	    .&nameUserString(undef,$$fullname{$student},$uname,$udom)."</label>\n";
 	$studentTable.=($ptr%2 == 0 ? '</td></tr>' : '');
 	$ptr++;
     }
@@ -3472,7 +3486,11 @@ sub displayPage {
     my $navmap = Apache::lonnavmaps::navmap->new();
     my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($env{'form.page'});
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
-
+    if (!$map) {
+	$request->print('<font color="red">Unable to view requested sequence. ('.$resUrl.')</font>');
+	$request->print(&show_grading_menu_form($symb,$url));
+	return; 
+    }
     my $iterator = $navmap->getIterator($map->map_start(),
 					$map->map_finish());
 
@@ -3678,7 +3696,12 @@ sub updateGradeByPage {
     my $navmap = Apache::lonnavmaps::navmap->new();
     my ($mapUrl, $id, $resUrl) = &Apache::lonnet::decode_symb( $env{'form.page'});
     my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
-
+    if (!$map) {
+	$request->print('<font color="red">Unable to grade requested sequence. ('.$resUrl.')</font>');
+	my ($symb,$url)=&get_symb_and_url($request);
+	$request->print(&show_grading_menu_form($symb,$url));
+	return; 
+    }
     my $iterator = $navmap->getIterator($map->map_start(),
 					$map->map_finish());
 
@@ -4324,7 +4347,7 @@ sub scantron_process_corrections {
 	}
     }
     if ($err) {
-	$r->print("Unable to accept last correction, an error occurred :$errmsg:");
+	$r->print("<font color='red'>Unable to accept last correction, an error occurred :$errmsg:</font>");
     } else {
 	&scantron_put_line($scanlines,$scan_data,$which,$line,$skip);
 	&scantron_putfile($scanlines,$scan_data);
@@ -5390,10 +5413,10 @@ GRADINGMENUJS
 
     $result.='</td></tr>';
 
-    $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
+    $result.='<tr bgcolor="#ffffe6"valign="top"><td><label>'.
 	'<input type="radio" name="radioChoice" value="submission" '.
 	($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>'.&mt('Current Resource').':</b> '.&mt('For one or more students').
-	' <select name="submitonly">'.
+	'</label> <select name="submitonly">'.
 	'<option value="yes" '.
 	($saveSub eq 'yes' ? 'selected="on"' : '').'>with submissions</option>'.
 	'<option value="graded" '.
@@ -5404,14 +5427,14 @@ GRADINGMENUJS
 	($saveSub eq 'all' ? 'selected="on"' : '').'>with any status</option></select></td></tr>'."\n";
 
     $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
-	'<input type="radio" name="radioChoice" value="viewgrades" '.
+	'<label><input type="radio" name="radioChoice" value="viewgrades" '.
 	($saveCmd eq 'viewgrades' ? 'checked' : '').'> '.
-	'<b>Current Resource:</b> For all students in selected section or course</td></tr>'."\n";
+	'<b>Current Resource:</b> For all students in selected section or course</label></td></tr>'."\n";
 
     $result.='<tr bgcolor="#ffffe6" valign="top"><td>'.
-	'<input type="radio" name="radioChoice" value="pickStudentPage" '.
+	'<label><input type="radio" name="radioChoice" value="pickStudentPage" '.
 	($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '.
-	'The <b>complete</b> set/page/sequence: For one student</td></tr>'."\n";
+	'The <b>complete</b> set/page/sequence: For one student</label></td></tr>'."\n";
 
     $result.='<tr bgcolor="#ffffe6"><td><br />'.
 	'<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="Next->" />'.