--- loncom/interface/slotrequest.pm	2006/05/18 20:53:24	1.62
+++ loncom/interface/slotrequest.pm	2009/03/20 10:05:08	1.90
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler for requesting to have slots added to a students record
 #
-# $Id: slotrequest.pm,v 1.62 2006/05/18 20:53:24 albertel Exp $
+# $Id: slotrequest.pm,v 1.90 2009/03/20 10:05:08 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -36,6 +36,8 @@ use Apache::lonlocal;
 use Apache::lonnet;
 use Apache::lonnavmaps();
 use Date::Manip;
+use lib '/home/httpd/lib/perl/';
+use LONCAPA;
 
 sub fail {
     my ($r,$code)=@_;
@@ -75,7 +77,7 @@ sub end_page {
 =cut
 
 sub get_course {
-    (undef,my $courseid)=&Apache::lonxml::whichuser();
+    (undef,my $courseid)=&Apache::lonnet::whichuser();
     my $cdom=$env{'course.'.$courseid.'.domain'};
     my $cnum=$env{'course.'.$courseid.'.num'};
     return ($cnum,$cdom);
@@ -88,7 +90,7 @@ sub get_reservation_ids {
 
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
 				       "^$slot_name\0");
-    if (&network_error(%consumed)) { 
+    if (&Apache::lonnet::error(%consumed)) { 
 	return 'error: Unable to determine current status';
     }
     my ($tmp)=%consumed;
@@ -125,8 +127,9 @@ sub check_for_reservation {
     my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::get('slots', [@slots], $cdom, $cnum);
 
-    if (&network_error($student) || &network_error($course)  ||
-	&network_error(%slots)) {
+    if (&Apache::lonnet::error($student) 
+	|| &Apache::lonnet::error($course)
+	|| &Apache::lonnet::error(%slots)) {
 	return 'error: Unable to determine current status';
     }    
     my @got;
@@ -162,6 +165,9 @@ sub check_for_reservation {
 sub get_consumed_uniqueperiods {
     my ($slots) = @_;
     my $navmap=Apache::lonnavmaps::navmap->new;
+    if (!defined($navmap)) {
+        return 'error: Unable to determine current status';
+    }
     my @problems = $navmap->retrieveResources(undef,
 					      sub { $_[0]->is_problem() },1,0);
     my %used_slots;
@@ -173,7 +179,8 @@ sub get_consumed_uniqueperiods {
 	my $course =  &Apache::lonnet::EXT("resource.0.available",
 					   $symb, $env{'user.domain'},
 					   $env{'user.name'});
-	if (&network_error($student) || &network_error($course)) {
+	if (&Apache::lonnet::error($student) 
+	    || &Apache::lonnet::error($course)) {
 	    return 'error: Unable to determine current status';
 	}
 	foreach my $slot (split(/:/,$student), split(/:/, $course)) {
@@ -184,7 +191,7 @@ sub get_consumed_uniqueperiods {
     if (!ref($slots)) {
 	my ($cnum,$cdom)=&get_course();
 	my %slots=&Apache::lonnet::get('slots', [keys(%used_slots)], $cdom, $cnum);
-	if (&network_error(%slots)) {
+	if (&Apache::lonnet::error(%slots)) {
 	    return 'error: Unable to determine current status';
 	}
 	$slots = \%slots;
@@ -210,9 +217,13 @@ sub check_for_conflict {
 
     if (!ref($consumed_uniqueperiods)) {
 	$consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);
-	if (&network_error(%$consumed_uniqueperiods)) {
-	    return 'error: Unable to determine current status';
-	}
+        if (ref($consumed_uniqueperiods) eq 'HASH') {
+	    if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
+	        return 'error: Unable to determine current status';
+	    }
+        } else {
+            return 'error: Unable to determine current status';
+        }
     }
     
     my ($new_uniq_start,$new_uniq_end) = @{$new_slot->{'uniqueperiod'}};
@@ -225,36 +236,27 @@ sub check_for_conflict {
 	}
     }
     return undef;
-
-}
-
-sub network_error {
-    my ($result) = @_;
-    if ($result =~ /^(con_lost|no_such_host|error: [^2])/) {
-	return 1;
-    }
-    return 0;
 }
 
 sub make_reservation {
-    my ($slot_name,$slot,$symb)=@_;
-
-    my ($cnum,$cdom)=&get_course();
+    my ($slot_name,$slot,$symb,$cnum,$cdom)=@_;
 
     my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,
 				   $env{'user.domain'},$env{'user.name'});
     &Apache::lonxml::debug("value is  $value<br />");
 
-    my $use_slots = &Apache::lonnet::EXT("resource.0.useslots");
+    my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",$symb,
+					 $env{'user.domain'},$env{'user.name'});
     &Apache::lonxml::debug("use_slots is  $use_slots<br />");
 
-    if (&network_error($value) || &network_error($use_slots)) { 
+    if (&Apache::lonnet::error($value) 
+	|| &Apache::lonnet::error($use_slots)) { 
 	return 'error: Unable to determine current status';
     }
 
     my $parm_symb  = $symb;
     my $parm_level = 1;
-    if ($use_slots eq 'map') {
+    if ($use_slots eq 'map' || $use_slots eq 'map_map') {
 	my ($map) = &Apache::lonnet::decode_symb($symb);
 	$parm_symb = &Apache::lonnet::symbread($map);
 	$parm_level = 2;
@@ -264,7 +266,7 @@ sub make_reservation {
 	if ($other_slot eq $slot_name) {
 	    my %consumed=&Apache::lonnet::dump('slot_reservations', $cdom,
 					       $cnum, "^$slot_name\0");   
-	    if (&network_error($value)) { 
+	    if (&Apache::lonnet::error($value)) { 
 		return 'error: Unable to determine current status';
 	    }
 	    my $me=$env{'user.name'}.':'.$env{'user.domain'};
@@ -281,7 +283,7 @@ sub make_reservation {
     if (!defined($max)) { $max=99999; }
 
     my (@ids)=&get_reservation_ids($slot_name);
-    if (&network_error(@ids)) { 
+    if (&Apache::lonnet::error(@ids)) { 
 	return 'error: Unable to determine current status';
     }
     my $last=0;
@@ -311,13 +313,7 @@ sub make_reservation {
 	if ($value) {
 	    $new_value=$value.':'.$new_value;
 	}
-	my $result=&Apache::lonparmset::storeparm_by_symb($symb,
-						      '0_availablestudent',
-						       $parm_level, $new_value,
-						       'string',
-						       $env{'user.name'},
-					               $env{'user.domain'});
-	&Apache::lonxml::debug("hrrm $result");
+        &store_slot_parm($symb,$slot_name,$parm_level,$new_value,$cnum,$cdom);
 	return $wanted;
     }
 
@@ -325,6 +321,28 @@ sub make_reservation {
     return undef;
 }
 
+sub store_slot_parm {
+    my ($symb,$slot_name,$parm_level,$new_value,$cnum,$cdom) = @_;
+    my $result=&Apache::lonparmset::storeparm_by_symb($symb,
+                                                  '0_availablestudent',
+                                                   $parm_level, $new_value,
+                                                   'string',
+                                                   $env{'user.name'},
+                                                   $env{'user.domain'});
+    &Apache::lonxml::debug("hrrm $result");
+    my %storehash = (
+                       symb    => $symb,
+                       slot    => $slot_name,
+                       action  => 'reserve',
+                       context => $env{'form.context'},
+                    );
+
+    &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
+                                    '',$env{'user.name'},$env{'user.domain'},
+                                    $cnum,$cdom);
+    return;
+}
+
 sub remove_registration {
     my ($r) = @_;
     if ($env{'form.entry'} ne 'remove all') {
@@ -336,13 +354,13 @@ sub remove_registration {
     my ($cnum,$cdom)=&get_course();
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
 				       "^$slot_name\0");
-    if (&network_error(%consumed)) {
-	$r->print("<p>".&mt('A network error has occured.').'</p>');
+    if (&Apache::lonnet::error(%consumed)) {
+	$r->print("<p><span class=\"LC_error\">".&mt('A network error has occurred.').'</span></p>');
 	return;
     }
     if (!%consumed) {
-	$r->print("<p>".&mt('Slot <tt>[_1]</tt> has no reservations.',
-			    $slot_name)."</p>");
+	$r->print('<p>'.&mt('Slot [_1] has no reservations.',
+			    '<tt>'.$slot_name.'</tt>').'</p>');
 	return;
     }
 
@@ -350,7 +368,7 @@ sub remove_registration {
     my $names = join(' ',@names);
 
     my $msg = &mt('Remove all of [_1] from slot [_2]?',$names,$slot_name);
-    &remove_registration_confirmation($r,$msg,['entry','slotname']);
+    &remove_registration_confirmation($r,$msg,['entry','slotname','context']);
 }
 
 sub remove_registration_user {
@@ -367,7 +385,7 @@ sub remove_registration_user {
 		  $name,$slot_name,$title);
     
     &remove_registration_confirmation($r,$msg,['uname','udom','slotname',
-					       'entry','symb']);
+					       'entry','symb','context']);
 }
 
 sub remove_registration_confirmation {
@@ -379,17 +397,19 @@ sub remove_registration_confirmation {
 	    '<input type="hidden" name="'.$parm.'" value="'
 	    .&HTML::Entities::encode($env{'form.'.$parm},'"<>&\'').'" />'."\n";
     }
-    my %lt = &Apache::lonlocal::texthash('yes' => 'Yes',
-					 'no'  => 'No',);
+    my %lt = &Apache::lonlocal::texthash(
+        'yes' => 'Yes',
+        'no'  => 'No',
+    );
     $r->print(<<"END_CONFIRM");
 <p> $msg </p>
-<form action="/adm/slotrequest" method="POST">
+<form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="release" />
     <input type="hidden" name="button" value="yes" />
     $hidden_input
     <input type="submit" value="$lt{'yes'}" />
 </form>
-<form action="/adm/slotrequest" method="POST">
+<form action="/adm/slotrequest" method="post">
     <input type="hidden" name="command" value="showslots" />
     <input type="submit" value="$lt{'no'}" />
 </form>
@@ -415,7 +435,11 @@ sub release_all_slot {
 	my ($result,$msg) =
 	    &release_reservation($slot_name,$uname,$udom,
 				 $consumed{$entry}{'symb'},$mgr);
-	$r->print("<p>$msg</p>");
+        if (!$result) {
+            $r->print('<p><span class="LC_error">'.&mt($msg).'</span></p>');
+        } else {
+	    $r->print("<p>$msg</p>");
+        }
 	$r->rflush();
     }
     $r->print('<p><a href="/adm/slotrequest?command=showslots">'.
@@ -436,12 +460,16 @@ sub release_slot {
 
     if ($mgr eq 'F' 
 	&& defined($env{'form.symb'})) {
-	$symb = $env{'form.symb'};
+	$symb = &unescape($env{'form.symb'});
     }
 
     my ($result,$msg) =
 	&release_reservation($slot_name,$uname,$udom,$symb,$mgr);
-    $r->print("<p>$msg</p>");
+    if (!$result) {
+        $r->print('<p><span class="LC_error">'.&mt($msg).'</span></p>');
+    } else {
+        $r->print("<p>$msg</p>");
+    }
     
     if ($mgr eq 'F') {
 	$r->print('<p><a href="/adm/slotrequest?command=showslots">'.
@@ -462,9 +490,25 @@ sub release_reservation {
 	    return (0,&mt('Not allowed to release Reservation: [_1], as it has already ended.',$description));
 	}
     }
+
+    # if the reservation symb is for a map get a resource in that map
+    # to check slot parameters on
+    my $navmap=Apache::lonnavmaps::navmap->new;
+    if (!defined($navmap)) {
+        return (0,'error: Unable to determine current status');
+    }
+    my $passed_resource = $navmap->getBySymb($symb);
+    if ($passed_resource->is_map()) {
+	my ($a_resource) = 
+	    $navmap->retrieveResources($passed_resource, 
+				       sub {$_[0]->is_problem()},0,1);
+	$symb = $a_resource->symb();
+    }
+
     # get parameter string, check for existance, rebuild string with the slot
-    my @slots = split(/:/,&Apache::lonnet::EXT("resource.0.availablestudent",
-					       $symb,$udom,$uname));
+    my $student = &Apache::lonnet::EXT("resource.0.availablestudent",
+                                       $symb,$udom,$uname);
+    my @slots = split(/:/,$student);
 
     my @new_slots;
     foreach my $exist_slot (@slots) {
@@ -482,18 +526,27 @@ sub release_reservation {
 	if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
 	    &Apache::lonnet::del('slot_reservations',[$entry],
 				 $cdom,$cnum);
+            my %storehash = (
+                               symb    => $symb,
+                               slot    => $slot_name,
+                               action  => 'release',
+                               context => $env{'form.context'},
+                        );
+            &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
+                                        1,$uname,$udom,$cnum,$cdom);
 	}
     }
 
-    my $use_slots = &Apache::lonnet::EXT("resource.0.useslots");
+    my $use_slots = &Apache::lonnet::EXT("resource.0.useslots",
+					 $symb,$udom,$uname);
     &Apache::lonxml::debug("use_slots is  $use_slots<br />");
 
-    if (&network_error($use_slots)) { 
+    if (&Apache::lonnet::error($use_slots)) { 
 	return (0,'error: Unable to determine current status');
     }
 
     my $parm_level = 1;
-    if ($use_slots eq 'map') {
+    if ($use_slots eq 'map' || $use_slots eq 'map_map') {
 	$parm_level = 2;
     }
     # store new parameter string
@@ -501,7 +554,6 @@ sub release_reservation {
 						      '0_availablestudent',
 						      $parm_level, $new_param,
 						      'string', $uname, $udom);
-
     my $msg;
     if ($mgr eq 'F') {
 	$msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
@@ -528,15 +580,15 @@ sub delete_slot {
 	my $ret = &Apache::lonnet::cput('slots', {$slot_name => \%slot},
 					$cdom, $cnum);
 	if ($ret eq 'ok') {
-	    $r->print("<p>Slot <tt>$slot_name</tt> marked as deleted.</p>");
+	    $r->print('<p>'.&mt('Slot [_1] marked as deleted.','<tt>'.$slot_name.'</tt>').'</p>');
 	} else {
-	    $r->print("<p> An error ($ret) occurse when attempting to delete Slot <tt>$slot_name</tt>.</p>");
+	    $r->print('<p><span class="LC_error">'.&mt('An error occurred when attempting to delete slot: [_1]','<tt>'.$slot_name.'</tt>')." ($ret)</span></p>");
 	}
     } else {
 	if (%consumed) {
-	    $r->print("<p>Slot <tt>$slot_name</tt> has active reservations.</p>");
+	    $r->print('<p>'.&mt('Slot [_1] has active reservations.','<tt>'.$slot_name.'</tt>').'</p>');
 	} else {
-	    $r->print("<p>Slot <tt>$slot_name</tt> does not exist.</p>");
+	    $r->print('<p>'.&mt('Slot [_1] does not exist.','<tt>'.$slot_name.'</tt>').'</p>');
 	}
     }
     $r->print('<p><a href="/adm/slotrequest?command=showslots">'.
@@ -551,37 +603,40 @@ sub return_link {
 }
 
 sub get_slot {
-    my ($r,$symb)=@_;
+    my ($r,$symb,$conflictable_slot,$inhibit_return_link)=@_;
 
     my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
     my $slot_name=&check_for_conflict($symb,$env{'form.slotname'},\%slot);
 
     if ($slot_name =~ /^error: (.*)/) {
-	$r->print("<p>An error occured while attempting to make a reservation. ($1)</p>");
+	$r->print('<p><span class="LC_error">'
+                 .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
+                 .'</span></p>');
 	&return_link($r);
-	return;
+	return 0;
     }
-    if ($slot_name) {
+    if ($slot_name && $slot_name ne $conflictable_slot) {
 	my %slot=&Apache::lonnet::get_slot($slot_name);
 	my $description1=&get_description($slot_name,\%slot);
 	%slot=&Apache::lonnet::get_slot($env{'form.slotname'});
 	my $description2=&get_description($env{'form.slotname'},\%slot);
-	$r->print("<p>Already have a reservation: $description1</p>");
+	$r->print('<p>'.&mt('Already have a reservation: [_1].',$description1).'</p>');
 	if ($slot_name ne $env{'form.slotname'}) {
 	    $r->print(<<STUFF);
-<form method="POST" action="/adm/slotrequest">
+<form method="post" action="/adm/slotrequest">
    <input type="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
    <input type="hidden" name="releaseslot" value="$slot_name" />
    <input type="hidden" name="command" value="change" />
 STUFF
-            $r->print("<p>You can either ");
-	    $r->print(<<STUFF);
-   <input type="submit" name="change" value="Change" />
-STUFF
-	    $r->print(' your reservation from <b>'.$description1.'</b> to <b>'.
-		      $description2.
-		      '</b> <br />or </p>');
+            $r->print('<p>'
+                     .&mt('You can either [_1]Change[_2] your reservation from [_3] to [_4] or'
+                         ,'<input type="submit" name="change" value="'
+                         ,'" />'
+                         ,'<b>'.$description1.'</b>'
+                         ,'<b>'.$description2.'</b>')
+                     .'<br /></p>'
+            );
 	    &return_link($r);
 	    $r->print(<<STUFF);
 </form>
@@ -589,51 +644,65 @@ STUFF
         } else {
 	    &return_link($r);
 	}
-	return;
+	return 0;
     }
 
+    my ($cnum,$cdom)=&get_course();
     my $reserved=&make_reservation($env{'form.slotname'},
-				   \%slot,$symb);
+				   \%slot,$symb,$cnum,$cdom);
     my $description=&get_description($env{'form.slotname'},\%slot);
     if (defined($reserved)) {
+	my $retvalue = 0;
 	if ($slot_name =~ /^error: (.*)/) {
-	    $r->print("<p>An error occured while attempting to make a reservation. ($1)</p>");
+	    $r->print('<p><span class="LC_error">'
+                     .&mt('An error occurred while attempting to make a reservation. ([_1])',$1)
+                     .'</span></p>');
 	} elsif ($reserved > -1) {
-	    $r->print("<p>Success: $description</p>");
+	    $r->print('<p>'.&mt('Success: [_1]',$description).'</p>');
+	    $retvalue = 1;
 	} elsif ($reserved < 0) {
-	    $r->print("<p>Already reserved: $description</p>");
+	    $r->print('<p>'.&mt('Already reserved: [_1]',$description).'</p>');
 	}
-	&return_link($r);
-	return;
+	if (!$inhibit_return_link) { &return_link($r); }
+	return 1;
     }
 
-    my %lt=('request'=>"Availibility list",
-	    'try'    =>'Try again');
-    %lt=&Apache::lonlocal::texthash(%lt);
+    my %lt = &Apache::lonlocal::texthash(
+        'request' => 'Availibility list',
+        'try'     => 'Try again?',
+        'or'      => 'or',
+    );
+
+    my $extra_input;
+    if ($conflictable_slot) {
+	$extra_input='<input type="hidden" name="releaseslot" value="'.$env{'form.slotname'}.'" />';
+    }
 
+    $r->print('<p>'.&mt('[_1]Failed[_2] to reserve a slot for [_3].','<span class="LC_warning">','</span>',$description).'</p>');
     $r->print(<<STUFF);
-<p> <font color="red">Failed</font> to reserve a spot for $description. </p>
 <p>
-<form method="POST" action="/adm/slotrequest">
+<form method="post" action="/adm/slotrequest">
    <input type="submit" name="Try Again" value="$lt{'try'}" />
    <input type="hidden" name="symb" value="$env{'form.symb'}" />
    <input type="hidden" name="slotname" value="$env{'form.slotname'}" />
-   <input type="hidden" name="command" value="get" />
+   <input type="hidden" name="command" value="$env{'form.command'}" />
+   $extra_input
 </form>
-?
 </p>
 <p>
-or
-<form method="POST" action="/adm/slotrequest">
+$lt{'or'}
+<form method="post" action="/adm/slotrequest">
     <input type="hidden" name="symb" value="$env{'form.symb'}" />
     <input type="submit" name="requestattempt" value="$lt{'request'}" />
 </form>
-</p>
-or
 STUFF
 
-    &return_link($r);
-    return;
+    if (!$inhibit_return_link) { 
+        $r->print(&mt('or').'</p>').&return_link($r);
+    } else {
+        $r->print('</p>');
+    }
+    return 0;
 }
 
 sub allowed_slot {
@@ -641,8 +710,7 @@ sub allowed_slot {
 
     #already started
     if ($slot->{'starttime'} < time) {
-	# all open slot to be schedulable
-	#return 0;
+	return 0;
     }
     &Apache::lonxml::debug("$slot_name starttime good");
 
@@ -678,6 +746,16 @@ sub allowed_slot {
 		    split(',',$slot->{'allowedsections'}))) {
 	    $userallowed=1;
 	}
+	if (defined($env{'request.course.groups'})) {
+	    my @groups = split(/:/,$env{'request.course.groups'});
+	    my @allowed_sec = split(',',$slot->{'allowedsections'});
+	    foreach my $group (@groups) {
+		if (grep {$_ eq $group} (@allowed_sec)) {
+		    $userallowed=1;
+		    last;
+		}
+	    }
+	}
     }
     &Apache::lonxml::debug("$slot_name sections is $userallowed");
 
@@ -704,7 +782,9 @@ sub allowed_slot {
 
     my $conflict = &check_for_conflict($symb,$slot_name,$slot,$slots,
 				       $consumed_uniqueperiods);
-    if ($conflict) {
+    if ($conflict =~ /^error: /) {
+        return 0;
+    } elsif ($conflict ne '') {
 	if ($slots->{$conflict}{'starttime'} < time) {
 	    return 0;
 	}
@@ -730,10 +810,29 @@ sub show_choices {
     my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
     my $consumed_uniqueperiods = &get_consumed_uniqueperiods(\%slots);
+    if (ref($consumed_uniqueperiods) eq 'HASH') {
+        if (&Apache::lonnet::error(%$consumed_uniqueperiods)) {
+            $r->print('<span class="LC_error">'.
+                      &mt('An error occurred determining slot availability').
+                      '</span>');
+            return;
+        }
+    } elsif ($consumed_uniqueperiods =~ /^error: /) {
+        $r->print('<span class="LC_error">'.
+                  &mt('An error occurred determining slot availability').
+                  '</span>');
+        return;
+    }
     my $available;
-    $r->print('<table border="1">');
     &Apache::lonxml::debug("Checking Slots");
     my @got_slots=&check_for_reservation($symb,'allslots');
+    if ($got_slots[0] =~ /^error: /) {
+        $r->print('<span class="LC_error">'.
+                  &mt('An error occurred determining slot availability').
+                  '</span>');
+        return;
+    }
+    $r->print('<table border="1">');
     foreach my $slot (sort 
 		      { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
 		      (keys(%slots)))  {
@@ -752,24 +851,31 @@ sub show_choices {
 	    my $text=&mt('Select');
 	    my $command='get';
 	    if (grep(/^\Q$slot\E$/,@got_slots)) {
-		$text=&mt('Free Reservation');
+		$text=&mt('Drop Reservation');
 		$command='release';
 	    } else {
 		my $conflict = &check_for_conflict($symb,$slot,$slots{$slot},
 						   \%slots,
 						   $consumed_uniqueperiods);
-		if ($conflict) {
-		    $text=&mt('Change Reservation');
-		    $command='get';
-		}
+                if ($conflict) {
+                    if ($conflict =~ /^error: /) {
+                        $r->print('<tr><td><span class="LC_error" colspan="2">'
+                                  .&mt('Slot: [_1] has unknown status.',$description)
+                                  .'</span></td></tr>');
+                    } else {
+		        $text=&mt('Change Reservation');
+		        $command='get';
+		    }
+                }
 	    }
-	    my $escsymb=&Apache::lonnet::escape($symb);
+	    my $escsymb=&escape($symb);
 	    $form=<<STUFF;
-   <form method="POST" action="/adm/slotrequest">
+   <form method="post" action="/adm/slotrequest">
      <input type="submit" name="Select" value="$text" />
      <input type="hidden" name="symb" value="$escsymb" />
      <input type="hidden" name="slotname" value="$slot" />
      <input type="hidden" name="command" value="$command" />
+     <input type="hidden" name="context" value="user" />
    </form>
 STUFF
 	}
@@ -782,7 +888,8 @@ STUFF
     }
 
     if (!$available) {
-	$r->print('<tr><td>No available times. <a href="/adm/flip?postdata=return:">'.
+	$r->print('<tr><td>'.&mt('No available times.').
+                  ' <a href="/adm/flip?postdata=return:">'.
 		  &mt('Return to last resource').'</a></td></tr>');
     }
     $r->print('</table>');
@@ -862,14 +969,14 @@ sub remove_link {
 	undef($udom);
     }
 
-    $slotname  = &Apache::lonnet::escape($slotname);
-    $entry     = &Apache::lonnet::escape($entry);
-    $uname     = &Apache::lonnet::escape($uname);
-    $udom      = &Apache::lonnet::escape($udom);
-    $symb      = &Apache::lonnet::escape($symb);
+    $slotname  = &escape($slotname);
+    $entry     = &escape($entry);
+    $uname     = &escape($uname);
+    $udom      = &escape($udom);
+    $symb      = &escape($symb);
 
     return <<"END_LINK";
- <a href="/adm/slotrequest?command=remove_registration&slotname=$slotname&entry=$entry&uname=$uname&udom=$udom&symb=$symb"
+ <a href="/adm/slotrequest?command=remove_registration&amp;slotname=$slotname&amp;entry=$entry&amp;uname=$uname&amp;udom=$udom&amp;symb=$symb&amp;context=manage"
    >($remove)</a>
 END_LINK
 
@@ -885,14 +992,19 @@ sub show_table {
     } 
     my $available;
     if ($mgr eq 'F') {
+    # FIXME: This line should be deleted once Slots uses breadcrumbs
+    $r->print(&Apache::loncommon::help_open_topic('Slot About', 'Help on slots'));
+
 	$r->print('<div>');
-	$r->print('<form method="POST" action="/adm/slotrequest">
+	$r->print('<form method="post" action="/adm/slotrequest">
 <input type="hidden" name="command" value="uploadstart" />
 <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />
 </form>');
-	$r->print('<form method="POST" action="/adm/helper/newslot.helper">
+	$r->print(&Apache::loncommon::help_open_topic('Slot CommaDelimited'));
+	$r->print('<form method="post" action="/adm/helper/newslot.helper">
 <input type="submit" name="newslot" value="'.&mt('Create a New Slot').'" />
 </form>');
+	$r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));
 	$r->print('</div>');
     }
     
@@ -920,7 +1032,7 @@ sub show_table {
 	     'endtime'         => 'End Time',
              'startreserve'    => 'Time students can start reserving',
 	     'secret'          => 'Secret Word',
-	     'maxspace'        => 'Maximum # of students',
+	     'space'           => '# of students/max',
 	     'ip'              => 'IP or DNS restrictions',
 	     'symb'            => 'Resource slot is restricted to.',
 	     'allowedsections' => 'Sections slot is restricted to.',
@@ -929,7 +1041,7 @@ sub show_table {
 	     'scheduled'       => 'Scheduled Students',
 	     'proctor'         => 'List of proctors');
     my @show_order=('name','description','type','starttime','endtime',
-		    'startreserve','secret','maxspace','ip','symb',
+		    'startreserve','secret','space','ip','symb',
 		    'allowedsections','allowedusers','uniqueperiod',
 		    'scheduled','proctor');
     my @show = 
@@ -977,13 +1089,16 @@ sub show_table {
     my $name_filter = {'type'  => $name_filter_type,
 		       'value' => $env{'form.name_filter_value'},};
 
+    
     #deleted slot filtering
+    #default to hide if no value
+    $env{'form.deleted'} ||= 'hide';
     my $hide_radio = 
 	&Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'hide');
     my $show_radio = 
 	&Apache::lonhtmlcommon::radio('deleted',$env{'form.deleted'},'show');
 	
-    $r->print('<form method="POST" action="/adm/slotrequest">
+    $r->print('<form method="post" action="/adm/slotrequest">
 <input type="hidden" name="command" value="showslots" />');
     $r->print('<div>');
     $r->print('<table class="inline">
@@ -1026,23 +1141,28 @@ sub show_table {
     $r->print('</div>');
     $r->print('<p><input type="submit" name="start" value="'.&mt('Update Display').'" /></p>');
     my $linkstart='<a href="/adm/slotrequest?command=showslots&amp;order=';
-    $r->print('<table class="thinborder">
-<tr>
-  <th></th>');
+    $r->print(&Apache::loncommon::start_data_table().
+	      &Apache::loncommon::start_data_table_header_row().'
+	       <th></th>');
     foreach my $which (@show_order) {
 	if ($which ne 'proctor' && exists($show{$which})) {
 	    $r->print('<th>'.$linkstart.$which.'">'.$show_fields{$which}.'</a></th>');
 	}
     }
+    $r->print(&Apache::loncommon::end_data_table_header_row());
 
     my %name_cache;
     my $slotsort = sub {
-	if ($env{'form.order'}=~/^(type|description|endtime|startreserve|maxspace|ip|symb|allowedsections|allowedusers)$/) {
+	if ($env{'form.order'}=~/^(type|description|endtime|startreserve|ip|symb|allowedsections|allowedusers)$/) {
 	    if (lc($slots{$a}->{$env{'form.order'}})
 		ne lc($slots{$b}->{$env{'form.order'}})) {
 		return (lc($slots{$a}->{$env{'form.order'}}) 
 			cmp lc($slots{$b}->{$env{'form.order'}}));
 	    }
+	} elsif ($env{'form.order'} eq 'space') {
+	    if ($slots{$a}{'maxspace'} ne $slots{$b}{'maxspace'}) {
+		return ($slots{$a}{'maxspace'} cmp $slots{$b}{'maxspace'});
+	    }
 	} elsif ($env{'form.order'} eq 'name') {
 	    if (lc($a) cmp lc($b)) {
 		return lc($a) cmp lc($b);
@@ -1062,6 +1182,14 @@ sub show_table {
 	}
 	return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'};
     };
+
+    my %consumed;
+    if (exists($show{'scheduled'}) || exists($show{'space'}) ) {
+	%consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum);
+	my ($tmp)=%consumed;
+	if ($tmp =~ /^error: /) { undef(%consumed); }
+    }
+
     foreach my $slot (sort $slotsort (keys(%slots)))  {
 	if (!&to_show($slot,$slots{$slot},$when,
 		      $env{'form.deleted'},$name_filter)) { next; }
@@ -1070,18 +1198,19 @@ sub show_table {
 	    #next;
 	}
 	my $description=&get_description($slot,$slots{$slot});
-	my $ids;
-	if (exists($show{'scheduled'})) {
-	    my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
-					       "^$slot\0");
-	    my ($tmp)=%consumed;
-	    if ($tmp !~ /^error: /) {
+	my ($id_count,$ids);
+	    
+	if (exists($show{'scheduled'}) || exists($show{'space'}) ) {
+	    my $re_str = "$slot\0";
+	    my @this_slot = grep(/^\Q$re_str\E/,keys(%consumed));
+	    $id_count = scalar(@this_slot);
+	    if (exists($show{'scheduled'})) {
 		foreach my $entry (sort { $consumed{$a}{name} cmp 
 					      $consumed{$b}{name} }
-				   (keys(%consumed))) {
+				   (@this_slot)) {
 		    my (undef,$id)=split("\0",$entry);
 		    my ($uname,$udom) = split(':',$consumed{$entry}{'name'});
-		    $ids.= '<nobr>';
+		    $ids.= '<span class="LC_nobreak">';
 		    foreach my $item (@stu_display_order) {
 			if ($stu_display{$item}) {
 			    if ($item eq 'fullname') {
@@ -1092,7 +1221,7 @@ sub show_table {
 			}
 		    }
 		    $ids.=&remove_link($slot,$entry,$uname,$udom,
-				       $consumed{$entry}{'symb'}).'</nobr><br />';
+				       $consumed{$entry}{'symb'}).'</span><br />';
 		}
 	    }
 	}
@@ -1106,7 +1235,7 @@ sub show_table {
 	
 	my $unique;
 	if (ref($slots{$slot}{'uniqueperiod'})) {
-	    $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).','.
+	    $unique=localtime($slots{$slot}{'uniqueperiod'}[0]).', '.
 		localtime($slots{$slot}{'uniqueperiod'}[1]);
 	}
 
@@ -1164,7 +1293,7 @@ sub show_table {
 EDITLINK
 
 	my $delete=(<<"DELETELINK");
-<a href="/adm/slotrequest?command=delete&slotname=$slot">Delete</a>
+<a href="/adm/slotrequest?command=delete&amp;slotname=$slot">Delete</a>
 DELETELINK
 
         my $remove_all=&remove_link($slot,'remove all').'<br />';
@@ -1175,7 +1304,10 @@ DELETELINK
 	    undef($remove_all);
 	}
 
-        $r->print("<tr>\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");
+	my $row_start=&Apache::loncommon::start_data_table_row();
+	my $row_end=&Apache::loncommon::end_data_table_row();
+        $r->print($row_start.
+		  "\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");
 	if (exists($show{'name'})) {
 	    $colspan++;$r->print("<td>$slot</td>");
 	}
@@ -1197,8 +1329,15 @@ DELETELINK
 	if (exists($show{'secret'})) {
 	    $colspan++;$r->print("<td>$slots{$slot}{'secret'}</td>\n");
 	}
-	if (exists($show{'maxspace'})) {
-	    $colspan++;$r->print("<td>$slots{$slot}{'maxspace'}</td>\n");
+	if (exists($show{'space'})) {
+	    my $display = $id_count;
+	    if ($slots{$slot}{'maxspace'}>0) {
+		$display.='/'.$slots{$slot}{'maxspace'};
+		if ($slots{$slot}{'maxspace'} <= $id_count) {
+		    $display = '<strong>'.$display.' (full) </strong>';
+		}
+	    }
+	    $colspan++;$r->print("<td>$display</td>\n");
 	}
 	if (exists($show{'ip'})) {
 	    $colspan++;$r->print("<td>$slots{$slot}{'ip'}</td>\n");
@@ -1212,18 +1351,22 @@ DELETELINK
 	if (exists($show{'allowedusers'})) {
 	    $colspan++;$r->print("<td>$allowedusers</td>\n");
 	}
+	if (exists($show{'uniqueperiod'})) {
+	    $colspan++;$r->print("<td>$unique</td>\n");
+	}
 	if (exists($show{'scheduled'})) {
-	    $colspan++;$r->print("<td>$remove_all $ids</td>\n</tr>\n");
+	    $colspan++;$r->print("<td>$remove_all $ids</td>\n");
 	}
+	$r->print("$row_end\n");
 	if (exists($show{'proctor'})) {
 	    $r->print(<<STUFF);
-<tr>
+$row_start
  <td colspan="$colspan">$proctors</td>
-</tr>
+$row_end
 STUFF
         }
     }
-    $r->print('</table>');
+    $r->print('</table></form>');
 }
 
 sub upload_start {
@@ -1233,7 +1376,7 @@ sub upload_start {
     $result.='&nbsp;<b>'.
 	&mt('Specify a file containing the slot definitions.').
 	'</b></td></tr>'."\n";
-    $result.='<tr bgcolor=#ffffe6><td>'."\n";
+    $result.='<tr bgcolor="#ffffe6"><td>'."\n";
     my $upfile_select=&Apache::loncommon::upfile_select_html();
     my $ignore=&mt('Ignore First Line');
     $result.=<<ENDUPFORM;
@@ -1260,9 +1403,11 @@ sub csvuploadmap_header {
 
     my $checked=(($env{'form.noFirstLine'})?' checked="checked"':'');
     my $ignore=&mt('Ignore First Line');
+	my $help_field = &Apache::loncommon::help_open_topic('Slot SelectingField');
+
     $r->print(<<ENDPICK);
 <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">
-<h3>Identify fields</h3>
+<h3>Identify fields $help_field</h3>	
 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 create the slots.<hr />
@@ -1286,11 +1431,12 @@ ENDPICK
 
 sub csvuploadmap_footer {
     my ($request,$i,$keyfields) =@_;
+    my $buttontext = &mt('Create Slots');
     $request->print(<<ENDPICK);
 </table>
 <input type="hidden" name="nfields" value="$i" />
 <input type="hidden" name="keyfields" value="$keyfields" />
-<input type="button" onClick="javascript:verify(this.form)" value="Create Slots" /><br />
+<input type="button" onClick="javascript:verify(this.form)" value="$buttontext" /><br />
 </form>
 ENDPICK
 }
@@ -1407,7 +1553,7 @@ sub csv_upload_assign {
     my @slotdata = &Apache::loncommon::upfile_record_sep();
     if ($env{'form.noFirstLine'}) { shift(@slotdata); }
     my %fields=&Apache::grades::get_fields();
-    $r->print('<h3>Creating Slots</h3>');
+    $r->print('<h3>'.&mt('Creating Slots').'</h3>');
     my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
     my $countdone=0;
@@ -1494,9 +1640,9 @@ sub csv_upload_assign {
 	$r->rflush();
 	$countdone++;
     }
-    $r->print("<p>Created $countdone slots\n</p>");
+    $r->print('<p>'.&mt('Created [quant,_1,slot]',$countdone)."\n".'</p>');
     foreach my $error (@errors) {
-	$r->print("<p>$error\n</p>");
+	$r->print('<p><span class="LC_warning">'.$error.'</span></p>'."\n");
     }
     &show_table($r,$mgr);
     return '';
@@ -1550,14 +1696,16 @@ sub handler {
 	    &csv_upload_map($r);
 	}
     } else {
-	my $symb=&Apache::lonnet::unescape($env{'form.symb'});
+	my $symb=&unescape($env{'form.symb'});
 	if (!defined($symb)) {
 	    &fail($r,'not_valid');
 	    return OK;
 	}
 	my (undef,undef,$res)=&Apache::lonnet::decode_symb($symb);
 	my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
-	if ($useslots ne 'resource' && $useslots ne 'map') {
+	if ($useslots ne 'resource' 
+	    && $useslots ne 'map' 
+	    && $useslots ne 'map_map') {
 	    &fail($r,'not_available');
 	    return OK;
 	}
@@ -1578,11 +1726,11 @@ sub handler {
 	} elsif ($env{'form.command'} eq 'get') {
 	    &get_slot($r,$symb);
 	} elsif ($env{'form.command'} eq 'change') {
-	    if (&release_slot($r,$symb,$env{'form.releaseslot'},1)) {
-		&get_slot($r,$symb);
+	    if (&get_slot($r,$symb,$env{'form.releaseslot'},1)) {
+		&release_slot($r,$symb,$env{'form.releaseslot'});
 	    }
 	} else {
-	    $r->print("<p>Unknown command: ".$env{'form.command'}."</p>");
+	    $r->print('<p>'.&mt('Unknown command: [_1]',$env{'form.command'}).'</p>');
 	}
     }
     &end_page($r);