--- loncom/interface/slotrequest.pm	2007/04/10 23:31:18	1.77
+++ loncom/interface/slotrequest.pm	2009/02/02 18:20:15	1.88
@@ -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.77 2007/04/10 23:31:18 albertel Exp $
+# $Id: slotrequest.pm,v 1.88 2009/02/02 18:20:15 bisitz Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -165,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;
@@ -214,9 +217,13 @@ sub check_for_conflict {
 
     if (!ref($consumed_uniqueperiods)) {
 	$consumed_uniqueperiods = &get_consumed_uniqueperiods($slots);
-	if (&Apache::lonnet::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'}};
@@ -229,7 +236,6 @@ sub check_for_conflict {
 	}
     }
     return undef;
-
 }
 
 sub make_reservation {
@@ -241,7 +247,8 @@ sub make_reservation {
 				   $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 (&Apache::lonnet::error($value) 
@@ -334,12 +341,12 @@ sub remove_registration {
     my %consumed=&Apache::lonnet::dump('slot_reservations',$cdom,$cnum,
 				       "^$slot_name\0");
     if (&Apache::lonnet::error(%consumed)) {
-	$r->print("<p>".&mt('A network error has occured.').'</p>');
+	$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;
     }
 
@@ -412,7 +419,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">'.
@@ -438,7 +449,11 @@ sub release_slot {
 
     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">'.
@@ -459,9 +474,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,7 +513,8 @@ sub release_reservation {
 	}
     }
 
-    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 (&Apache::lonnet::error($use_slots)) { 
@@ -525,15 +557,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">'.
@@ -554,7 +586,9 @@ sub get_slot {
     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 0;
     }
@@ -563,7 +597,7 @@ sub get_slot {
 	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">
@@ -572,13 +606,14 @@ sub get_slot {
    <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>
@@ -595,19 +630,22 @@ STUFF
     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>');
 	}
 	if (!$inhibit_return_link) { &return_link($r); }
 	return 1;
     }
 
     my %lt=('request'=>"Availibility list",
-	    'try'    =>'Try again');
+	    'try'    =>'Try again?',
+            'or'     => 'or');
     %lt=&Apache::lonlocal::texthash(%lt);
 
     my $extra_input;
@@ -615,8 +653,8 @@ STUFF
 	$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">
    <input type="submit" name="Try Again" value="$lt{'try'}" />
@@ -625,19 +663,20 @@ STUFF
    <input type="hidden" name="command" value="$env{'form.command'}" />
    $extra_input
 </form>
-?
 </p>
 <p>
-or
+$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
 
-    if (!$inhibit_return_link) { &return_link($r); }
+    if (!$inhibit_return_link) { 
+        $r->print(&mt('or').'</p>').&return_link($r);
+    } else {
+        $r->print('</p>');
+    }
     return 0;
 }
 
@@ -718,7 +757,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;
 	}
@@ -744,10 +785,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)))  {
@@ -772,10 +832,16 @@ sub show_choices {
 		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=&escape($symb);
 	    $form=<<STUFF;
@@ -796,7 +862,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>');
@@ -1108,15 +1175,16 @@ sub show_table {
 	my ($id_count,$ids);
 	    
 	if (exists($show{'scheduled'}) || exists($show{'space'}) ) {
-	    my @this_slot = grep(/^$slot\0/,keys(%consumed));
+	    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') {
@@ -1127,7 +1195,7 @@ sub show_table {
 			}
 		    }
 		    $ids.=&remove_link($slot,$entry,$uname,$udom,
-				       $consumed{$entry}{'symb'}).'</nobr><br />';
+				       $consumed{$entry}{'symb'}).'</span><br />';
 		}
 	    }
 	}
@@ -1282,7 +1350,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;
@@ -1337,11 +1405,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
 }
@@ -1458,7 +1527,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;
@@ -1545,9 +1614,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 '';
@@ -1635,7 +1704,7 @@ sub handler {
 		&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);