--- loncom/homework/grades.pm	2010/01/15 16:41:43	1.588
+++ loncom/homework/grades.pm	2010/12/22 17:11:12	1.596.2.3
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # The LON-CAPA Grading handler
 #
-# $Id: grades.pm,v 1.588 2010/01/15 16:41:43 bisitz Exp $
+# $Id: grades.pm,v 1.596.2.3 2010/12/22 17:11:12 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -160,6 +160,10 @@ sub response_type {
         return;
     }
     my $res = $navmap->getBySymb($symb);
+    unless (ref($res)) {
+        $$response_error = 1;
+        return;
+    }
     my $partlist = $res->parts();
     my %vPart = 
 	map { $_ => 1 } (&Apache::loncommon::get_env_multiple('form.vPart'));
@@ -267,8 +271,13 @@ sub reset_caches {
     }
 
     sub get_analyze {
-	my ($symb,$uname,$udom,$no_increment,$add_to_hash)=@_;
+	my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed)=@_;
 	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') {
@@ -296,9 +305,15 @@ sub reset_caches {
                     'grade_courseid'    =>  $env{'request.course.id'},
                     'grade_username'    => $uname,
                     'grade_noincrement' => $no_increment);
+        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);
@@ -311,15 +326,15 @@ sub reset_caches {
     }
 
     sub get_order {
-	my ($partid,$respid,$symb,$uname,$udom,$no_increment)=@_;
-	my $analyze = &get_analyze($symb,$uname,$udom,$no_increment);
+	my ($partid,$respid,$symb,$uname,$udom,$no_increment,$type,$trial,$rndseed)=@_;
+	my $analyze = &get_analyze($symb,$uname,$udom,$no_increment,undef,$type,$trial,$rndseed);
 	return $analyze->{"$partid.$respid.shown"};
     }
 
     sub get_radiobutton_correct_foil {
-	my ($partid,$respid,$symb,$uname,$udom)=@_;
-	my $analyze = &get_analyze($symb,$uname,$udom);
-        my $foils = &get_order($partid,$respid,$symb,$uname,$udom);
+	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);
         if (ref($foils) eq 'ARRAY') {
 	    foreach my $foil (@{$foils}) {
 	        if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') {
@@ -361,7 +376,7 @@ sub reset_caches {
 #        response types only.
 sub cleanRecord {
     my ($answer,$response,$symb,$partid,$respid,$record,$order,$version,
-	$uname,$udom) = @_;
+	$uname,$udom,$type,$trial,$rndseed) = @_;
     my $grayFont = '<span class="LC_internal_info">';
     if ($response =~ /^(option|rank)$/) {
 	my %answer=&Apache::lonnet::str2hash($answer);
@@ -378,7 +393,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>'.
-	    $grayFont.$bottomrow.'</tr>'.'</table></blockquote>';
+	    $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"});
@@ -405,7 +420,7 @@ sub cleanRecord {
 	my %answer=&Apache::lonnet::str2hash($answer);
 	my ($toprow,$bottomrow);
 	my $correct = 
-	    &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom);
+	    &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed);
 	foreach my $foil (@$order) {
 	    if (exists($answer{$foil})) {
 		if ($foil eq $correct) {
@@ -944,10 +959,18 @@ LISTJAVASCRIPT
     my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status;
     $env{'form.Status'} = $saveStatus;
     $submission_options.=
-	'<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '.&mt('last submission only').' </label>'."\n".
-	'<label><input type="radio" name="lastSub" value="last" /> '.&mt('last submission &amp; parts info').' </label>'."\n".
-	'<label><input type="radio" name="lastSub" value="datesub" /> '.&mt('by dates and submissions').' </label>'."\n".
-	'<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').'</label>';
+        '<span class="LC_nobreak">'.
+        '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '.
+        &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" /> '.
+        &mt('by dates and submissions').'</label></span>'."\n".
+        '<span class="LC_nobreak">'.
+        '<label><input type="radio" name="lastSub" value="all" /> '.
+        &mt('all details').'</label></span>';
     $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Submissions'))
                   .$submission_options
                   .&Apache::lonhtmlcommon::row_closure();
@@ -993,8 +1016,8 @@ LISTJAVASCRIPT
 # checkall buttons
     $gradeTable.=&check_script('gradesub', 'stuinfo');
     $gradeTable.='<input type="button" '."\n".
-	'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n".
-	'value="'.&mt('Next').' &rarr;" /> <br />'."\n";
+        'onclick="javascript:checkSelect(this.form.stuinfo);" '."\n".
+        'value="'.&mt('Next').' &rarr;" /> <br />'."\n";
     $gradeTable.=&check_buttons();
     my ($classlist, undef, $fullname) = &getclasslist($getsec,'1',$getgroup);
     $gradeTable.= &Apache::loncommon::start_data_table().
@@ -1111,9 +1134,9 @@ LISTJAVASCRIPT
     }
 
     $gradeTable.=&Apache::loncommon::end_data_table()."\n".
-	'<input type="button" '.
-	'onClick="javascript:checkSelect(this.form.stuinfo);" '.
-	'value="'.&mt('Next').' &rarr;" /></form>'."\n";
+        '<input type="button" '.
+        'onclick="javascript:checkSelect(this.form.stuinfo);" '.
+        'value="'.&mt('Next').' &rarr;" /></form>'."\n";
     if ($ctr == 0) {
 	my $num_students=(scalar(keys(%$fullname)));
 	if ($num_students eq 0) {
@@ -1617,8 +1640,8 @@ INNERJS
     pDoc = pWin.document;
     pDoc.write("<\\/table>");
     pDoc.write("<\\/td><\\/tr><\\/table>&nbsp;");
-    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("<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();
@@ -1691,8 +1714,8 @@ INNERJS
     var hDoc = hwdWin.document;
     hDoc.write("<\\/table>");
     hDoc.write("<\\/td><\\/tr><\\/table>&nbsp;");
-    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("<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();
@@ -1757,7 +1780,7 @@ sub gradeBox {
     my $radio.='<table border="0"><tr>'."\n";  # display radio buttons in a nice table 10 across
     while ($thisweight<=$wgt) {
 	$radio.= '<td><span class="LC_nobreak"><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '.
-	    'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','.
+        'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','.
 	    $thisweight.')" value="'.$thisweight.'" '.
 	    ($score eq $thisweight ? 'checked="checked"':'').' /> '.$thisweight."</label></span></td>\n";
 	$radio.=(($ctr+1)%10 == 0 ? '</tr><tr>' : '');
@@ -1768,13 +1791,13 @@ sub gradeBox {
 
     my $line.='<input type="text" name="GD_BOX'.$counter.'_'.$partid.'"'.
 	($score ne ''? ' value = "'.$score.'"':'').' size="4" '.
-	'onChange="javascript:updateRadio(this.form,\''.$counter.'_'.$partid.'\','.
+	'onchange="javascript:updateRadio(this.form,\''.$counter.'_'.$partid.'\','.
 	$wgt.')" /></td>'."\n";
     $line.='<td>/'.$wgt.' '.$wgtmsg.
 	($$record{'resource.'.$partid.'.solved'} eq 'correct_by_student' ? '&nbsp;'.$checkIcon : '').
 	' </td>'."\n";
     $line.='<td><select name="GD_SEL'.$counter.'_'.$partid.'" '.
-	'onChange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n";
+	'onchange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n";
     if ($$record{'resource.'.$partid.'.solved'} eq 'excused') {
 	$line.='<option></option>'.
 	    '<option value="excused" selected="selected">'.&mt('excused').'</option>';
@@ -2063,7 +2086,7 @@ sub submission {
 	    $request->print(<<KEYWORDS);
 &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"
+<a href="#" onmousedown="javascript:getSel(); return false"
  CLASS="page">Paste Selection to List</a>&nbsp; &nbsp;
 <a href="javascript:kwhighlight();" target="_self">Highlight Attribute</a><br /><br />
 KEYWORDS
@@ -2079,12 +2102,31 @@ KEYWORDS
     }
 
 # This is where output for one specific student would start
-    my $add_class = ($counter%2) ? 'LC_grade_show_user_odd_row' : '';
-    $request->print("\n\n".
-                    '<div class="LC_grade_show_user '.$add_class.'">'.
-		    '<div class="LC_grade_user_name">'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).'</div>'.
-		    '<div class="LC_grade_show_user_body">'."\n");
+    my $add_class = ($counter%2) ? ' LC_grade_show_user_odd_row' : '';
+    $request->print(
+        "\n\n"
+       .'<div class="LC_grade_show_user'.$add_class.'">'
+       .'<h2>'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).'</h2>'
+       ."\n"
+    );
+
+    # Show additional functions if allowed
+    if ($perm{'vgr'}) {
+        $request->print(
+            &Apache::loncommon::track_student_link(
+                &mt('View recent activity'),
+                $uname,$udom,'check')
+           .' '
+        );
+    }
+    if ($perm{'opa'}) {
+        $request->print(
+            &Apache::loncommon::pprmlink(
+                &mt('Set/Change parameters'),
+                $uname,$udom,$symb,'check'));
+    }
 
+    # Show Problem
     if ($env{'form.vProb'} eq 'all' or $env{'form.vAns'} eq 'all') {
 	my $mode;
 	if ($env{'form.vProb'} eq 'all' && $env{'form.vAns'} eq 'all') {
@@ -2108,10 +2150,9 @@ KEYWORDS
 
     # Display student info
     $request->print(($counter == 0 ? '' : '<br />'));
-    my $result='<div class="LC_grade_submissions">';
-    
-    $result.='<div class="LC_Box">'
-            .'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>';
+
+    my $result='<div class="LC_Box">'
+              .'<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') {
@@ -2145,7 +2186,9 @@ KEYWORDS
         if ($$timestamp eq '') {
             $lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; 
         } else {
-            $lastsubonly = '<div class="LC_grade_submissions_body"> <b>Date Submitted:</b> '.$$timestamp."\n";
+            $lastsubonly =
+                '<div class="LC_grade_submissions_body">'
+               .'<b>'.&mt('Date Submitted:').'</b> '.$$timestamp."\n";
 
 	    my %seenparts;
 	    my @part_response_id = &flatten_responseType($responseType);
@@ -2180,9 +2223,15 @@ KEYWORDS
 		foreach my $submission (@$string) {
 		    my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/);
 		    if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; }
-		    my ($ressub,$subval) = split(/:/,$submission,2);
+		    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,$subval,\%old_essays);
@@ -2192,19 +2241,25 @@ KEYWORDS
 				&Apache::lonnet::coursedescription($ocrsid,
 								   {'one_time' => 1});
 
-			    $similar="<hr /><h3><span class=\"LC_warning\">".
-				&mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])',
-				    $osim,
-				    &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')',
-				    $old_course_desc{'description'},
-				    $old_course_desc{'num'},
-				    $old_course_desc{'domain'}).
-				'</span></h3><blockquote><i>'.
-				&keywords_highlight($oessay).
-				'</i></blockquote><hr />';
+                            if ($hide eq 'anon') {
+                                $similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'.
+                                         &mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />';
+                            } else {
+			        $similar="<hr /><h3><span class=\"LC_warning\">".
+				    &mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])',
+				        $osim,
+				        &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')',
+				        $old_course_desc{'description'},
+				        $old_course_desc{'num'},
+				        $old_course_desc{'domain'}).
+				    '</span></h3><blockquote><i>'.
+				    &keywords_highlight($oessay).
+				    '</i></blockquote><hr />';
+                            }
 			}
 		    }
-		    my $order=&get_order($partid,$respid,$symb,$uname,$udom);
+		    my $order=&get_order($partid,$respid,$symb,$uname,$udom,
+                                         undef,$type,$trial,$rndseed);
 		    if ($env{'form.lastSub'} eq 'lastonly' || 
 			($env{'form.lastSub'} eq 'hdgrade' && 
 			 $$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) {
@@ -2216,18 +2271,24 @@ KEYWORDS
                             '</b></span>&nbsp; &nbsp;';
 			my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record);
 			if (@$files) {
-			    $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />';
-			    my $file_counter = 0;
-			    foreach my $file (@$files) {
-			        $file_counter++;
-				&Apache::lonnet::allowuploaded('/adm/grades',$file);
-				$lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>';
-			    }
+                            if ($hide eq 'anon') {
+                                $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 />';
+                                foreach my $file (@$files) {
+                                    &Apache::lonnet::allowuploaded('/adm/grades',$file);
+                                    $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>';
+                                }
+                            }
 			    $lastsubonly.='<br />';
 			}
-			$lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'.
-			    &cleanRecord($subval,$responsetype,$symb,$partid,
-					 $respid,\%record,$order,undef,$uname,$udom);
+                        if ($hide eq 'anon') {
+                            $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);
+                        }
 			if ($similar) {$lastsubonly.="<br /><br />$similar\n";}
 			$lastsubonly.='</div>';
 		    }
@@ -2251,7 +2312,7 @@ KEYWORDS
     # 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\',\''
+	    'onclick="javascript:checksubmit(this.form,\'Grade Student\',\''
 	    .$counter.'\');" target="_self" /> &nbsp;'."\n" if (&canmodify($usec));
 	$toGrade.='</div>'."\n";
 	if (($env{'form.command'} eq 'submission') || 
@@ -2299,7 +2360,7 @@ KEYWORDS
         '<div class="LC_Box">'
        .'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>'
     );
-    $request->print(&gradeBox_start()); # <div class="LC_grade_assign_body">
+    $request->print(&gradeBox_start());
     foreach my $part_response_id (@part_response_id) {
     	my ($partid,$respid) = @{ $part_response_id };
 	my $part_resp = join('_',@{ $part_response_id });
@@ -2315,16 +2376,6 @@ KEYWORDS
     $request->print('</div>');
 
     $request->print('<div class="LC_grade_info_links">');
-    if ($perm{'vgr'}) {
-	$request->print(
-	    &Apache::loncommon::track_student_link(&mt('View recent activity'),
-						   $uname,$udom,'check'));
-    }
-    if ($perm{'opa'}) {
-	$request->print(
-	    &Apache::loncommon::pprmlink(&mt('Set/Change parameters'),
-					 $uname,$udom,$symb,'check'));
-    }
     $request->print('</div>');
 
     $result='<input type="hidden" name="partlist'.$counter.
@@ -2341,15 +2392,14 @@ KEYWORDS
 
 # Done with printing info for one student
 
-    $request->print('</div>');#LC_grade_show_user_body
     $request->print('</div>');#LC_grade_show_user
 
 
     # print end of form
     if ($counter == $total) {
-	my $endform='<table border="0"><tr><td>'."\n";
+        my $endform='<br /><hr /><table border="0"><tr><td>'."\n";
 	$endform.='<input type="button" value="'.&mt('Save &amp; Next').'" '.
-	    'onClick="javascript:checksubmit(this.form,\'Save & Next\','.
+	    'onclick="javascript:checksubmit(this.form,\'Save & Next\','.
 	    $total.','.scalar(@partlist).');" target="_self" /> &nbsp;'."\n";
 	my $ntstu ='<select name="NTSTU">'.
 	    '<option>1</option><option>2</option>'.
@@ -2359,10 +2409,12 @@ KEYWORDS
 	$ntstu =~ s/<option>$nsel</<option selected="selected">$nsel</;
         $endform.=&mt('[_1]student(s)',$ntstu);
 	$endform.='&nbsp;&nbsp;<input type="button" value="'.&mt('Previous').'" '.
-	    'onClick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> &nbsp;'."\n".
+	    'onclick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> &nbsp;'."\n".
 	    '<input type="button" value="'.&mt('Next').'" '.
-	    'onClick="javascript:checksubmit(this.form,\'Next\');" target="_self" /> &nbsp;';
-	$endform.=&mt('(Next and Previous (student) do not save the scores.)')."\n" ;
+	    'onclick="javascript:checksubmit(this.form,\'Next\');" target="_self" /> &nbsp;';
+        $endform.='<span class="LC_warning">'.
+                  &mt('(Next and Previous (student) do not save the scores.)').
+                  '</span>'."\n" ;
         $endform.="<input type='hidden' value='".&get_increment().
             "' name='increment' />";
 	$endform.='</td></tr></table></form>';
@@ -2431,7 +2483,7 @@ sub check_collaborators {
 #--- Retrieve the last submission for all the parts
 sub get_last_submission {
     my ($returnhash)=@_;
-    my (@string,$timestamp);
+    my (@string,$timestamp,%lasthidden);
     if ($$returnhash{'version'}) {
 	my %lasthash=();
 	my ($version);
@@ -2443,13 +2495,55 @@ sub get_last_submission {
 		    &Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'});
 	    }
 	}
+        my (%typeparts,%randombytry);
+        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')) {
+                    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};
+                        }
+                    }
+                    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';
+                        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> ' : '';
-	    push(@string, join(':', $key, $draft.$lasthash{$key}));
+	    push(@string, join(':', $key, $hide, $draft.$lasthash{$key}));
 	}
     }
     if (!@string) {
@@ -3350,11 +3444,11 @@ sub viewgrades {
 	}
 	$radio.='</tr></table>';
 	my $line = '<input type="text" name="TEXTVAL_'.
-	    $partid.'" size="4" '.'onChange="javascript:writePoint(\''.
+	    $partid.'" size="4" '.'onchange="javascript:writePoint(\''.
 		$partid.'\','.$weight{$partid}.',\'textval\')" /> /'.
 	    $weight{$partid}.' '.&mt('(problem weight)').'</td>'."\n";
 	$line.= '<td><b>'.&mt('Grade Status').':</b><select name="SELVAL_'.$partid.'"'.
-	    'onChange="javascript:writeRadText(\''.$partid.'\','.
+	    'onchange="javascript:writeRadText(\''.$partid.'\','.
 		$weight{$partid}.')"> '.
 	    '<option selected="selected"> </option>'.
 	    '<option value="excused">'.&mt('excused').'</option>'.
@@ -3375,7 +3469,7 @@ sub viewgrades {
     $result.=&Apache::loncommon::end_data_table()."\n".
 	'<input type="hidden" name="totalparts" value="'.$ctsparts.'" />';
     $result.='<input type="button" value="'.&mt('Revert to Default').'" '.
-	'onClick="javascript:resetEntry('.$ctsparts.');" />';
+	'onclick="javascript:resetEntry('.$ctsparts.');" />';
 
     #table listing all the students in a section/class
     #header of table
@@ -3439,7 +3533,7 @@ sub viewgrades {
     $result.=&Apache::loncommon::end_data_table();
     $result.='<input type="hidden" name="total" value="'.$ctr.'" />'."\n";
     $result.='<input type="button" value="'.&mt('Save').'" '.
-	'onClick="javascript:submit();" target="_self" /></form>'."\n";
+	'onclick="javascript:submit();" target="_self" /></form>'."\n";
     if (scalar(%$fullname) eq 0) {
 	my $colspan=3+scalar(@parts);
 	my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section'));
@@ -3491,7 +3585,7 @@ sub viewstudentgrade {
 		'GD_'.$student.'_'.$part.'_awarded_s" value="'.$pts.'" />'."\n";
 	    $result.='<input type="text" name="'.
 		'GD_'.$student.'_'.$part.'_awarded" '.
-		'onChange="javascript:changeSelect(\''.$part.'\',\''.$student.
+                'onchange="javascript:changeSelect(\''.$part.'\',\''.$student.
 		'\')" value="'.$pts.'" size="4" /></td>'."\n";
 	} elsif ($type eq 'solved') {
 	    my ($status,$foo)=split(/_/,$score,2);
@@ -3500,7 +3594,7 @@ sub viewstudentgrade {
 		$part.'_solved_s" value="'.$status.'" />'."\n";
 	    $result.='&nbsp;<select name="'.
 		'GD_'.$student.'_'.$part.'_solved" '.
-		'onChange="javascript:changeOneScore(\''.$part.'\',\''.$student.'\')" >'."\n";
+                'onchange="javascript:changeOneScore(\''.$part.'\',\''.$student.'\')" >'."\n";
 	    $result.= (($status eq 'excused') ? '<option> </option><option selected="selected" value="excused">'.&mt('excused').'</option>' 
 		: '<option selected="selected"> </option><option value="excused">'.&mt('excused').'</option>')."\n";
 	    $result.='<option value="reset status">'.&mt('reset status').'</option>';
@@ -3538,6 +3632,7 @@ sub editgrades {
 		    'incorrect'=>'incorrect_by_override',
 		    'excused'  =>'excused',
 		    'ungraded' =>'ungraded_attempted',
+                    'credited' =>'credit_attempted',
 		    'nothing'  => '',
 		    );
     my ($classlist,undef,$fullname) = &getclasslist($env{'form.section'},'0');
@@ -3860,7 +3955,7 @@ $result
 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);" />
+<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>
 <input type="hidden" name="associate"  value="" />
 <input type="hidden" name="phase"      value="three" />
@@ -3915,7 +4010,7 @@ sub csvuploadmap_footer {
 </table>
 <input type="hidden" name="nfields" value="$i" />
 <input type="hidden" name="keyfields" value="$keyfields" />
-<input type="button" onClick="javascript:verify(this.form)" value="Assign Grades" /><br />
+<input type="button" onclick="javascript:verify(this.form)" value="Assign Grades" /><br />
 </form>
 ENDPICK
 }
@@ -3960,7 +4055,7 @@ sub upcsvScores_form {
 <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" />
+<br /><input type="button" onclick="javascript:checkUpload(this.form);" value="$upload" />
 <label><input type="checkbox" name="noFirstLine" />$ignore</label>
 </form>
 ENDUPFORM
@@ -4283,7 +4378,7 @@ LISTJAVASCRIPT
     $result.='&nbsp;<b>'.&mt('Use CODE').': </b> <input type="text" name="CODE" value="" /> <br />'."\n";
 
     $result.='&nbsp;<input type="button" '.
-	'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' &rarr;" /><br />'."\n";
+             'onclick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' &rarr;" /><br />'."\n";
 
     $request->print($result);
 
@@ -4322,7 +4417,7 @@ LISTJAVASCRIPT
     }
     $studentTable.=&Apache::loncommon::end_data_table()."\n";
     $studentTable.='<input type="button" '.
-	'onClick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' &rarr;" /></form>'."\n";
+                   'onclick="javascript:checkPickOne(this.form);" value="'.&mt('Next').' &rarr;" /></form>'."\n";
 
     $studentTable.=&show_grading_menu_form($symb);
     $request->print($studentTable);
@@ -4429,7 +4524,9 @@ sub displayPage {
     my $checkIcon = '<img alt="'.&mt('Check Mark').
 	'" src="'.&Apache::loncommon::lonhttpdurl($request->dir_config('lonIconsURL').'/check.gif').'" height="16" border="0" />';
 
-    $studentTable.='&nbsp;'.&mt('<b>Note:</b> Problems graded correct by the computer are marked with a [_1] symbol.',$checkIcon)."\n".
+    $studentTable.='&nbsp;<span class="LC_info">'.
+        &mt('Problems graded correct by the computer are marked with a [_1] symbol.',$checkIcon).
+        '</span>'."\n".
 	&Apache::loncommon::start_data_table().
 	&Apache::loncommon::start_data_table_header_row().
 	'<th align="center">&nbsp;Prob.&nbsp;</th>'.
@@ -4452,8 +4549,8 @@ sub displayPage {
 		&Apache::loncommon::start_data_table_row().
 		'<td align="center" valign="top" >'.$prob.
 		(scalar(@{$parts}) == 1 ? '' 
-		                        : '<br />('.&mt('[_1]&nbsp;parts)',
-							scalar(@{$parts}))
+		                        : '<br />('.&mt('[_1]parts)',
+							scalar(@{$parts}).'&nbsp;')
 		 ).
 		 '</td>';
 	    $studentTable.='<td valign="top">';
@@ -4515,10 +4612,11 @@ sub displayPage {
         $curRes = $iterator->next();
     }
 
-    $studentTable.='</table>'."\n".
-	'<input type="button" value="'.&mt('Save').'" '.
-	'onClick="javascript:checkSubmitPage(this.form,'.$question.');" />'.
-	'</form>'."\n";
+    $studentTable.=
+        '</table>'."\n".
+        '<input type="button" value="'.&mt('Save').'" '.
+        'onclick="javascript:checkSubmitPage(this.form,'.$question.');" />'.
+        '</form>'."\n";
     $studentTable.=&show_grading_menu_form($symb);
     $request->print($studentTable);
 
@@ -4547,6 +4645,7 @@ 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'});
@@ -4564,16 +4663,20 @@ sub displaySubByDates {
 	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')) {
+                $hidden = 1;
+            }
 	    my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)
 			            : sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys));
 	    
-
 #	    next if ($$record{"$version:resource.$partid.solved"} eq '');
 	    my $display_part=&get_display_part($partid,$symb);
 	    foreach my $matchKey (@matchKey) {
 		if (exists($$record{$version.':'.$matchKey}) &&
 		    $$record{$version.':'.$matchKey} ne '') {
-
+                    
 		    my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/)
 				               : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/));
                     $displaySub[0].='<span class="LC_nobreak"';
@@ -4582,23 +4685,37 @@ sub displaySubByDates {
                                    .'('.&mt('Part ID: [_1]',$responseId).')'
                                    .'</span>'
                                    .' <b>';
-		    if ($$record{"$where.$partid.tries"} eq '') {
-			$displaySub[0].=&mt('Trial not counted');
-		    } else {
-			$displaySub[0].=&mt('Trial: [_1]',
+                    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"});
-		    }
-		    my $responseType=($isTask ? 'Task'
+                            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})) {
-			$orders{$partid}->{$responseId}=
-			    &get_order($partid,$responseId,$symb,$uname,$udom,
-                                       $no_increment);
-		    }
-		    $displaySub[0].='</b></span>'; # /nobreak
-		    $displaySub[0].='&nbsp; '.
-			&cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />';
+		        if (!exists($orders{$partid})) { $orders{$partid}={}; }
+		        if ((!exists($orders{$partid}->{$responseId})) || ($trial)) {
+			    $orders{$partid}->{$responseId}=
+			        &get_order($partid,$responseId,$symb,$uname,$udom,
+                                           $no_increment,$type,$trial,$rndseed);
+		        }
+		        $displaySub[0].='</b>'.$newvariation.'</span>'; # /nobreak
+		        $displaySub[0].='&nbsp; '.
+			    &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).'<br />';
+                    }
 		}
 	    }
 	    if (exists($$record{"$where.$partid.checkedin"})) {
@@ -4699,7 +4816,7 @@ sub updateGradeByPage {
 		&Apache::loncommon::start_data_table_row().
 		'<td align="center" valign="top" >'.$prob.
 		(scalar(@{$parts}) == 1 ? '' 
-                                        : '<br />('.&mt('[quant,_1,&nbsp;part]',scalar(@{$parts}))
+                                        : '<br />('.&mt('[quant,_1,part]',scalar(@{$parts}))
 		.')').'</td>';
 	    $studentTable.='<td valign="top">&nbsp;<b>'.$title.'</b>&nbsp;</td>';
 
@@ -5264,7 +5381,7 @@ sub scantron_selectphase {
                 <input name="command" value="scantronupload_save" type="hidden" />
                 '.&mt('File to upload: [_1]','<input type="file" name="upfile" size="50" />').'
                 <br />
-                <input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" />
+                <input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" />
               </form>
 ');
 
@@ -7451,6 +7568,7 @@ sub scantron_get_maxbubble {
         if (ref($nav_error)) {
             $$nav_error = 1;
         }
+        return;
     }
     my $map=$navmap->getResourceByUrl($sequence);
     my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
@@ -7956,7 +8074,7 @@ sub scantron_upload_scantron_data {
   &Apache::lonhtmlcommon::end_pick_box().'<br />
 
 <input name="command" value="scantronupload_save" type="hidden" />
-<input type="button" onClick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" />
+<input type="button" onclick="javascript:checkUpload(this.form);" value="'.&mt('Upload Bubblesheet Data').'" />
 </form>
 ');
     return '';
@@ -8542,10 +8660,10 @@ sub grading_menu {
     $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\')" '.
+        ' 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="text" name="receipt" size="4" onchange="javascript:checkReceiptNo(this.form,\'OK\')" />';
 
     $Str .="</form>\n";
     my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box.");
@@ -8728,7 +8846,7 @@ GRADINGMENUJS
               </label>
             </div>
             <div>
-	      <input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
+	      <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
             </div>
           </div>
 
@@ -8745,7 +8863,7 @@ GRADINGMENUJS
               </label>
             </div>
             <div>
-	      <input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
+	      <input type="button" onclick="javascript:checkChoice(this.form,\'2\');" value="'.&mt('Next').' &rarr;" />
             </div>
         </div>
   </form>';
@@ -8875,8 +8993,8 @@ 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'));
+                                                   {'iclicker' => 'i>clicker',
+                                                    'interwrite' => 'interwrite PRS'});
     $symb = &Apache::lonenc::check_encrypt($symb);
     $result.=<<ENDUPFORM;
 <script type="text/javascript">
@@ -8925,17 +9043,17 @@ function sanitycheck() {
 <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>
-<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>
+<br /><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" />
-<br /><label><input type="radio" name="gradingmechanism" value="given"$checked{'given'} onClick="sanitycheck()" />$given </label>
+<br /><label><input type="radio" name="gradingmechanism" value="given"$checked{'given'} onclick="sanitycheck()" />$given </label>
 <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>
-<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" />
+<br /><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".
@@ -9295,7 +9413,7 @@ ENDHEADER
 sub navmap_errormsg {
     return '<div class="LC_error">'.
            &mt('An error occurred retrieving information about resources in the course.').'<br />'.
-           &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this grading page..','<a href="/adm/roles?selectrole=1&newrole='.$env{'request.role'}.'">','</a>').
+           &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this grading page.','<a href="/adm/roles?selectrole=1&newrole='.$env{'request.role'}.'">','</a>').
            '</div>';
 }