--- loncom/homework/bridgetask.pm	2005/11/21 23:00:19	1.84
+++ loncom/homework/bridgetask.pm	2005/12/06 10:13:15	1.88
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: bridgetask.pm,v 1.84 2005/11/21 23:00:19 albertel Exp $
+# $Id: bridgetask.pm,v 1.88 2005/12/06 10:13:15 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -381,7 +381,7 @@ INFO
 }
 
 sub start_Task {
-    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
 
     my ($status,$accessmsg,$slot);
     if ($target ne 'webgrade') {
@@ -431,7 +431,7 @@ sub start_Task {
 	&Apache::lonxml::debug("Got $status");
 	$body_tag_start.=&add_previous_version_button($status);
 	if (!&show_task($status,$previous)) {
-	    my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);
+	    my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
 	    if ( $target eq "web" ) {
 		$result.= $head_tag_start.'</head>'.$body_tag_start;
 		if ($env{'request.state'} eq 'construct') {
@@ -552,7 +552,7 @@ DONESCREEN
 		}
 	    }
 	    $webgrade='no';
-	    my $bodytext=&Apache::lonxml::get_all_text("/task",$parser);
+	    my $bodytext=&Apache::lonxml::get_all_text("/task",$parser,$style);
 	}
 	if ($target eq 'webgrade' && defined($env{'form.queue'})) {
 	    if ($webgrade eq 'yes') {
@@ -955,13 +955,38 @@ sub check_queue_unlock {
     return 'not_owner';
 }
 
+sub in_queue {
+    my ($queue,$symb,$cdom,$cnum,$udom,$uname)=@_;
+    if ($queue eq 'none') { return 0; }
+    if (!defined($symb) || !defined($cdom) || !defined($cnum)
+	|| !defined($udom) || !defined($uname)) {
+	($symb,my $cid,$udom,$uname)=&Apache::lonxml::whichuser();
+	$cnum=$env{'course.'.$cid.'.num'};
+	$cdom=$env{'course.'.$cid.'.domain'};
+    }
+
+    my $key=&encode_queue_key($symb,$udom,$uname);
+    my %results = &Apache::lonnet::get($queue,[$key],$cdom,$cnum);
+
+    if (defined($results{$key})) {
+	return 1;
+    }
+    return 0;
+}
+
 sub remove_from_queue {
-    my ($queue)=@_;
+    my ($queue,$symb,$cdom,$cnum,$udom,$uname)=@_;
     if ($queue eq 'none') { return 'ok'; }
-    my ($symb,$cid,$udom,$uname)=&Apache::lonxml::whichuser();
-    my $cnum=$env{'course.'.$cid.'.num'};
-    my $cdom=$env{'course.'.$cid.'.domain'};
-    my $key="$symb\0queue\0$uname\@$udom";
+    if (!defined($symb) || !defined($cdom) || !defined($cnum)
+	|| !defined($udom) || !defined($uname)) {
+	($symb,my $cid,$udom,$uname)=&Apache::lonxml::whichuser();
+	$cnum=$env{'course.'.$cid.'.num'};
+	$cdom=$env{'course.'.$cid.'.domain'};
+    }
+    if (!&in_queue($queue,$symb,$cdom,$cnum,$udom,$uname)) {
+	return 'ok';
+    }
+    my $key=&encode_queue_key($symb,$udom,$uname);
     my @keys=($key,"$key\0locked");
     return &Apache::lonnet::del($queue,\@keys,$cdom,$cnum);
 }
@@ -1001,10 +1026,17 @@ sub check_queue_for_key {
 	if (defined($results{"$todo\0locked"})) {
 	    return 'locked';
 	}
-	my $slot=$results{$todo}->[0];
-	my %slot_data=&Apache::lonnet::get_slot($slot);
-	if ($slot_data{'endtime'} > time) { 
-	    return 'in_progress';
+	my $slot;
+	if (ref($results{$todo}) eq 'ARRAY')  {
+	    $slot = $results{$todo}[0];
+	} elsif (ref($results{$todo}) eq 'HASH')  {
+	    $slot = $results{$todo}{'slot'};
+	}
+	if (defined($slot)) {
+	    my %slot_data=&Apache::lonnet::get_slot($slot);
+	    if ($slot_data{'endtime'} > time) { 
+		return 'in_progress';
+	    }
 	}
 	return 'enqueued';
     }
@@ -1048,7 +1080,7 @@ sub show_queue {
     if ($tmp=~/^error: 2 /) {
 	return "\n<h3>Current Queue - $queue</h3><table border='1'><tr><td>Empty</td></tr></table>";
     }
-    $result.="\n<h3>Current Queue - $queue </h3><table border='1'><tr>";
+    $result.="\n<h3>Current Queue - $symb $queue </h3><table border='1'><tr>";
     if ($with_selects) { $result.="<th></th>"; }
     $result.="<th>resource</th><th>user</th><th>type</th><th>data</th></tr>";
     foreach my $key (sort(keys(%queue))) {
@@ -1236,6 +1268,27 @@ sub lock_key {
     return 0;
 }
 
+sub get_queue_symb_status {
+    my ($queue,$symb,$cdom,$cnum) = @_;
+    if (!defined($cdom) || !defined($cnum)) {
+	my (undef,$cid)=&Apache::lonxml::whichuser();
+	$cnum=$env{'course.'.$cid.'.num'};
+	$cdom=$env{'course.'.$cid.'.domain'};
+    }
+    my $regexp="^$symb\0";
+    my %queue=&Apache::lonnet::dump($queue,$cdom,$cnum,$regexp);
+    my ($tmp)=%queue;
+    if ($tmp=~/^error: 2 /) { return; }
+    my @users;
+    foreach my $key (sort(keys(%queue))) {
+	next if ($key=~/locked$/);
+	next if ($key=~/timestamp$/);
+	my ($symb,$uname,$udom) = &decode_queue_key($key);
+	push(@users,"$uname:$udom");
+    }
+    return @users;
+}
+
 sub get_from_queue {
     my ($queue)=@_;
     my $result;
@@ -1321,7 +1374,8 @@ sub select_user {
 	
 	my $cnum=$env{'course.'.$cid.'.num'};
 	my $cdom=$env{'course.'.$cid.'.domain'};
-	my %status = &get_student_status($symb,$cdom,$cnum,$udom,$uname);
+	my %status = &get_student_status($symb,$cdom,$cnum,$udom,$uname,
+					 'Task');
 	my $queue = 'none';
 	my $cannot_grade;
 	if ($status{'reviewqueue'} =~ /^(in_progress|enqueue)$/) {
@@ -1400,17 +1454,23 @@ RESULT
 }
 
 sub get_student_status {
-    my ($symb,$cdom,$cnum,$udom,$uname)=@_;
-    my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},
-					  $udom,$uname);
+    my ($symb,$cdom,$cnum,$udom,$uname,$type)=@_;
+
     my %status;
-    $status{'status'}=$record{'resource.status'};
-    $status{'version'}=$record{'resource.version'};
-    $status{'grader'}=$record{'resource.grader'};
-    $status{'reviewqueue'}=&check_queue_for_key($cdom,$cnum,'reviewqueue',
-				       &encode_queue_key($symb,$udom,$uname));
-    $status{'gradingqueue'}=&check_queue_for_key($cdom,$cnum,'gradingqueue',
-				       &encode_queue_key($symb,$udom,$uname));
+
+    if ($type eq 'Task') {
+	my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},
+					  $udom,$uname);
+	$status{'status'}=$record{'resource.status'};
+	$status{'version'}=$record{'resource.version'};
+	$status{'grader'}=$record{'resource.grader'};
+    }
+    $status{'reviewqueue'}=
+	&check_queue_for_key($cdom,$cnum,'reviewqueue',
+			     &encode_queue_key($symb,$udom,$uname));
+    $status{'gradingqueue'}=
+	&check_queue_for_key($cdom,$cnum,'gradingqueue',
+			     &encode_queue_key($symb,$udom,$uname));
     return %status;
 }
 
@@ -1660,14 +1720,14 @@ sub get_instance {
 }
 
 sub start_IntroParagraph {
-    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
     if ($target eq 'web' || $target eq 'webgrade') {
 	if ($tagstack->[-2] eq 'Dimension') {
-	    $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser);
+	    $dimension{'intro'}=&Apache::lonxml::get_all_text('/introparagraph',$parser,$style);
 	
 	} elsif ($target eq 'webgrade') {
-	    &Apache::lonxml::get_all_text('/introparagraph',$parser);
+	    &Apache::lonxml::get_all_text('/introparagraph',$parser,$style);
 	}
 	
     }
@@ -1696,9 +1756,9 @@ sub end_Instance {
 }
 
 sub start_InstanceText {
-    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];
-    my $text=&Apache::lonxml::get_all_text('/instancetext',$parser);
+    my $text=&Apache::lonxml::get_all_text('/instancetext',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade') {
 	$dimension{$instance_id.'.text'}=$text;
     }
@@ -1710,9 +1770,9 @@ sub end_InstanceText {
 }
 
 sub start_Criteria {
-    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $instance_id=$Apache::bridgetask::instance[-1];
-    my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser);
+    my $criteria=&Apache::lonxml::get_all_text('/criteria',$parser,$style);
     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'grade') {
 	my $id=&get_id($parstack,$safeeval);
 	$dimension{$instance_id.'.criteria.'.$id}=$criteria;