--- loncom/homework/bridgetask.pm	2006/11/07 20:07:10	1.195
+++ loncom/homework/bridgetask.pm	2006/11/09 20:42:43	1.199
@@ -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.199 2006/11/09 20:42:43 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1009,7 +1009,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">
@@ -1051,32 +1056,13 @@ DONEBUTTON
 			}
 		    }
 		    $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";
-
+		    my %counts = &get_counts($dim,undef,$parstack,
+					     $safeeval);
+		    $status.="\n<div class='LC_$bt_status LC_criteria LC_task_overall_status'><p>".
+			&question_status_message(\%counts,-1).
+			"</p></div>\n";
+		    
 
 		    foreach my $id (@{$dimension{$dim}{'criterias'}}) {
 			my $type = $dimension{$dim}{'criteria.'.$id.'.type'};
@@ -2097,8 +2083,11 @@ 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);
@@ -2227,38 +2216,21 @@ sub end_Dimension {
 		    $mandatory='Optional';
 		}
 		my $dim_info="<div class='LC_$dim_status LC_question_grade'>\n";
+		my $question = ('sub' x $dimension{$dim}{'depth'}).'question';
+		$question =~ s/^(.)/uc($1)/e;
 		if ($dim_status eq 'pass') {
-		    $dim_info.='<h3>Question : you passed this '.$mandatory.' question</h3>';
+		    $dim_info.='<h3>'.$question.' : you passed this '.$mandatory.' question</h3>';
 		}
 		if ($dim_status eq 'fail') {
-		    $dim_info.='<h3>Question : you did not pass this '.$mandatory.' question</h3>';
+		    $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.="\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<p>"
+		    .&question_status_message(\%counts,
+					      $dimension{$dim}{'depth'})
+		    ."</p>\n</div>";
 		
 		foreach my $id (@{$dimension{$dim}{$instance.'.criterias'}},
 				@{$dimension{$dim}{'criterias'}}) {
@@ -2382,6 +2354,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 '.
+		     $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();