--- loncom/homework/grades.pm	2005/08/12 21:33:41	1.278
+++ loncom/homework/grades.pm	2005/09/20 06:45:02	1.285
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.278 2005/08/12 21:33:41 albertel Exp $
+# $Id: grades.pm,v 1.285 2005/09/20 06:45:02 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -471,6 +471,10 @@ sub most_similar {
 
     $uessay=~s/\W+/ /gs;
 
+# ignore empty submissions (occuring when only files are sent)
+
+    unless ($uessay=~/\w+/) { return ''; }
+
 # these will be returned. Do not care if not at least 50 percent similar
     my $limit=0.6;
     my $sname='';
@@ -2656,7 +2660,6 @@ sub viewgrades {
 sub viewstudentgrade {
     my ($url,$symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets) = @_;
     my ($uname,$udom) = split(/:/,$student);
-    $student=~s/:/_/;
     my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname);
     my %aggregates = (); 
     my $result='<tr bgcolor="#ffffdd"><td align="right">'.
@@ -2665,6 +2668,7 @@ sub viewstudentgrade {
 	'<a href="javascript:viewOneStudent(\''.$uname.'\',\''.$udom.
 	'\')"; TARGET=_self>'.$fullname.'</a> '.
 	'<font color="#999999">('.$uname.($env{'user.domain'} eq $udom ? '' : ':'.$udom).')</font></td>'."\n";
+    $student=~s/:/_/; # colon doen't work in javascript for names
     foreach my $apart (@$parts) {
 	my ($part,$type) = &split_part_type($apart);
 	my $score=$record{"resource.$part.$type"};
@@ -2786,12 +2790,10 @@ sub editgrades {
     for ($i=0; $i<$env{'form.total'}; $i++) {
 	my $line;
 	my $user = $env{'form.ctr'.$i};
-	my $usercolon = $user;
-	$usercolon =~s/_/:/;
-	my ($uname,$udom)=split(/_/,$user);
+	my ($uname,$udom)=split(/:/,$user);
 	my %newrecord;
 	my $updateflag = 0;
-	$line .= '<td>'.&nameUserString(undef,$$fullname{$usercolon},$uname,$udom).'</td>';
+	$line .= '<td>'.&nameUserString(undef,$$fullname{$user},$uname,$udom).'</td>';
 	my $usec=$classlist->{"$uname:$udom"}[5];
 	if (!&canmodify($usec)) {
 	    my $numcols=scalar(@partid)*4+2;
@@ -2800,6 +2802,7 @@ sub editgrades {
 	}
         my %aggregate = ();
         my $aggregateflag = 0;
+	$user=~s/:/_/; # colon doen't work in javascript for names
 	foreach (@partid) {
 	    my $old_aw    = $env{'form.GD_'.$user.'_'.$_.'_awarded_s'};
 	    my $old_part_pcr = $old_aw/($weight{$_} ne '0' ? $weight{$_}:1);
@@ -3062,10 +3065,7 @@ sub csvuploadmap_footer {
 ENDPICK
 }
 
-sub upcsvScores_form {
-    my ($request) = shift;
-    my ($symb,$url)=&get_symb_and_url($request);
-    if (!$symb) {return '';}
+sub checkforfile_js {
     my $result =<<CSVFORMJS;
 <script type="text/javascript" language="javascript">
     function checkUpload(formname) {
@@ -3077,6 +3077,14 @@ sub upcsvScores_form {
     }
     </script>
 CSVFORMJS
+    return $result;
+}
+
+sub upcsvScores_form {
+    my ($request) = shift;
+    my ($symb,$url)=&get_symb_and_url($request);
+    if (!$symb) {return '';}
+    my $result=&checkforfile_js();
     $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
     my ($table) = &showResourceInfo($url,$env{'form.probTitle'});
     $result.=$table;
@@ -3096,7 +3104,7 @@ CSVFORMJS
 <input type="hidden" name="saveState"  value="$env{'form.saveState'}" />
 $upfile_select
 <br /><input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Scores" />
-<label><input type="checkbox" name="noFirstLine" />$ignore</lable>
+<label><input type="checkbox" name="noFirstLine" />$ignore</label>
 </form>
 ENDUPFORM
     $result.='</td></tr></table>'."\n";
@@ -4370,14 +4378,26 @@ sub check_for_error {
 sub scantron_warning_screen {
     my ($button_text)=@_;
     my $title=&Apache::lonnet::gettitle($env{'form.selectpage'});
+    my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+    my $CODElist="a";
+    if ($scantron_config{'CODElocation'} &&
+	$scantron_config{'CODEstart'} &&
+	$scantron_config{'CODElength'}) {
+	$CODElist=$env{'form.scantron_CODElist'};
+	if ($CODElist eq '') { $CODElist='<font color="red">None</font>'; }
+	$CODElist=
+	    '<tr><td><b>List of CODES to validate against:</b></td><td><tt>'.
+	    $CODElist.'</tt></td></tr>';
+    }
     return (<<STUFF);
 <p>
 <font color="red">Please double check the information
                  below before clicking on '$button_text'</font>
 </p>
 <table>
-<tr><td><b>Sequence To be Graded:</b></td><td>$title</td></tr>
+<tr><td><b>Sequence to be Graded:</b></td><td>$title</td></tr>
 <tr><td><b>Data File that will be used:</b></td><td><tt>$env{'form.scantron_selectfile'}</tt></td></tr>
+$CODElist
 </table>
 </font>
 <br />
@@ -4869,9 +4889,16 @@ sub scantron_get_closely_matching_CODEs
 }
 
 sub get_codes {
-    my $old_name=$env{'form.scantron_CODElist'};
-    my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
-    my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
+    my ($old_name, $cdom, $cnum) = @_;
+    if (!$old_name) {
+	$old_name=$env{'form.scantron_CODElist'};
+    }
+    if (!$cdom) {
+	$cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
+    }
+    if (!$cnum) {
+	$cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
+    }
     my %result=&Apache::lonnet::get('CODEs',[$old_name,"type\0$old_name"],
 				    $cdom,$cnum);
     my %allcodes;
@@ -5412,6 +5439,9 @@ GRADINGMENUJS
     $result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="2">'.
 	'<input type="button" onClick="javascript:this.form.action=\'/adm/helper/resettimes.helper\';this.form.submit();'.
 	'" value="'.&mt('Manage').'" /> access times.</td></tr>'."\n";
+    $result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="2">'.
+	'<input type="button" onClick="javascript:this.form.command.value=\'codelist\';this.form.action=\'/adm/pickcode\';this.form.submit();'.
+	'" value="'.&mt('View').'" /> saved CODEs.</td></tr>'."\n";
 
     $result.='</form></td></tr></table>'."\n".
 	'</td></tr></table>'."\n".
@@ -5419,10 +5449,32 @@ GRADINGMENUJS
     return $result;
 }
 
+sub reset_perm {
+    undef(%perm);
+}
+
+sub init_perm {
+    &reset_perm();
+    if (!($perm{'vgr'}=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
+	if ($perm{'vgr'}=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
+	    $perm{'vgr_section'}=$env{'request.course.sec'};
+	} else {
+	    delete($perm{'vgr'});
+	}
+    }
+    if (!($perm{'mgr'}=&Apache::lonnet::allowed('mgr',$env{'request.course.id'}))) {
+	if ($perm{'mgr'}=&Apache::lonnet::allowed('mgr',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
+	    $perm{'mgr_section'}=$env{'request.course.sec'};
+	} else {
+	    delete($perm{'mgr'});
+	}
+    }
+}
+
 sub handler {
     my $request=$_[0];
 
-    undef(%perm);
+    &reset_perm();
     if ($env{'browser.mathml'}) {
 	&Apache::loncommon::content_type($request,'text/xml');
     } else {
@@ -5471,20 +5523,7 @@ sub handler {
 	    }
 	}
     } else {
-	if (!($perm{'vgr'}=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
-	    if ($perm{'vgr'}=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
-		$perm{'vgr_section'}=$env{'request.course.sec'};
-	    } else {
-		delete($perm{'vgr'});
-	    }
-	}
-	if (!($perm{'mgr'}=&Apache::lonnet::allowed('mgr',$env{'request.course.id'}))) {
-	    if ($perm{'mgr'}=&Apache::lonnet::allowed('mgr',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
-		$perm{'mgr_section'}=$env{'request.course.sec'};
-	    } else {
-		delete($perm{'mgr'});
-	    }
-	}
+	&init_perm();
 	if ($command eq 'submission' && $perm{'vgr'}) {
 	    ($env{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0));
 	} elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {