--- loncom/homework/bridgetask.pm	2006/11/07 20:07:10	1.195
+++ loncom/homework/bridgetask.pm	2006/12/07 20:44:55	1.214
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.195 2006/11/07 20:07:10 albertel Exp $
+# $Id: bridgetask.pm,v 1.214 2006/12/07 20:44:55 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -234,36 +234,43 @@ sub add_grading_button {
     if (scalar(keys(%sections)) < 3) {
 	$size=scalar(keys(%sections))+2;
     }
-    my $sec_select = '<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";
-    $sec_select .= "<option value='all' selected='selected'>all</option>\n";
+    my $sec_select = "\n".'<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";
+    $sec_select .= "\t<option value='all' selected='selected'>all</option>\n";
     foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
-	$sec_select .= "<option value=\"$sec\">$sec</option>\n";
+	$sec_select .= "\t<option value=\"$sec\">$sec</option>\n";
     }
-    $sec_select .= "<option value='none'>none</option></select>\n";
+    $sec_select .= "\t<option value='none'>none</option>\n</select>\n";
     
-    my $result=' <input type="submit" name="gradeasubmission" value="'.
+    my $result="\n\t".'<input type="submit" name="gradeasubmission" value="'.
 	&mt("Get a submission to grade").'" />';
-    $result.='<input type="hidden" name="grade_target" value="webgrade" />';
+    $result.="\n\t".'<input type="hidden" name="grade_target" value="webgrade" />';
     if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
 	my ($entries,$ready,$locks)=&get_queue_counts('gradingqueue');
-	$result.='<table><tr>';
-	$result.='<td rowspan="4">Specify a section: </td><td rowspan="4">'.$sec_select.'</td>';
-	$result.='<td>'.' <input type="submit" name="reviewagrading" value="'.
+	$result.="\n\t".'<table>'."\n\t\t".'<tr>';
+	$result.="\n\t\t\t".'<td rowspan="4">Specify a section: </td>'.
+	    "\n\t\t\t".'<td rowspan="4">'.$sec_select."\n\t\t\t".'</td>';
+	$result.="\n\t\t\t".'<td>'.'<input type="submit" name="reviewagrading" value="'.
 	    &mt("Select an entry from the grading queue:").'" /> ';
 
-	$result.= &mt("[_1] entries, [_2] ready, [_3] being graded",$entries,$ready,$locks).' </td></tr>'."\n";
+	$result.= "\n\t\t\t\t".&mt("[_1] entries, [_2] ready, [_3] being graded",$entries,$ready,$locks).'</td>'."\n\t\t".'</tr>'."\n";
 
 	($entries,$ready,$locks)=&get_queue_counts('reviewqueue');
-	$result.='<tr><td>'.
-	    ' <input type="submit" name="reviewasubmission" value="'.
+	$result.="\n\t\t".'<tr>'.
+	    "\n\t\t\t".'<td>'.
+	    "\n\t\t\t\t".'<input type="submit" name="reviewasubmission" value="'.
 	    &mt("Select an entry from the review queue:").'" /> ';
 	$result.=&mt("[_1] entries, [_2] ready, [_3] being graded",
-		     $entries,$ready,$locks).'</td></tr>'."\n";
-	$result.='<tr><td> <input type="submit" name="regradeasubmission" value="'.
-	    &mt("List of user's grade status").'" /> </td></tr></table>'."\n";
-	$result.='<p> <input type="submit" name="regradeaspecificsubmission" value="'.
-	    &mt("Regrade specific user:").'" />'."\n";
-	$result.='<input type="text" size="12" name="gradinguser" />';
+		     $entries,$ready,$locks).'</td>'."\n\t\t".'</tr>'."\n";
+	$result.="\n\t\t".'<tr>'.
+	    "\n\t\t\t".'<td>'.
+	    "\n\t\t\t\t".'<input type="submit" name="regradeasubmission" value="'.
+	    &mt("List of user's grade status").'" /> </td>'
+	    ."\n\t\t".'</tr>'
+	    ."\n\t".'</table>'."\n";
+	$result.="\n\t".'<p>'.
+	    "\n\t\t".'<input type="submit" name="regradeaspecificsubmission" value="'.
+	    &mt("Regrade specific user:").'" />';
+	$result.= "\n\t\t".'<input type="text" size="12" name="gradinguser" />';
 	$result.=&Apache::loncommon::select_dom_form($env{'user.domain'},
 						     'gradingdomain');
 	$result.=' '.
@@ -271,7 +278,7 @@ sub add_grading_button {
 						   'gradinguser',
 						   'gradingdomain');
 	$result.=&Apache::loncommon::studentbrowser_javascript();
-	$result.= '</p>';
+	$result.= '</p>'."\n";
     }
     return $result;
 }
@@ -295,18 +302,19 @@ sub add_request_another_attempt_button {
 	my $description=&Apache::slotrequest::get_description($slot_name,
 							      $slot);
 	$result.=(<<STUFF);
-<p> Will be next available: $description </p>
+    <p> Will be next available: $description </p>
 STUFF
     }
     
     if ($env{'request.enc'}) { $symb=&Apache::lonenc::encrypted($symb); }
     $symb=&escape($symb);
-    $result.='<form method="post" action="/adm/slotrequest">'.
-	'<input type="hidden" name="symb" value="'.$symb.'" />'.
-	'<input type="hidden" name="command" value="'.$action.'" />'.
+    $result.=
+        "\n\t".'<form method="post" action="/adm/slotrequest">'."\n\t\t".
+	'<input type="hidden" name="symb" value="'.$symb.'" />'."\n\t\t".
+	'<input type="hidden" name="command" value="'.$action.'" />'."\n\t\t".
 	'<input type="submit" name="requestattempt" value="'.
-	&mt($text).'" />'.
-	'</form>';
+	&mt($text).'" />'."\n\t".
+	'</form>'."\n";
     return $result;
 }
 
@@ -372,6 +380,13 @@ sub nest {
     }
 }
 
+sub start_delay {
+    push(@delay,1);
+}
+sub end_delay {
+    pop(@delay);
+}
+
 sub nested_parse {
     my ($str,$env,$args) = @_;
     my @old_env = @Apache::scripttag::parser_env;
@@ -584,7 +599,7 @@ sub start_Task {
 	    $result.='<form name="gradesubmission" method="post" action="';
 	    my $uri=$env{'request.uri'};
 	    if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
-	    $result.=$uri.'">'.&add_grading_button()."</form>";
+	    $result.=$uri.'">'.&add_grading_button()."</form>\n";
 	    my $symb=&Apache::lonnet::symbread();
 	    if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})) {
 		$result.='<form method="post" name="slotrequest" action="/adm/slotrequest">'.
@@ -683,7 +698,7 @@ sub start_Task {
 
 	    $result.=&preserve_grade_info();
 	    $result.=&internal_location(); 
-	    $result.=$form_tag_start.
+	    $result.=$form_tag_start."\t".
 		'<input type="hidden" name="submitted" value="yes" />';
 	    &Apache::lonxml::startredirection();
 	}
@@ -783,6 +798,9 @@ sub start_Task {
 	if ($target eq 'webgrade') {
 	    $result.="\n".'<div id="LC_GRADING_criterialist">';
 	    &Apache::lonxml::startredirection();
+	    &start_delay();
+	    $dimension{$top}{'result'}=$result;
+	    undef($result);
 	}
     } elsif ($target eq 'edit') {
 	$result.=$form_tag_start.
@@ -1009,7 +1027,12 @@ sub end_Task {
 		if (!$previous && $status ne 'SHOW_ANSWER' &&
 		    &show_task($status,$previous)) {
 		    $result.=&Apache::inputtags::gradestatus('0');
-		    $result.='</form>';
+		}
+		
+		$result.='</form>';
+
+		if (!$previous && $status ne 'SHOW_ANSWER' &&
+		    &show_task($status,$previous)) {
 		    my $action = &Apache::lonenc::check_encrypt($env{'request.uri'});
 		    $result.=<<DONEBUTTON;
 <form name="done" method="post" action="$action">
@@ -1037,46 +1060,31 @@ DONEBUTTON
 		    }
 		    $start_time=&Apache::lonlocal::locallocaltime($start_time);
 
-		    my $status = "\n<div class='LC_$bt_status LC_criteria'>\n";
+		    my $status = 
+			"\n<div class='LC_$bt_status LC_criteria LC_task_overall_status'>\n\t";
 		    
+		    my $dim = $top;
+		    my %counts = &get_counts($dim,undef,$parstack,
+					     $safeeval);
+		    my $question_status ="\n\t<p>".
+			&question_status_message(\%counts,-1).
+			"</p>\n";
+
 		    if ($bt_status eq 'pass')  {
 			$status.='<h2>You passed the '.$title.' given on '.
 			    $start_time.'</h2>';
+			$status.=$question_status;
 		    }
 		    if ($bt_status eq 'fail')  {
 			$status.='<h2>You did not pass the '.$title.' given on '.
 			    $start_time.'</h2>';
+			$status.=$question_status;
 			if (!$previous) {
 			    $status.=&add_request_another_attempt_button();
 			}
 		    }
-		    $status.='</div>';
-		    my $man_count=0;
-		    my $man_passed=0;
-		    my $opt_count=0;
-		    my $opt_passed=0;
-		    my $dim = $top;
-		    foreach my $id (@{$dimension{$dim}{'criterias'}}) {
-			my $status = &get_criteria('status',$version,$dim,$id);
-			if ($dimension{$dim}{'criteria.'.$id.'.mandatory'}
-			    eq 'N') {
-			    $opt_count++;
-			    if ($status eq 'pass') {
-				$opt_passed++;
-			    }
-			} else {
-			    $man_count++;
-			    if ($status eq 'pass') { $man_passed++; }
-			}
-		    }
-		    if ($man_passed eq $man_count) { $man_passed='all'; }
-
-		    my $opt_req=&Apache::lonxml::get_param('OptionalRequired',
-							   $parstack,$safeeval);
-		    if ($opt_req !~ /\S/) { $opt_req='0'; }
-
-		    $status.="\n<div class='LC_$bt_status LC_criteria LC_task_overall_status'>".&mt('You needed to pass all of the [_1] mandatory components and [_2] of the [_3] optional components, of which you passed [_4].',$man_count,$opt_req,$opt_count,$opt_passed)."</p></div>\n";
-
+		    
+		    $status.="\n".'</div>'."\n";
 
 		    foreach my $id (@{$dimension{$dim}{'criterias'}}) {
 			my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
@@ -1262,7 +1270,13 @@ DONEBUTTON
 	    &Apache::structuretags::finalize_storage();
 	}
     } elsif ($target eq 'webgrade') {
-	$result.=&Apache::lonxml::endredirection();
+	if (&nest()) {
+	    &Apache::lonxml::endredirection();
+	    &end_delay();
+	    $result.=$dimension{$top}{'result'};
+	} else {
+	    $result.=&Apache::lonxml::endredirection();
+	}
 	my $dim = $top;
 	foreach my $id (@{$dimension{$dim}{'criterias'}} ) {
 	    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
@@ -1274,7 +1288,12 @@ DONEBUTTON
 					     [@_]);
 		$criteria = &layout_webgrade_Criteria($dim,$id,$criteria);
 		my $internal_location=&internal_location($id);
-		$result=~s/\Q$internal_location\E/$criteria/;
+		if ($result =~ m/\Q$internal_location\E/) {
+		    $result=~s/\Q$internal_location\E/$criteria/;
+		} else {
+		    $result.=$criteria;
+		}
+
 	    }
 	}
         $result.="</div>";
@@ -1558,8 +1577,16 @@ sub show_queue {
 		my $ekey=&escape($key);
 		my ($action,$description,$status)=('select',&mt('Select'));
 		if (exists($queue{"$key\0locked"})) {
+		    my $locker = $queue{"$key\0locked"};
+		    my $time;
+		    if (ref($queue{"$key\0locked"}) eq 'ARRAY') {
+			($locker, $time) = @{$queue{"$key\0locked"}};
+			$time = 
+			    &Apache::lonnavmaps::timeToHumanString($time,
+								   'start');
+		    }
 		    my $me=$env{'user.name'}.':'.$env{'user.domain'};
-		    $status=&mt('Locked by <tt>[_1]</tt>',$queue{"$key\0locked"});
+		    $status=&mt('Locked by <tt>[_1]</tt> [_2]',$locker,$time);
 		    if ($me eq $queue{"$key\0locked"}) {
 			($action,$description)=('resume',&mt('Resume'));
 		    } else {
@@ -1778,7 +1805,7 @@ sub lock_key {
     my (undef,$cid)=&Apache::lonnet::whichuser();
     my $cnum=$env{'course.'.$cid.'.num'};
     my $cdom=$env{'course.'.$cid.'.domain'};
-    my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> $me},
+    my $success=&Apache::lonnet::newput($queue,{"$todo\0locked"=> [$me,time]},
 					$cdom,$cnum);
     &Apache::lonxml::debug("success $success $todo");
     if ($success eq 'ok') {
@@ -2054,7 +2081,7 @@ sub start_Setup {
     my $dim = &get_id($parstack,$safeeval);
     push(@Apache::bridgetask::dimension,$dim);
     &Apache::lonxml::startredirection();
-    return &internal_location($dim);
+    return;# &internal_location($dim);
 }
 
 {
@@ -2097,17 +2124,23 @@ sub start_Dimension {
 	    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
 	push(@{$dimension{$previous_dim}{'criterias'}},$dim);
 	$dimension{$dim}{'nested'}=$previous_dim;
+	$dimension{$dim}{'depth'} = 1 + $dimension{$previous_dim}{'depth'};
+
 	&Apache::lonxml::debug("adding $dim as criteria to $previous_dim");
     } else {
+	$dimension{$top}{'depth'}=0;
 	$dimension{$top}{'criteria.'.$dim.'.type'}='dimension';
 	$dimension{$top}{'criteria.'.$dim.'.mandatory'}=
 	    &Apache::lonxml::get_param('Mandatory',$parstack,$safeeval);
 	push(@{$dimension{$top}{'criterias'}},$dim);
+	$dimension{$dim}{'nested'}=$top;
     }
     push(@Apache::bridgetask::dimension,$dim);
     &Apache::lonxml::startredirection();
-    &enable_dimension_parsing($dim);
-    return &internal_location($dim);
+    if (!&skip_dimension_parsing($dim)) {
+	&enable_dimension_parsing($dim);
+    }
+    return;# &internal_location($dim);
 }
 
 sub start_QuestionText {
@@ -2226,56 +2259,68 @@ sub end_Dimension {
 		if (&Apache::lonxml::get_param('Mandatory',$parstack,$safeeval) eq 'N') {
 		    $mandatory='Optional';
 		}
-		my $dim_info="<div class='LC_$dim_status LC_question_grade'>\n";
+		my $dim_info=
+		    "\n<div class='LC_$dim_status LC_question_grade'>\n\t";
+		my $ucquestion = 
+		    my $question = 
+		    ('sub' x $dimension{$dim}{'depth'}).'question';
+		$ucquestion =~ s/^(.)/uc($1)/e;
 		if ($dim_status eq 'pass') {
-		    $dim_info.='<h3>Question : you passed this '.$mandatory.' question</h3>';
+		    $dim_info.='<h3>'.$ucquestion.' : you passed the above '.$mandatory.' '.$question.'</h3>';
 		}
 		if ($dim_status eq 'fail') {
-		    $dim_info.='<h3>Question : you did not pass this '.$mandatory.' question</h3>';
-		}
-		my $man_count=0;
-		my $man_passed=0;
-		my $opt_count=0;
-		my $opt_passed=0;
-		foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}},
-				 @{$dimension{$dim}{'criterias'}} ) {
-		    my $status = &get_criteria('status',$version,$dim,$id);
-		    if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} 
-			eq 'N') {
-			$opt_count++;
-			if ($status eq 'pass') { $opt_passed++; }
-		    } else {
-			$man_count++;
-			if ($status eq 'pass') { $man_passed++; }
-		    }
-		}
-		if ($man_passed eq $man_count) { $man_passed='all'; }
-		
-		my $opt_req=$dimension{$dim}{$instance.'.optionalrequired'};
-		if ($opt_req !~ /\S/) {
-		    $opt_req=
-			&Apache::lonxml::get_param('OptionalRequired',
-						   $parstack,$safeeval);
-		    if ($opt_req !~ /\S/) { $opt_req = 0; }
+		    $dim_info.='<h3>'.$ucquestion.' : you did not pass the above '.$mandatory.' '.$question.'</h3>';
 		}
-		$dim_info.="\n<p>".&mt('You passed [_1] of the [_2] mandatory components and [_3] of the [_4] optional components, of which you were required to pass [_5].',$man_passed,$man_count,$opt_passed,$opt_count,$opt_req)."</p>\n</div>";
+		my %counts = &get_counts($dim,$instance,$parstack,
+					 $safeeval);
+
+		$dim_info.="\n\t<p>"
+		    .&question_status_message(\%counts,
+					      $dimension{$dim}{'depth'})
+		    ."</p>\n</div>\n";
 		
 		foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
 				@{$dimension{$dim}{'criterias'}}) {
 		    my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
 		    if ($type eq 'dimension') {
-			$result.=$dimension{$id}{'result'};
-			next;
+			if (defined($dimension{$id}{'result'})) {
+			    $result.=$dimension{$id}{'result'};
+			    next;
+			} else {
+			    $dim_info .=
+				&nested_parse(\$dimension{$dim}{'criteria.'.$id},
+					      [@_],{'set_dim_id' => $id});
+			}
+		    } else {
+			my $criteria =
+			    &nested_parse(\$dimension{$dim}{'criteria.'.$id},
+					  [@_]);
+			$dim_info .= &layout_web_Criteria($dim,$id,$criteria);
 		    }
-		    my $criteria = 
-			&nested_parse(\$dimension{$dim}{'criteria.'.$id},
-				      [@_]);
-		    $dim_info .= &layout_web_Criteria($dim,$id,$criteria);
 		}
+		# puts the results at the end of the dimension
+		$result .= $dim_info;
 
-		my $internal_location=&internal_location($dim);
-		$result=~s/\Q$internal_location\E/$dim_info/;
+		# puts the results at the beginning of the dimension
+		# my $internal_location=&internal_location($dim);
+		# $result=~s/\Q$internal_location\E/$dim_info/;
+	    }
+	}
+	if ($result !~ /^\s*$/s) {
+	    # FIXME? this maybe unneccssary in the future, (CSE101 BT
+	    # from Fall 2006 geenrate a div that attempts to hide some
+	    # of the output in an odd way, this is a workaround so
+	    # those old ones will continue to work.  # It puts the
+	    # LC_question div to come after any starting closie div
+	    # that the dimension produces
+	    if ($result =~ m{^\s*</div>}) {
+		$result =~ s{^(\s*</div>)}
+		            {$1\n<div id="$dim" class="LC_question">};
+	    } else {
+		$result = "\n".'<div id="'.$dim.'" class="LC_question">'.
+		    "\n".$result;
 	    }
+	    $result .= "\n</div>\n";
 	}
     } elsif ($target eq 'webgrade') {
 	# in case of any side effects that we need
@@ -2299,7 +2344,11 @@ sub end_Dimension {
 					     [@_]);
 		$criteria = &layout_webgrade_Criteria($dim,$id,$criteria);
 		my $internal_location=&internal_location($id);
-		$result=~s/\Q$internal_location\E/$criteria/;
+		if ($result =~ m/\Q$internal_location\E/) {
+		    $result =~ s/\Q$internal_location\E/$criteria/;
+		} else {
+		    $result.=$criteria ;
+		}
 	    }
 	}
 	if (&nest()) {
@@ -2382,6 +2431,95 @@ sub end_Dimension {
     return $result;
 }
 
+sub question_status_message {
+    my ($counts,$depth) = @_;
+    my %req  = ('man' => 'mandatory',
+		'opt' => 'optional',);
+    my %type = ('cri' => 'criteria',
+		'dim' => ('sub'x($depth+1)).'questions',);
+    my @sections;
+    foreach my $req ('man','opt') {
+	foreach my $type ('cri','dim') {
+	    if ($counts->{$req.'_'.$type}) {
+		push(@sections,
+		     $counts->{$req.'_'.$type.'_passed'}.' of the '.
+		     $counts->{$req.'_'.$type}.' '.
+		     $req{$req}.' '.$type{$type});
+	    }
+	}
+    }
+
+    my $status = 'You passed ';
+    if (@sections == -1) {
+    } elsif (@sections == 1) {
+	$status .= $sections[0];
+    } elsif (@sections == 2) {
+	$status .= $sections[0].' and '.$sections[1];
+    } else {
+	my $last = pop(@sections);
+	$status .= join(', ',@sections).', and '.$last;
+    }
+    $status .= '.';
+    if ($counts->{'opt'}) {
+	$status .= ' You were required to pass '.$counts->{'opt_req'}.
+	    ' optional component'.($counts->{'opt_req'} == 1?'':'s');
+    }
+    return $status;
+}
+
+sub get_counts {
+    my ($dim,$instance,$parstack,$safeeval) = @_;
+    my %counts;
+    my @possible = ('man_cri','man_dim',
+		    'opt_cri','opt_dim',
+		    'man_cri_passed', 'man_dim_passed',
+		    'opt_cri_passed', 'opt_dim_passed',
+		    'man_passed',
+		    'opt_passed',
+		    'opt_req');
+    foreach my $which (@possible) { $counts{$which} = 0; }
+
+    my $version = &get_version();
+
+    foreach my $id ( @{$dimension{$dim}{$instance.'.criterias'}},
+		     @{$dimension{$dim}{'criterias'}} ) {
+	my $status = &get_criteria('status',$version,$dim,$id);
+	my $which;
+	if ($dimension{$dim}{'criteria.'.$id.'.mandatory'} 
+	    eq 'N') {
+	    $which = 'opt';
+	} else {
+	    $which = 'man';
+	}
+	$counts{$which}++;
+	if ($status eq 'pass') { $counts{$which.'_passed'}++; }
+	if ($dimension{$dim}{'criteria.'.$id.'.type'}
+	    eq 'dimension') {
+	    $which .= '_dim';
+	} else {
+	    $which .= '_cri';
+	}
+	$counts{$which}++;
+	if ($status eq 'pass') { $counts{$which.'_passed'}++; }
+
+
+    }
+    if ($counts{'man_dim_passed'} eq $counts{'man_dim'}) {
+	$counts{'man_dim_passed'}='all';
+    }
+    if ($counts{'man_cri_passed'} eq $counts{'man_cri'}) {
+	$counts{'man_cri_passed'}='all';
+    }
+    
+    $counts{'opt_req'}=$dimension{$dim}{$instance.'.optionalrequired'};
+    if ($counts{'opt_req'} !~ /\S/) {
+	$counts{'opt_req'}= &Apache::lonxml::get_param('OptionalRequired',
+						       $parstack,$safeeval);
+	if ($counts{'opt_req'} !~ /\S/) { $counts{'opt_req'} = 0; }
+    }
+    return %counts;
+}
+
 sub end_Setup {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $result=&Apache::lonxml::endredirection();
@@ -2443,11 +2581,12 @@ sub grading_history {
 	    $entry.=' comment: "'.$Apache::lonhomework::history{"$t:$scope.comment"}.'"';
 	}
 	if ($entry) {
-	    $result.= "<li>$grader : $entry </li>";
+	    $result.= "\n\t\t<li>\n\t\t\t$grader :\n\t\t\t $entry \n\t\t</li>";
 	}
     }
     if ($result) {
-	return '<ul class="LC_GRADING_pastgrading">'.$result.'</ul>';
+	return "\n\t".'<ul class="LC_GRADING_pastgrading">'.$result.
+	    "\n\t".'</ul>'."\n";
     }
     return '';
 }
@@ -2518,12 +2657,12 @@ sub start_Criteria {
 	my $dim = &get_dim_id();
 	my $id=&get_id($parstack,$safeeval);
 	if ($target eq 'web' || $target eq 'webgrade') {
-	    if ($target eq 'webgrade' && $dim ne 'top') {
+	    if ($target eq 'webgrade') {
 		&Apache::lonxml::debug(" for $dim $id stashing results into $dim ");
 		$dimension{$dim}{'result'} .= &internal_location($id);
 	    } else {
 		&Apache::lonxml::debug(" not stashing $dim $id");
-		$result .= &internal_location($id);
+		#$result .= &internal_location($id);
 	    }
 	}
 	&Apache::lonxml::debug("Criteria $id with $dim");
@@ -2560,15 +2699,21 @@ sub layout_web_Criteria {
     my $status_display=$status;
     $status_display=~s/^([a-z])/uc($1)/e;
     my $criteria_info.=
-	'<div class="LC_'.$status.' LC_criteria"><h4>'
-	.$mandatory.' Criteria</h4><p>';
+	'<div class="LC_'.$status.' LC_criteria">'."\n\t".'<h4>'
+	.$mandatory.' Criteria</h4>'."\n\t".'<p class="LC_criteria_text">'
+	."\n";
+    $criteria =~ s/^\s*//s;
+    $criteria =~ s/\s*$//s;
     $criteria_info.= $criteria;
-    $criteria_info.='</p><p class="LC_grade">'.$status_display.'</p>';
+    $criteria_info.="\n\t".'</p>'.
+	"\n\t".'<p class="LC_grade">'.$status_display.'</p>';
     if ($comment =~ /\w/) {
-	$criteria_info.='<p class="LC_comment">'.
-	    &mt('Comment: [_1]',$comment).'</p>';
+	$criteria_info.=
+	    "\n\t".
+	    '<p class="LC_comment">'.&mt('Comment: [_1]',$comment).'</p>';
     }
-    $criteria_info.='</div>';
+    $criteria_info.="\n".'</div>'."\n";
+    
     return $criteria_info;
 }
 
@@ -2577,34 +2722,46 @@ sub layout_webgrade_Criteria {
     my $link=&link($id);
     my $version = &get_version();
     my $status  = &get_criteria('status',$version,$dim,$id);
-    my $result = 
-	'<div class="LC_GRADING_criteria">'."\n".
-	'<div class="LC_GRADING_criteriatext">'."\n".
-	$criteria.
-	'</div>'."\n".
-	'<div class="LC_GRADING_grade">'."\n".
-	'<label class="LC_GRADING_ungraded">
-            <input type="radio" name="HWVAL_'.$link.'" value="ungraded" '.($status eq 'ungraded' || !$status ? 'checked="checked"':'').' />'.
-	    &mt('Ungraded').
-	'</label>'."\n".
-	'<label class="LC_GRADING_fail">
-            <input type="radio" name="HWVAL_'.$link.'" value="fail" '.($status eq 'fail' ? 'checked="checked"':'').' />'.
-	    &mt('Fail').
-	 '</label>'."\n".
-	 '<label class="LC_GRADING_pass">
-             <input type="radio" name="HWVAL_'.$link.'" value="pass" '.($status eq 'pass' ? 'checked="checked"':'').' />'.
-	     &mt('Pass').
-	  '</label>'."\n".
-	  '<label class="LC_GRADING_review">
-             <input type="radio" name="HWVAL_'.$link.'" value="review" '.($status eq 'review' ? 'checked="checked"':'').' />'.
-	     &mt('Review').
-	  '</label>'."\n".
-	  '</div>'."\n".
-	  '<label class="LC_GRADING_comment">'.&mt('Additional Comment for Student')."\n".
-	  '<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_'.$link.'">'.&HTML::Entities::encode(&get_criteria('comment',$version,$dim,$id),'<>"&').'</textarea>'."\n".
-	  '</label>'."\n".
-	  '</div>'."\n".
-	  &grading_history($version,$dim,$id);
+    my %lt = ( 'ungraded' => 'Ungraded',
+	       'fail'     => 'Fail',
+	       'pass'     => 'Pass',
+	       'review'   => 'Review',
+	       'comment'  => 'Additional Comment for Student',
+	       );
+    %lt = &Apache::lonlocal::texthash(%lt);
+    my $comment = &get_criteria('comment',$version,$dim,$id);
+    $comment = &HTML::Entities::encode($comment,'<>"&');
+    my %checked;
+    foreach my $which ('ungraded','fail','pass','review') {
+	if ($status eq $which) { $checked{$which} = 'checked="checked"'; }
+    }
+    if (!%checked) { $checked{'ungraded'} = 'checked="checked"'; }
+    my $buttons;
+    foreach my $which  ('ungraded','fail','pass','review') {
+	$buttons .= <<END_BUTTON;
+		<label class="LC_GRADING_$which">
+			<input type="radio" name="HWVAL_$link" value="$which" $checked{$which} />
+			$lt{$which}
+		</label>
+END_BUTTON
+    }
+    $criteria =~ s/^\s*//s;
+    $criteria =~ s/\s*$//s;
+    my $result = <<END_CRITERIA;
+<div class="LC_GRADING_criteria">
+	<div class="LC_GRADING_criteriatext">
+		$criteria
+	</div>
+	<div class="LC_GRADING_grade">
+$buttons
+	</div>
+	<label class="LC_GRADING_comment">
+		$lt{'comment'}
+		<textarea class="LC_GRADING_comment_area" name="HWVAL_comment_$link">$comment</textarea>
+	</label>
+</div>
+END_CRITERIA
+    $result .= &grading_history($version,$dim,$id);
     return $result;
 }