--- loncom/interface/slotrequest.pm	2006/10/31 15:58:41	1.68.2.2
+++ loncom/interface/slotrequest.pm	2007/04/10 23:30:41	1.76
@@ -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.68.2.2 2006/10/31 15:58:41 albertel Exp $
+# $Id: slotrequest.pm,v 1.76 2007/04/10 23:30:41 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -77,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);
@@ -548,7 +548,7 @@ 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);
@@ -556,9 +556,9 @@ sub get_slot {
     if ($slot_name =~ /^error: (.*)/) {
 	$r->print("<p>An error occured while attempting to make a reservation. ($1)</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'});
@@ -586,28 +586,35 @@ STUFF
         } else {
 	    &return_link($r);
 	}
-	return;
+	return 0;
     }
 
     my $reserved=&make_reservation($env{'form.slotname'},
 				   \%slot,$symb);
     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>");
 	} elsif ($reserved > -1) {
 	    $r->print("<p>Success: $description</p>");
+	    $retvalue = 1;
 	} elsif ($reserved < 0) {
 	    $r->print("<p>Already reserved: $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 $extra_input;
+    if ($conflictable_slot) {
+	$extra_input='<input type="hidden" name="releaseslot" value="'.$env{'form.slotname'}.'" />';
+    }
+
     $r->print(<<STUFF);
 <p> <font color="red">Failed</font> to reserve a spot for $description. </p>
 <p>
@@ -615,7 +622,8 @@ STUFF
    <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>
@@ -629,8 +637,8 @@ or
 or
 STUFF
 
-    &return_link($r);
-    return;
+    if (!$inhibit_return_link) { &return_link($r); }
+    return 0;
 }
 
 sub allowed_slot {
@@ -639,7 +647,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");
 
@@ -892,14 +900,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">
 <input type="hidden" name="command" value="uploadstart" />
 <input type="submit" name="start" value="'.&mt('Upload Slot List').'" />
 </form>');
+	$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>');
     }
     
@@ -927,7 +940,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.',
@@ -936,7 +949,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 = 
@@ -1048,12 +1061,16 @@ sub show_table {
 
     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);
@@ -1073,6 +1090,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; }
@@ -1081,12 +1106,12 @@ 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 @this_slot = grep(/^$slot\0/,keys(%consumed));
+	    $id_count = scalar(@this_slot);
+	    if (exists($show{'scheduled'})) {
 		foreach my $entry (sort { $consumed{$a}{name} cmp 
 					      $consumed{$b}{name} }
 				   (keys(%consumed))) {
@@ -1211,8 +1236,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");
@@ -1278,9 +1310,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 />
@@ -1598,8 +1632,8 @@ 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>");