Diff for /loncom/interface/slotrequest.pm between versions 1.88 and 1.101

version 1.88, 2009/02/02 18:20:15 version 1.101, 2009/08/05 16:12:53
Line 56  sub fail { Line 56  sub fail {
 }  }
   
 sub start_page {  sub start_page {
     my ($r,$title)=@_;      my ($r,$title,$brcrum)=@_;
     $r->print(&Apache::loncommon::start_page($title));      my $args;
       if (ref($brcrum) eq 'ARRAY') {
           $args = {bread_crumbs => $brcrum};
       }
       $r->print(&Apache::loncommon::start_page($title,undef,$args));
 }  }
   
 sub end_page {  sub end_page {
Line 133  sub check_for_reservation { Line 137  sub check_for_reservation {
  return 'error: Unable to determine current status';   return 'error: Unable to determine current status';
     }          }    
     my @got;      my @got;
     foreach my $slot_name (sort {      my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots);
  if (ref($slots{$a}) && ref($slots{$b})) {      foreach my $slot_name (@sorted_slots) {
     return $slots{$a}{'starttime'} <=> $slots{$b}{'starttime'}  
  }  
  if (ref($slots{$a})) { return -1;}  
  if (ref($slots{$b})) { return 1;}  
  return 0;  
     } @slots) {  
  next if (!defined($slots{$slot_name}) ||   next if (!defined($slots{$slot_name}) ||
  !ref($slots{$slot_name}));   !ref($slots{$slot_name}));
  &Apache::lonxml::debug(time." $slot_name ".   &Apache::lonxml::debug(time." $slot_name ".
Line 239  sub check_for_conflict { Line 237  sub check_for_conflict {
 }  }
   
 sub make_reservation {  sub make_reservation {
     my ($slot_name,$slot,$symb)=@_;      my ($slot_name,$slot,$symb,$cnum,$cdom)=@_;
   
     my ($cnum,$cdom)=&get_course();  
   
     my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,      my $value=&Apache::lonnet::EXT("resource.0.availablestudent",$symb,
    $env{'user.domain'},$env{'user.name'});     $env{'user.domain'},$env{'user.name'});
Line 315  sub make_reservation { Line 311  sub make_reservation {
  if ($value) {   if ($value) {
     $new_value=$value.':'.$new_value;      $new_value=$value.':'.$new_value;
  }   }
  my $result=&Apache::lonparmset::storeparm_by_symb($symb,          &store_slot_parm($symb,$slot_name,$parm_level,$new_value,$cnum,$cdom);
       '0_availablestudent',  
        $parm_level, $new_value,  
        'string',  
        $env{'user.name'},  
                $env{'user.domain'});  
  &Apache::lonxml::debug("hrrm $result");  
  return $wanted;   return $wanted;
     }      }
   
Line 329  sub make_reservation { Line 319  sub make_reservation {
     return undef;      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);
       &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                       1,$env{'user.name'},$env{'user.domain'},
                                       $env{'user.name'},$env{'user.domain'});
   
       return;
   }
   
 sub remove_registration {  sub remove_registration {
     my ($r) = @_;      my ($r) = @_;
     if ($env{'form.entry'} ne 'remove all') {      if ($env{'form.entry'} ne 'remove all') {
Line 354  sub remove_registration { Line 370  sub remove_registration {
     my $names = join(' ',@names);      my $names = join(' ',@names);
   
     my $msg = &mt('Remove all of [_1] from slot [_2]?',$names,$slot_name);      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 {  sub remove_registration_user {
Line 371  sub remove_registration_user { Line 387  sub remove_registration_user {
   $name,$slot_name,$title);    $name,$slot_name,$title);
           
     &remove_registration_confirmation($r,$msg,['uname','udom','slotname',      &remove_registration_confirmation($r,$msg,['uname','udom','slotname',
        'entry','symb']);         'entry','symb','context']);
 }  }
   
 sub remove_registration_confirmation {  sub remove_registration_confirmation {
Line 383  sub remove_registration_confirmation { Line 399  sub remove_registration_confirmation {
     '<input type="hidden" name="'.$parm.'" value="'      '<input type="hidden" name="'.$parm.'" value="'
     .&HTML::Entities::encode($env{'form.'.$parm},'"<>&\'').'" />'."\n";      .&HTML::Entities::encode($env{'form.'.$parm},'"<>&\'').'" />'."\n";
     }      }
     my %lt = &Apache::lonlocal::texthash('yes' => 'Yes',      my %lt = &Apache::lonlocal::texthash(
  'no'  => 'No',);          'yes' => 'Yes',
           'no'  => 'No',
       );
     $r->print(<<"END_CONFIRM");      $r->print(<<"END_CONFIRM");
 <p> $msg </p>  <p> $msg </p>
 <form action="/adm/slotrequest" method="post">  <form action="/adm/slotrequest" method="post">
Line 510  sub release_reservation { Line 528  sub release_reservation {
  if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {   if ( $consumed{$entry}->{'name'} eq ($uname.':'.$udom) ) {
     &Apache::lonnet::del('slot_reservations',[$entry],      &Apache::lonnet::del('slot_reservations',[$entry],
  $cdom,$cnum);   $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);
               &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
                                               1,$uname,$udom,$uname,$udom);
  }   }
     }      }
   
Line 530  sub release_reservation { Line 558  sub release_reservation {
       '0_availablestudent',        '0_availablestudent',
       $parm_level, $new_param,        $parm_level, $new_param,
       'string', $uname, $udom);        'string', $uname, $udom);
   
     my $msg;      my $msg;
     if ($mgr eq 'F') {      if ($mgr eq 'F') {
  $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");   $msg = &mt('Released Reservation for user: [_1]',"$uname:$udom");
Line 575  sub delete_slot { Line 602  sub delete_slot {
   
 sub return_link {  sub return_link {
     my ($r) = @_;      my ($r) = @_;
     $r->print('<p><a href="/adm/flip?postdata=return:">'.      if (($env{'form.command'} eq 'manageresv') || ($env{'form.context'} eq 'usermanage')) {
       &mt('Return to last resource').'</a></p>');   $r->print('<p><a href="/adm/slotrequest?command=manageresv">'.
                     &mt('Return to reservations'));  
       } else {
           $r->print('<p><a href="/adm/flip?postdata=return:">'.
             &mt('Return to last resource').'</a></p>');
       }
 }  }
   
 sub get_slot {  sub get_slot {
Line 624  STUFF Line 656  STUFF
  return 0;   return 0;
     }      }
   
       my ($cnum,$cdom)=&get_course();
     my $reserved=&make_reservation($env{'form.slotname'},      my $reserved=&make_reservation($env{'form.slotname'},
    \%slot,$symb);     \%slot,$symb,$cnum,$cdom);
     my $description=&get_description($env{'form.slotname'},\%slot);      my $description=&get_description($env{'form.slotname'},\%slot);
     if (defined($reserved)) {      if (defined($reserved)) {
  my $retvalue = 0;   my $retvalue = 0;
Line 643  STUFF Line 676  STUFF
  return 1;   return 1;
     }      }
   
     my %lt=('request'=>"Availibility list",      my %lt = &Apache::lonlocal::texthash(
     'try'    =>'Try again?',          'request' => 'Availibility list',
             'or'     => 'or');          'try'     => 'Try again?',
     %lt=&Apache::lonlocal::texthash(%lt);          'or'      => 'or',
       );
   
     my $extra_input;      my $extra_input;
     if ($conflictable_slot) {      if ($conflictable_slot) {
Line 673  $lt{'or'} Line 707  $lt{'or'}
 STUFF  STUFF
   
     if (!$inhibit_return_link) {       if (!$inhibit_return_link) { 
         $r->print(&mt('or').'</p>').&return_link($r);          $r->print(&mt('or').'</p>');
           &return_link($r);
     } else {      } else {
         $r->print('</p>');          $r->print('</p>');
     }      }
Line 780  sub get_description { Line 815  sub get_description {
 }  }
   
 sub show_choices {  sub show_choices {
     my ($r,$symb)=@_;      my ($r,$symb,$formname)=@_;
   
     my ($cnum,$cdom)=&get_course();      my ($cnum,$cdom)=&get_course();
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);      my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);
Line 798  sub show_choices { Line 833  sub show_choices {
                   '</span>');                    '</span>');
         return;          return;
     }      }
     my $available;      my (@available,$output);
     &Apache::lonxml::debug("Checking Slots");      &Apache::lonxml::debug("Checking Slots");
     my @got_slots=&check_for_reservation($symb,'allslots');      my @got_slots=&check_for_reservation($symb,'allslots');
     if ($got_slots[0] =~ /^error: /) {      if ($got_slots[0] =~ /^error: /) {
Line 807  sub show_choices { Line 842  sub show_choices {
                   '</span>');                    '</span>');
         return;          return;
     }      }
     $r->print('<table border="1">');  
     foreach my $slot (sort       foreach my $slot (sort 
       { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }        { return $slots{$a}->{'starttime'} <=> $slots{$b}->{'starttime'} }
       (keys(%slots)))  {        (keys(%slots)))  {
Line 816  sub show_choices { Line 850  sub show_choices {
  next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,   next if (!&allowed_slot($slot,$slots{$slot},undef,\%slots,
  $consumed_uniqueperiods));   $consumed_uniqueperiods));
   
  $available++;          push(@available,$slot);
       }
       if (!@available) {
           $output = &mt('No available times.');
           if ($env{'form.command'} ne 'manageresv') {
               $output .= ' <a href="/adm/flip?postdata=return:">'.
                          &mt('Return to last resource').'</a>';
           }
           $r->print($output);
           return;
       }
       if ($env{'form.command'} eq 'manageresv') {
           $output = '<table border="0">';
       } else {
           $output = &Apache::loncommon::start_data_table();
       }
       foreach my $slot (@available) { 
  my $description=&get_description($slot,$slots{$slot});   my $description=&get_description($slot,$slots{$slot});
    my $form;
  my $form=&mt('Unavailable');  
  if ((grep(/^\Q$slot\E$/,@got_slots)) ||   if ((grep(/^\Q$slot\E$/,@got_slots)) ||
     &space_available($slot,$slots{$slot},$symb)) {      &space_available($slot,$slots{$slot},$symb)) {
     my $text=&mt('Select');      my $text=&mt('Select');
Line 834  sub show_choices { Line 882  sub show_choices {
    $consumed_uniqueperiods);     $consumed_uniqueperiods);
                 if ($conflict) {                  if ($conflict) {
                     if ($conflict =~ /^error: /) {                      if ($conflict =~ /^error: /) {
                         $r->print('<tr><td><span class="LC_error" colspan="2">'                          $form = '<span class="LC_error">'.
                                   .&mt('Slot: [_1] has unknown status.',$description)                                  &mt('Slot: [_1] has unknown status.',$description).
                                   .'</span></td></tr>');                                  '</span>';
                     } else {                      } else {
         $text=&mt('Change Reservation');          $text=&mt('Change Reservation');
         $command='get';          $command='get';
Line 844  sub show_choices { Line 892  sub show_choices {
                 }                  }
     }      }
     my $escsymb=&escape($symb);      my $escsymb=&escape($symb);
     $form=<<STUFF;              if (!$form) {
    <form method="post" action="/adm/slotrequest">                  if ($formname) {
                       $formname = 'name="'.$formname.'" ';
                   }
                   my $context = 'user';
                   if ($env{'form.command'} eq 'manageresv') {
                       $context = 'usermanage';
                   }
           $form=<<STUFF;
      <form method="post" action="/adm/slotrequest" $formname>
      <input type="submit" name="Select" value="$text" />       <input type="submit" name="Select" value="$text" />
      <input type="hidden" name="symb" value="$escsymb" />       <input type="hidden" name="symb" value="$escsymb" />
      <input type="hidden" name="slotname" value="$slot" />       <input type="hidden" name="slotname" value="$slot" />
      <input type="hidden" name="command" value="$command" />       <input type="hidden" name="command" value="$command" />
        <input type="hidden" name="context" value="$context" />
    </form>     </form>
 STUFF  STUFF
  }      }
  $r->print(<<STUFF);          } else {
 <tr>              $form = &mt('Unavailable');
           }
           if ($env{'form.command'} eq 'manageresv') {
               $output .= '<tr>';
           } else {
       $output .= &Apache::loncommon::start_data_table_row();
           }
           $output .= " 
  <td>$form</td>   <td>$form</td>
  <td>$description</td>   <td>$description</td>\n";
 </tr>          if ($env{'form.command'} eq 'manageresv') {
 STUFF              $output .= '</tr>';
           } else {
               $output .= &Apache::loncommon::end_data_table_row();
           }
     }      }
       if ($env{'form.command'} eq 'manageresv') {
     if (!$available) {          $output .= '</table>';
  $r->print('<tr><td>'.&mt('No available times.').      } else {
                   ' <a href="/adm/flip?postdata=return:">'.         $output .= &Apache::loncommon::end_data_table();
   &mt('Return to last resource').'</a></td></tr>');  
     }      }
     $r->print('</table>');      $r->print($output);
 }  }
   
 sub to_show {  sub to_show {
Line 950  sub remove_link { Line 1016  sub remove_link {
     $symb      = &escape($symb);      $symb      = &escape($symb);
   
     return <<"END_LINK";      return <<"END_LINK";
  <a href="/adm/slotrequest?command=remove_registration&amp;slotname=$slotname&amp;entry=$entry&amp;uname=$uname&amp;udom=$udom&amp;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>     >($remove)</a>
 END_LINK  END_LINK
   
Line 981  sub show_table { Line 1047  sub show_table {
  $r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));   $r->print(&Apache::loncommon::help_open_topic('Slot AddInterface'));
  $r->print('</div>');   $r->print('</div>');
     }      }
   
       if (!keys(%slots)) {
           $r->print('<div>'.&mt('No slots have been created in this course.').'</div>');
           return;
       }
           
     my %Saveable_Parameters = ('show'              => 'array',      my %Saveable_Parameters = ('show'              => 'array',
        'when'              => 'scalar',         'when'              => 'scalar',
Line 1082  sub show_table { Line 1153  sub show_table {
           <th>'.&mt('Slot Name Filter').'</th>            <th>'.&mt('Slot Name Filter').'</th>
           <th>'.&mt('Options').'</th>            <th>'.&mt('Options').'</th>
       </tr>        </tr>
       <tr><td>'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).        <tr><td valign="top">'.&Apache::loncommon::multiple_select_form('show',\@show,6,\%show_fields,\@show_order).
       '</td>        '</td>
            <td>             <td valign="top">
          '.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display,           '.&Apache::loncommon::multiple_select_form('studisplay',\@stu_display,
     6,\%stu_display_fields,      6,\%stu_display_fields,
     \@stu_display_order).'      \@stu_display_order).'
            </td>             </td>
            <td>'.&Apache::loncommon::select_form($when,'when',%when_fields).             <td valign="top">'.&Apache::loncommon::select_form($when,'when',%when_fields).
           '</td>            '</td>
            <td>'.&Apache::loncommon::select_form($name_filter_type,             <td valign="top">'.&Apache::loncommon::select_form($name_filter_type,
  'name_filter_type',   'name_filter_type',
  %name_filter_type_fields).   %name_filter_type_fields).
       '<br />'.        '<br />'.
Line 1099  sub show_table { Line 1170  sub show_table {
       $env{'form.name_filter_value'},        $env{'form.name_filter_value'},
       15).        15).
           '</td>            '</td>
            <td>             <td valign="top">
             <table>              <table>
               <tr>                <tr>
                 <td rowspan="2">Deleted slots:</td>                  <td rowspan="2">Deleted slots:</td>
Line 1262  sub show_table { Line 1333  sub show_table {
  }   }
  my $proctors=join(', ',@proctors);   my $proctors=join(', ',@proctors);
   
           my %lt = &Apache::lonlocal::texthash (
                                                  edit   => 'Edit',
                                                  delete => 'Delete',
                                                  slotlog => 'History',
           );
  my $edit=(<<"EDITLINK");   my $edit=(<<"EDITLINK");
 <a href="/adm/helper/newslot.helper?name=$slot">Edit</a>  <a href="/adm/helper/newslot.helper?name=$slot">$lt{'edit'}</a>
 EDITLINK  EDITLINK
   
  my $delete=(<<"DELETELINK");   my $delete=(<<"DELETELINK");
 <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">Delete</a>  <a href="/adm/slotrequest?command=delete&amp;slotname=$slot">$lt{'delete'}</a>
 DELETELINK  DELETELINK
   
           my $showlog=(<<"LOGLINK");
   <a href="/adm/slotrequest?command=slotlog&amp;slotname=$slot">$lt{'slotlog'}</a>
   LOGLINK
   
         my $remove_all=&remove_link($slot,'remove all').'<br />';          my $remove_all=&remove_link($slot,'remove all').'<br />';
   
         if ($ids ne '') { undef($delete); }          if ($ids eq '') {
  if ($slots{$slot}{'type'} ne 'schedulable_student'               undef($remove_all);
     || $ids eq '') {           } else {
               undef($delete);
           }
    if ($slots{$slot}{'type'} ne 'schedulable_student') {
               undef($showlog); 
     undef($remove_all);      undef($remove_all);
  }   }
   
  my $row_start=&Apache::loncommon::start_data_table_row();   my $row_start=&Apache::loncommon::start_data_table_row();
  my $row_end=&Apache::loncommon::end_data_table_row();   my $row_end=&Apache::loncommon::end_data_table_row();
         $r->print($row_start.          $r->print($row_start.
   "\n<td rowspan=\"$rowspan\">$edit $delete</td>\n");    "\n<td rowspan=\"$rowspan\">$edit $delete $showlog</td>\n");
  if (exists($show{'name'})) {   if (exists($show{'name'})) {
     $colspan++;$r->print("<td>$slot</td>");      $colspan++;$r->print("<td>$slot</td>");
  }   }
Line 1340  $row_end Line 1424  $row_end
 STUFF  STUFF
         }          }
     }      }
     $r->print('</table></form>');      $r->print(&Apache::loncommon::end_data_table().'</form>');
       return;
   }
   
   sub manage_reservations {
       my ($r,$type) = @_;
       my $navmap = Apache::lonnavmaps::navmap->new();
       $r->print('<p>'
                .&mt('Instructors may use a reservation system to place restrictions on when and where assignments can be worked on.')
                .'<br />'
                .&mt('One example is for management of laboratory space, which is only available at certain times, and has a limited number of seats.')
                .'</p><p>'
                .&mt('Your reservation status for any such assignments is listed below:')
                .'</p>'
       );
       if (!defined($navmap)) {
           $r->print('<div class="LC_error">'.
                     &mt('Unable to retrieve information about course contents').
                     '</div>');
           &Apache::lonnet::logthis('Manage Reservations - could not create navmap object in '.lc($type).':'.$env{'request.course.id'});
           return;
       }
       my (%parent,%shownparent,%container,%container_title,%contents);
       my ($depth,$count,$reservable,$lastcontainer,$rownum) = (0,0,0,0,0);
       my @backgrounds = ("LC_odd_row","LC_even_row");
       my $numcolors = scalar(@backgrounds);
       my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");
       $r->print('<table class="LC_data_table LC_tableOfContent">'."\n");
       my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
       while (my $resource = $it->next()) {
           if ($resource == $it->BEGIN_MAP()) {
               $depth++;
               $parent{$depth} = $lastcontainer;
           }
           if ($resource == $it->END_MAP()) {
               $depth--;
               $lastcontainer = $parent{$depth};
           }
           if (ref($resource)) {
               my $symb = $resource->symb();
               my $ressymb = $symb;
               $contents{$lastcontainer} ++;
               next if (!$resource->is_problem() && !$resource->is_sequence() && 
                        !$resource->is_page());
               $count ++;
               if (($resource->is_sequence()) || ($resource->is_page())) {
                   $lastcontainer = $count;
                   $container{$lastcontainer} = $resource;
                   $container_title{$lastcontainer} = $resource->compTitle();
               }
               if ($resource->is_problem()) {
                   my ($useslots) = $resource->slot_control();
                   next if (($useslots eq '') || ($useslots =~ /^\s*no\s*$/i));
                   my ($msg,$get_choices,$slotdescription);
                   my $title = $resource->compTitle();
                   my $status = $resource->simpleStatus('0');
                   my ($slot_status,$date,$slot_name) = $resource->check_for_slot('0');
                   if ($slot_name ne '') {
                       my %slot=&Apache::lonnet::get_slot($slot_name);
                       $slotdescription=&get_description($slot_name,\%slot);
                   }
                   if ($slot_status == $resource->NOT_IN_A_SLOT) {
                       $msg=&mt('No current reservation.');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->NEEDS_CHECKIN) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Access requires proctor validation.');
                   } elsif ($slot_status == $resource->WAITING_FOR_GRADE) {
                       $msg=&mt('Submitted and currently in grading queue.');
                   } elsif ($slot_status == $resource->CORRECT) {
                       $msg=&mt('Problem is unavailable.');
                   } elsif ($slot_status == $resource->RESERVED) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Problem is currently available.');
                   } elsif ($slot_status == $resource->RESERVED_LOCATION) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Problem is available at a different location.');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->RESERVED_LATER) {
                       $msg='<span class="LC_nobreak">'.&mt('Reserved:').
                            '&nbsp;'.$slotdescription.'</span><br />'.
                            &mt('Problem will be available later.');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->RESERVABLE) {
                       $msg=&mt('Reservation needed');
                       $get_choices = 1;
                   } elsif ($slot_status == $resource->NOTRESERVABLE) {
                       $msg=&mt('Reservation needed: none available.');
                   } elsif ($slot_status == $resource->UNKNOWN) {
                       $msg=&mt('Unable to determine status due to network problems.');
                   } else {
                       if ($status != $resource->OPEN) {
                           $msg = &Apache::lonnavmaps::getDescription($resource,'0'); 
                       }
                   }
                   $reservable ++;
                   my $treelevel = $depth;
                   my $higherup = $lastcontainer;
                   if ($depth > 1) {
                       my @maprows;
                       while ($treelevel > 1) {
                           if (ref($container{$higherup})) {
                               my $res = $container{$higherup};
                               last if (defined($shownparent{$higherup}));
                               my $maptitle = $res->compTitle();
                               my $type = 'sequence';
                               if ($res->is_page()) {
                                   $type = 'page';
                               }
                               &show_map_row($treelevel,$location,$type,$maptitle,
                                             \@maprows);
                               $shownparent{$higherup} = 1;
                           }
                           $treelevel --;
                           $higherup = $parent{$treelevel};
                       }
                       foreach my $item (@maprows) {
                           $rownum ++;
                           my $bgcolor = $backgrounds[$rownum % $numcolors];
                           $r->print('<tr class="'.$bgcolor.'">'.$item.'</tr>'."\n");
                       }
                   }
                   $rownum ++;
                   my $bgcolor = $backgrounds[$rownum % $numcolors];
                   $r->print('<tr class="'.$bgcolor.'"><td>'."\n");
                   for (my $i=0; $i<$depth; $i++) {
                       $r->print('<img src="'.$location.'" alt="" />');
                   }
                   my $result = '<a href="'.$resource->src().'?symb='.$symb.'">'.
                                '<img class="LC_contentImage" src="/adm/lonIcons/';
                   if ($resource->is_task()) {
                       $result .= 'task.gif" alt="'.&mt('Task');
                   } else {
                       $result .= 'problem.gif" alt="'.&mt('Problem');
                   }
                   $result .= '" /><b>'.$title.'</b></a>'.('&nbsp;' x6).'</td>';
                   my $hasaction;
                   if ($status == $resource->OPEN) {
                       if ($get_choices) {
                           $hasaction = 1;
                       }
                   }
                   if ($hasaction) {
                       $result .= '<td valgn="middle">'.$msg.'</td>'.
                                  '<td valign="middle">'.('&nbsp;' x6);
                   } else {
                       $result .= '<td colspan="2" valign="middle">'.$msg.'</td>';
                   }
                   $r->print($result);
                   if ($hasaction) {
                       my $formname = 'manageres_'.$reservable;
                       &show_choices($r,$symb,$formname);
                       $r->print('</td>');
                   }
                   $r->print('</tr>');
               }
           }
       }
       if (!$reservable) {
           $r->print('<span class="LC_info">'.&mt('No course items currently require a reservation to gain access.').'</span>');
       }
       $r->print('</table>'.
                 '<p><a href="/adm/slotrequest?command=showresv">'.
                 &mt('Reservation History').'</a></p>');
   }
   
   sub show_map_row {
       my ($depth,$location,$type,$title,$maprows) = @_;
       my $output = '<td>';
       for (my $i=0; $i<$depth-1; $i++) {
           $output .= '<img src="'.$location.'" alt="" />';
       }
       if ($type eq 'page') {
           $output .= '<img src="/adm/lonIcons/navmap.page.open.gif" alt="" />&nbsp;'."\n";
       } else {
           $output .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" />&nbsp;'."\n";
       }
       $output .= $title.'</td><td colspan="2">&nbsp;</td>'."\n";
       unshift (@{$maprows},$output);
       return;
   }
   
   sub show_reservations {
       my ($r,$uname,$udom) = @_;
       if (!defined($uname)) {
           $uname = $env{'user.name'};
       }
       if (!defined($udom)) {
           $udom = $env{'user.domain'};
       }
       my $formname = 'slotlog';
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %log=&Apache::lonnet::dump('nohist_'.$cdom.'_'.$cnum.'_slotlog',$udom,$uname);
       if ($env{'form.origin'} eq 'aboutme') {
           $r->print('<div class="LC_fontsize_large">'.
                     &mt('History of student-reservable slots for: [_1]',
                         &Apache::loncommon::plainname($env{'form.uname'},$env{'form.udom'},
                                                       'firstname')).'</div>');
       }
       $r->print('<form action="/adm/slotrequest" method="post" name="'.$formname.'">');
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page           => '1',
                        show           => '10',
                        action         => 'any',
                        log_start_date => $defstart,
                        log_end_date   => $now,
                      );
       my $more_records = 0;
   
       # set current
       my %curr;
       foreach my $item ('show','page','action') {
           $curr{$item} = $env{'form.'.$item};
       }
       my ($startdate,$enddate) =
           &Apache::lonuserutils::get_dates_from_form('log_start_date',
                                                      'log_end_date');
       $curr{'log_start_date'} = $startdate;
       $curr{'log_end_date'} = $enddate;
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
       $r->print(&display_filter($formname,$cdom,$cnum,\%curr,$version));
       my $showntablehdr = 0;
       my $tablehdr = &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Action').'</th>'.
                      '<th>'.&mt('Description').'</th><th>'.&mt('Start time').'</th>'.
                      '<th>'.&mt('End time').'</th><th>'.&mt('Resource').'</th>'.
                      &Apache::loncommon::end_data_table_header_row();
       my ($minshown,$maxshown);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       my (%titles,%maptitles);
       my %lt = &reservationlog_contexts();
       foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {
           next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||
                    ($log{$id}{'exe_time'} > $curr{'log_end_date'}));
           if ($curr{'show'} ne &mt('all')) {
               if ($count >= $curr{'page'} * $curr{'show'}) {
                   $more_records = 1;
                   last;
               }
           }
           if ($curr{'action'} ne 'any') {
               next if ($log{$id}{'logentry'}{'action'} ne $curr{'action'});
           }
           $count ++;
           next if ($count < $minshown);
           if (!$showntablehdr) {
               $r->print($tablehdr);
               $showntablehdr = 1;
           }
           my $symb = $log{$id}{'logentry'}{'symb'};
           my $slot_name = $log{$id}{'logentry'}{'slot'};
           my %slot=&Apache::lonnet::get_slot($slot_name);
           my $description = $slot{'description'};
           my $start = ($slot{'starttime'}?
                        &Apache::lonlocal::locallocaltime($slot{'starttime'}):'');
           my $end = ($slot{'endtime'}?
                      &Apache::lonlocal::locallocaltime($slot{'endtime'}):'');
           my $title = &get_resource_title($symb,\%titles,\%maptitles);
           my $chgaction = $log{$id}{'logentry'}{'action'};
           if ($chgaction ne '' && $lt{$chgaction} ne '') {
               $chgaction = $lt{$chgaction};
           }
           $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($log{$id}{'exe_time'}).'</td><td>'.$chgaction.'</td><td>'.$description.'</td><td>'.$start.'</td><td>'.$end.'</td><td>'.$title.'</td>'.&Apache::loncommon::end_data_table_row()."\n");
       }
       if ($showntablehdr) {
           $r->print(&Apache::loncommon::end_data_table().'<br />');
           if (($curr{'page'} > 1) || ($more_records)) {
               $r->print('<table><tr>');
               if ($curr{'page'} > 1) {
                   $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
               }
               if ($more_records) {
                   $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
               }
               $r->print('</tr></table>');
               $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   </script>
   ENDSCRIPT
           }
       } else {
           $r->print('<span class="LC_info">'
                    .&mt('There are no transactions to display.')
                    .'</span>'
           );
       }
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'."\n".
                 '<input type="hidden" name="command" value="showresv" />'."\n");
       if ($env{'form.origin'} eq 'aboutme') {
           $r->print('<input type="hidden" name="origin" value="'.$env{'form.origin'}.'" />'."\n".
                     '<input type="hidden" name="uname" value="'.$env{'form.uname'}.'" />'."\n".
                     '<input type="hidden" name="udom" value="'.$env{'form.udom'}.'" />'."\n");
       }
       $r->print('</form>');
       return;
   }
   
   sub show_reservations_log {
       my ($r) = @_;
       my $badslot;
       if ($env{'form.slotname'} eq '') {
           $r->print('<div class="LC_warning">'.&mt('No slot name provided').'</div>');
           $badslot = 1;
       } else {
           my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
           if (keys(%slot) == 0) {
               $r->print('<div class="LC_warning">'.&mt('Invalid slot name: [_1]',$env{'form.slotname'}).'</div>');
               $badslot = 1;
           } elsif ($slot{type} ne 'schedulable_student') {
               my $description = &get_description($env{'form.slotname'},\%slot);
               $r->print('<div class="LC_warning">'.&mt('Reservation history unavailable for non-student-reservable slot: [_1].',$description).'</div>');
               $badslot = 1;
           }
       }
       if ($badslot) {
           $r->print('<p><a href="/adm/slotrequest?command=showslots">'.
                     &mt('Return to slot list').'</a></p>');
           return;
       }
       my $formname = 'reservationslog';
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %slotlog=&Apache::lonnet::dump('nohist_slotreservationslog',$cdom,$cnum);
       if ((keys(%slotlog))[0]=~/^error\:/) { undef(%slotlog); }
   
       my (%log,@allsymbs);
       if (keys(%slotlog)) {
           foreach my $key (keys(%slotlog)) {
               if (ref($slotlog{$key}) eq 'HASH') {
                   if (ref($slotlog{$key}{'logentry'}) eq 'HASH') {
                       if ($slotlog{$key}{'logentry'}{'slot'} eq $env{'form.slotname'}) {
                           $log{$key} = $slotlog{$key};
                           if ($slotlog{$key}{'logentry'}{'symb'} ne '') {
                               push(@allsymbs,$slotlog{$key}{'logentry'}{'symb'});
                           }
                       }
                   }
               }
           }
       }
   
       $r->print('<form action="/adm/slotrequest" method="post" name="'.$formname.'">');
       my %saveable_parameters = ('show' => 'scalar',);
       &Apache::loncommon::store_course_settings('reservationslog',
                                                 \%saveable_parameters);
       &Apache::loncommon::restore_course_settings('reservationslog',
                                                   \%saveable_parameters);
       # set defaults
       my $now = time();
       my $defstart = $now - (7*24*3600); #7 days ago
       my %defaults = (
                        page           => '1',
                        show           => '10',
                        chgcontext     => 'any',
                        action         => 'any',
                        symb           => 'any',
                        log_start_date => $defstart,
                        log_end_date   => $now,
                      );
       my $more_records = 0;
   
       # set current
       my %curr;
       foreach my $item ('show','page','chgcontext','action','symb') {
           $curr{$item} = $env{'form.'.$item};
       }
       my ($startdate,$enddate) =
           &Apache::lonuserutils::get_dates_from_form('log_start_date',
                                                      'log_end_date');
       $curr{'log_start_date'} = $startdate;
       $curr{'log_end_date'} = $enddate;
       foreach my $key (keys(%defaults)) {
           if ($curr{$key} eq '') {
               $curr{$key} = $defaults{$key};
           }
       }
       my (%whodunit,%changed,$version);
       ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/);
   
       my %slot=&Apache::lonnet::get_slot($env{'form.slotname'});
       my $description = $slot{'description'};
       $r->print('<span class="LC_fontsize_large">'.
                 &mt('Reservation changes for student-reservable slot: [_1]',$description).'</span><br />');
   
       $r->print(&display_filter($formname,$cdom,$cnum,\%curr,$version,\@allsymbs));
       my $showntablehdr = 0;
       my $tablehdr = &Apache::loncommon::start_data_table().
                      &Apache::loncommon::start_data_table_header_row().
                      '<th>&nbsp;</th><th>'.&mt('When').'</th><th>'.&mt('Who made the change').
                      '</th><th>'.&mt('Affected User').'</th><th>'.&mt('Action').'</th>'.
                      '<th>'.&mt('Resource').'</th><th>'.&mt('Context').'</th>'.
                      &Apache::loncommon::end_data_table_header_row();
       my ($minshown,$maxshown);
       $minshown = 1;
       my $count = 0;
       if ($curr{'show'} ne &mt('all')) {
           $maxshown = $curr{'page'} * $curr{'show'};
           if ($curr{'page'} > 1) {
               $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'};
           }
       }
       my %lt = &reservationlog_contexts();
       my (%titles,%maptitles);
       foreach my $id (sort { $log{$b}{'exe_time'}<=>$log{$a}{'exe_time'} } (keys(%log))) {
           next if (($log{$id}{'exe_time'} < $curr{'log_start_date'}) ||
                    ($log{$id}{'exe_time'} > $curr{'log_end_date'}));
           if ($curr{'show'} ne &mt('all')) {
               if ($count >= $curr{'page'} * $curr{'show'}) {
                   $more_records = 1;
                   last;
               }
           }
           if ($curr{'chgcontext'} ne 'any') {
               if ($curr{'chgcontext'} eq 'user') {
                   next if (($log{$id}{'logentry'}{'context'} ne 'user') && 
                            ($log{$id}{'logentry'}{'context'} ne 'usermanage'));
               } else {
                   next if ($log{$id}{'logentry'}{'context'} ne $curr{'chgcontext'});
               }
           }
           if ($curr{'action'} ne 'any') {
               next if ($log{$id}{'logentry'}{'action'} ne $curr{'action'});
           }
           if ($curr{'symb'} ne 'any') {
               next if ($log{$id}{'logentry'}{'symb'} ne $curr{'symb'});
           }
           $count ++;
           next if ($count < $minshown);
           if (!$showntablehdr) {
               $r->print($tablehdr);
               $showntablehdr = 1;
           }
           if ($whodunit{$log{$id}{'exe_uname'}.':'.$log{$id}{'exe_udom'}} eq '') {
               $whodunit{$log{$id}{'exe_uname'}.':'.$log{$id}{'exe_udom'}} =
                   &Apache::loncommon::plainname($log{$id}{'exe_uname'},$log{$id}{'exe_udom'});
           }
           if ($changed{$log{$id}{'uname'}.':'.$log{$id}{'udom'}} eq '') {
               $changed{$log{$id}{'uname'}.':'.$log{$id}{'udom'}} =
                   &Apache::loncommon::plainname($log{$id}{'uname'},$log{$id}{'udom'});
           }
           my $symb = $log{$id}{'logentry'}{'symb'};
           my $title = &get_resource_title($symb,\%titles,\%maptitles); 
           my $chgcontext = $log{$id}{'logentry'}{'context'};
           if ($chgcontext ne '' && $lt{$chgcontext} ne '') {
               $chgcontext = $lt{$chgcontext};
           }
           my $chgaction = $log{$id}{'logentry'}{'action'};
           if ($chgaction ne '' && $lt{$chgaction} ne '') {
               $chgaction = $lt{$chgaction}; 
           }
           $r->print(&Apache::loncommon::start_data_table_row().'<td>'.$count.'</td><td>'.&Apache::lonlocal::locallocaltime($log{$id}{'exe_time'}).'</td><td>'.$whodunit{$log{$id}{'exe_uname'}.':'.$log{$id}{'exe_udom'}}.'</td><td>'.$changed{$log{$id}{'uname'}.':'.$log{$id}{'udom'}}.'</td><td>'.$chgaction.'</td><td>'.$title.'</td><td>'.$chgcontext.'</td>'.&Apache::loncommon::end_data_table_row()."\n");
       }
       if ($showntablehdr) {
           $r->print(&Apache::loncommon::end_data_table().'<br />');
           if (($curr{'page'} > 1) || ($more_records)) {
               $r->print('<table><tr>');
               if ($curr{'page'} > 1) {
                   $r->print('<td><a href="javascript:chgPage('."'previous'".');">'.&mt('Previous [_1] changes',$curr{'show'}).'</a></td>');
               }
               if ($more_records) {
                   $r->print('<td><a href="javascript:chgPage('."'next'".');">'.&mt('Next [_1] changes',$curr{'show'}).'</a></td>');
               }
               $r->print('</tr></table>');
               $r->print(<<"ENDSCRIPT");
   <script type="text/javascript">
   function chgPage(caller) {
       if (caller == 'previous') {
           document.$formname.page.value --;
       }
       if (caller == 'next') {
           document.$formname.page.value ++;
       }
       document.$formname.submit();
       return;
   }
   </script>
   ENDSCRIPT
           }
       } else {
           $r->print(&mt('There are no records to display.'));
       }
       $r->print('<input type="hidden" name="page" value="'.$curr{'page'}.'" />'.
                 '<input type="hidden" name="slotname" value="'.$env{'form.slotname'}.'" />'.
                 '<input type="hidden" name="command" value="slotlog" /></form>'.
                 '<p><a href="/adm/slotrequest?command=showslots">'.
                 &mt('Return to slot list').'</a></p>');
       return;
   }
   
   sub get_resource_title {
       my ($symb,$titles,$maptitles) = @_;
       my $title;
       if ((ref($titles) eq 'HASH') && (ref($maptitles) eq 'HASH')) { 
           if (defined($titles->{$symb})) {
               $title = $titles->{$symb};
           } else {
               $title = &Apache::lonnet::gettitle($symb);
               my $maptitle;
               my ($mapurl) = &Apache::lonnet::decode_symb($symb);
               if (defined($maptitles->{$mapurl})) {
                   $maptitle = $maptitles->{$mapurl};
               } else {
                   if ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) {
                       $maptitle=&mt('Main Course Documents');
                   } else {
                       $maptitle=&Apache::lonnet::gettitle($mapurl);
                   }
                   $maptitles->{$mapurl} = $maptitle;
               }
               if ($maptitle ne '') {
                   $title .= ' '.&mt('(in [_1])',$maptitle);
               }
               $titles->{$symb} = $title;
           }
       } else {
           $title = $symb;
       }
       return $title;
   }
   
   sub reservationlog_contexts {
       my %lt = &Apache::lonlocal::texthash (
                                                any        => 'Any',
                                                user       => 'By student',
                                                manage     => 'Via Slot Manager',
                                                parameter  => 'Via Parameter Manager',
                                                reserve    => 'Made reservation',
                                                release    => 'Dropped reservation',
                                                usermanage => 'By student', 
                                            );
       return %lt;
   }
   
   sub display_filter {
       my ($formname,$cdom,$cnum,$curr,$version,$allsymbs) = @_;
       my $nolink = 1;
       my (%titles,%maptitles);
       my $output = '<br /><table><tr><td valign="top">'.
                    '<span class="LC_nobreak"><b>'.&mt('Changes/page:').'</b><br />'.
                    &Apache::lonmeta::selectbox('show',$curr->{'show'},undef,
                                                 (&mt('all'),5,10,20,50,100,1000,10000)).
                    '</td><td>&nbsp;&nbsp;</td>';
       my $startform =
           &Apache::lonhtmlcommon::date_setter($formname,'log_start_date',
                                               $curr->{'log_start_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my $endform =
           &Apache::lonhtmlcommon::date_setter($formname,'log_end_date',
                                               $curr->{'log_end_date'},undef,
                                               undef,undef,undef,undef,undef,undef,$nolink);
       my %lt = &reservationlog_contexts();
       $output .= '<td valign="top"><b>'.&mt('Window during which changes occurred:').
                  '</b><br /><table><tr><td>'.&mt('After:').
                  '</td><td>'.$startform.'</td></tr><tr><td>'.&mt('Before:').'</td><td>'.
                  $endform.'</td></tr></table></td><td>&nbsp;&nbsp;</td>';
       if (ref($allsymbs) eq 'ARRAY') {
           $output .= '<td valign="top"><b>'.&mt('Resource').'</b><br />'.
                      '<select name="resource"><option value="any"';
           if ($curr->{'resource'} eq 'any') {
               $output .= ' selected="selected"';
           }
           $output .=  '>'.&mt('Any').'</option>'."\n";
           foreach my $symb (@{$allsymbs}) {
               my $title = &get_resource_title($symb,\%titles,\%maptitles);
               my $selstr = '';
               if ($curr->{'resource'} eq $symb) {
                   $selstr = ' selected="selected"';
               }
               $output .= '  <option value="'.$symb.'"'.$selstr.'>'.$title.'</option>';
           }
           $output .= '</select></td><td>&nbsp;&nbsp;</td><td valign="top"><b>'.
                      &mt('Context:').'</b><br /><select name="chgcontext">';
           foreach my $chgtype ('any','user','manage','parameter') {
               my $selstr = '';
               if ($curr->{'chgcontext'} eq $chgtype) {
                   $output .= $selstr = ' selected="selected"';
               }
               $output .= '<option value="'.$chgtype.'"'.$selstr.'>'.$lt{$chgtype}.'</option>'."\n";
           }
           $output .= '</select></td>';
       } else {
           $output .= '<td valign="top"><b>'.&mt('Action').'</b><br />'.
                      '<select name="action"><option value="any"';
           if ($curr->{'action'} eq 'any') {
               $output .= ' selected="selected"';
           }
           $output .=  '>'.&mt('Any').'</option>'."\n";
           foreach my $actiontype ('reserve','release') {
               my $selstr = '';
               if ($curr->{'action'} eq $actiontype) {
                   $output .= $selstr = ' selected="selected"';
               }
               $output .= '<option value="'.$actiontype.'"'.$selstr.'>'.$lt{$actiontype}.'</option>'."\n";
           }
           $output .= '</select></td>';
       }
       $output .= '<td>&nbsp;&nbsp;</td><td valign="middle"><input type="submit" value="'.
                  &mt('Update Display').'" /></tr></table>'.
                  '<p class="LC_info">'.
                  &mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.'
                     ,'2.6.99.0');
       if ($version) {
           $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version);
       }
       $output .= '</p><hr /><br />';
       return $output;
 }  }
   
 sub upload_start {  sub upload_start {
     my ($r)=@_;          my ($r)=@_;    
     $r->print(&Apache::grades::checkforfile_js());      $r->print(
     my $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";          &Apache::grades::checkforfile_js()
     $result.='&nbsp;<b>'.         .'<h3>'.&mt('Specify a file containing the slot definitions.').'</h3>'
  &mt('Specify a file containing the slot definitions.').         .'<form method="post" enctype="multipart/form-data"'
  '</b></td></tr>'."\n";         .' action="/adm/slotrequest" name="slotupload">'
     $result.='<tr bgcolor="#ffffe6"><td>'."\n";         .'<input type="hidden" name="command" value="csvuploadmap" />'
     my $upfile_select=&Apache::loncommon::upfile_select_html();         .&Apache::lonhtmlcommon::start_pick_box()
     my $ignore=&mt('Ignore First Line');         .&Apache::lonhtmlcommon::row_title(&mt('File'))
     $result.=<<ENDUPFORM;         .&Apache::loncommon::upfile_select_html()
 <form method="post" enctype="multipart/form-data" action="/adm/slotrequest" name="slotupload">         .&Apache::lonhtmlcommon::row_closure()
 <input type="hidden" name="command" value="csvuploadmap" />         .&Apache::lonhtmlcommon::row_title(
 $upfile_select              '<label for="noFirstLine">'
 <br /><input type="button" onClick="javascript:checkUpload(this.form);" value="Upload Data" />             .&mt('Ignore First Line')
 <label><input type="checkbox" name="noFirstLine" />$ignore</label>             .'</label>')
 </form>         .'<input type="checkbox" name="noFirstLine" id="noFirstLine" />'
 ENDUPFORM         .&Apache::lonhtmlcommon::row_closure(1)
     $result.='</td></tr></table>'."\n";         .&Apache::lonhtmlcommon::end_pick_box()
     $result.='</td></tr></table>'."\n";         .'<p>'
     $r->print($result);         .'<input type="button" onclick="javascript:checkUpload(this.form);"'
          .' value="'.&mt('Next').'" />'
          .'</p>'
         .'</form>'
       );
 }  }
   
 sub csvuploadmap_header {  sub csvuploadmap_header {
Line 1385  sub csvuploadmap_header { Line 2108  sub csvuploadmap_header {
 Total number of records found in file: $distotal <hr />  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  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 />  to this page if the data selected is insufficient to create the slots.<hr />
 <input type="button" value="Reverse Association" onClick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />  <input type="button" value="Reverse Association" onclick="javascript:this.form.associate.value='Reverse Association';submit(this.form);" />
 <label><input type="checkbox" name="noFirstLine" $checked />$ignore</label>  <label><input type="checkbox" name="noFirstLine"$checked />$ignore</label>
 <input type="hidden" name="associate"  value="" />  <input type="hidden" name="associate"  value="" />
 <input type="hidden" name="datatoken"  value="$datatoken" />  <input type="hidden" name="datatoken"  value="$datatoken" />
 <input type="hidden" name="fileupload" value="$env{'form.fileupload'}" />  <input type="hidden" name="fileupload" value="$env{'form.fileupload'}" />
Line 1410  sub csvuploadmap_footer { Line 2133  sub csvuploadmap_footer {
 </table>  </table>
 <input type="hidden" name="nfields" value="$i" />  <input type="hidden" name="nfields" value="$i" />
 <input type="hidden" name="keyfields" value="$keyfields" />  <input type="hidden" name="keyfields" value="$keyfields" />
 <input type="button" onClick="javascript:verify(this.form)" value="$buttontext" /><br />  <input type="button" onclick="javascript:verify(this.form)" value="$buttontext" /><br />
 </form>  </form>
 ENDPICK  ENDPICK
 }  }
Line 1622  sub csv_upload_assign { Line 2345  sub csv_upload_assign {
     return '';      return '';
 }  }
   
   sub slot_command_titles {
       my %titles = (
                    slotlog            => 'Reservation Logs',
                    showslots          => 'Manage Slots',
                    showresv           => 'Reservation History',
                    manageresv         => 'Manage Reservations',
                    uploadstart        => 'Upload Slots File',
                    csvuploadmap       => 'Upload Slots File',
                    csvuploadassign    => 'Upload Slots File',
                    delete             => 'Slot Deletion',
                    release            => 'Reservation Result',
                    remove_reservation => 'Remove Registration',
                    get_reservation    => 'Request Reservation',
                 );
       return %titles;
   }
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
Line 1633  sub handler { Line 2373  sub handler {
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
       
       my %crumb_titles = &slot_command_titles();
       my $brcrum;
   
     my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr=&Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});      my $mgr=&Apache::lonnet::allowed('mgr',$env{'request.course.id'});
       if ($env{'form.command'} eq 'showslots') {
           if (($vgr ne 'F') && ($mgr ne 'F')) {
               $env{'form.command'} = 'manageresv'; 
           }
       } elsif ($env{'form.command'} eq 'manageresv') {
           if (($vgr eq 'F') || ($mgr eq 'F')) {
               $env{'form.command'} = 'showslots';
           }
       }
     my $title='Requesting Another Worktime';      my $title='Requesting Another Worktime';
     if ($env{'form.command'} =~ /^(showslots|uploadstart|csvuploadmap|csvuploadassign)$/ && $vgr eq 'F') {      if ($env{'form.command'} eq 'showresv') {
  $title = 'Managing Slots';          $title = 'Reservation History';
           if ($env{'form.origin'} eq 'aboutme') {
               $brcrum =[{href=>"/adm/$env{'form.udom'}/$env{'form.uname'}/aboutme",text=>'Personal Information Page'}];
           } else {
               $brcrum =[{href=>"/adm/slotrequest?command=manageresv",text=>'Manage Reservations'}];
           }
           if (ref($brcrum) eq 'ARRAY') {
               push(@{$brcrum},{href=>"/adm/slotrequest?command=showresv",text=>$title});
           }
       } elsif ($env{'form.command'} eq 'manageresv') {
           $title = 'Manage Reservations';
           $brcrum =[{href=>"/adm/slotrequest?command=manageresv",text=>$title}];
       } elsif ($vgr eq 'F') {
           if ($env{'form.command'} =~ /^(slotlog|showslots|uploadstart|csvuploadmap|csvuploadassign|delete|release|remove_registration)$/) {
               $brcrum =[{href=>"/adm/slotrequest?command=showslots",
                          text=>$crumb_titles{'showslots'}}];
       $title = 'Managing Slots';
               unless ($env{'form.command'} eq 'showslots') {
                   if (ref($brcrum) eq 'ARRAY') {
                       push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});
                   }
               }
           }
       } elsif ($env{'form.command'} eq 'release') {
           if ($env{'form.context'} eq 'usermanage') {
               $brcrum =[{href=>"/adm/slotrequest?command=manageresv",
                          text=>$crumb_titles{'showslots'}}];
               $title = 'Manage Reservations';
               if (ref($brcrum) eq 'ARRAY') {
                   push(@{$brcrum},{href=>"/adm/slotrequest?command=$env{'form.command'}",text=>$crumb_titles{$env{'form.command'}}});
               }
               
           }
     }      }
     &start_page($r,$title);      &start_page($r,$title,$brcrum);
   
     if ($env{'form.command'} eq 'showslots' && $vgr eq 'F') {      if ($env{'form.command'} eq 'manageresv') {
           my $crstype = &Apache::loncommon::course_type();
           &manage_reservations($r,$crstype);
       } elsif ($env{'form.command'} eq 'showresv') {
           &show_reservations($r,$env{'form.uname'},$env{'form.udom'});
       } elsif ($env{'form.command'} eq 'showslots' && $vgr eq 'F') {
  &show_table($r,$mgr);   &show_table($r,$mgr);
     } elsif ($env{'form.command'} eq 'remove_registration' && $mgr eq 'F') {      } elsif ($env{'form.command'} eq 'remove_registration' && $mgr eq 'F') {
  &remove_registration($r);   &remove_registration($r);
Line 1669  sub handler { Line 2458  sub handler {
     }      }
     &csv_upload_map($r);      &csv_upload_map($r);
  }   }
       } elsif ($env{'form.command'} eq 'slotlog' && $mgr eq 'F') {
           &show_reservations_log($r);
     } else {      } else {
  my $symb=&unescape($env{'form.symb'});   my $symb=&unescape($env{'form.symb'});
  if (!defined($symb)) {   if (!defined($symb)) {

Removed from v.1.88  
changed lines
  Added in v.1.101


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>