Diff for /loncom/interface/lonnavmaps.pm between versions 1.116 and 1.129.2.1

version 1.116, 2002/11/26 16:25:36 version 1.129.2.1, 2003/02/01 19:55:00
Line 48  use POSIX qw (floor strftime); Line 48  use POSIX qw (floor strftime);
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
       real_handler($r);
   }
   
   sub real_handler {
       my $r = shift;
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});      &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
   
Line 84  sub handler { Line 89  sub handler {
     }      }
   
     $r->print("<html><head>\n");      $r->print("<html><head>\n");
     $r->print("<title>Navigate Course Contents</title>");      $r->print("<title>Navigate Course Contents</title></head>");
   
     # Header      # Header
     $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',      $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',
                                           ''));                                            ''));
     $r->print('<script>window.focus();</script>');      $r->print('<script>window.focus();</script>');
   
       $r->rflush();
   
       # Now that we've displayed some stuff to the user, init the navmap
       $navmap->init();
   
     $r->print('<table border="0" cellpadding="2" cellspacing="0">');      $r->print('<table border="0" cellpadding="2" cellspacing="0">');
     my $date=localtime;      my $date=localtime;
     $r->print('<tr><td align="right" valign="bottom">Key:&nbsp;&nbsp;</td>');      $r->print('<tr><td align="right" valign="bottom">Key:&nbsp;&nbsp;</td>');
Line 116  sub handler { Line 126  sub handler {
         $condition = 1;          $condition = 1;
     }      }
   
     my $currenturl = $ENV{'form.postdata'};      # Determine where the "here" marker is and where the screen jumps to.
     $currenturl=~s/^http\:\/\///;      my $SYMB = 1; my $URL = 2; my $NOTHING = 3; # symbolic constants
     $currenturl=~s/^[^\/]+//;      my $hereType; # the type of marker, $SYMB, $URL, or $NOTHING
       my $here; # the actual URL or SYMB for the here marker
       my $jumpType; # The type of the thing we have a jump for, $SYMB or $URL
       my $jump; # the SYMB/URL of the resource we need to jump to
   
       if ( $ENV{'form.alreadyHere'} ) { # we came from a user's manipulation of the nav page
           # If this is a click on a folder or something, we want to preserve the "here"
           # from the querystring, and get the new "jump" marker
           $hereType = $ENV{'form.hereType'};
           $here = $ENV{'form.here'};
           $jumpType = $ENV{'form.jumpType'} || $NOTHING;
           $jump = $ENV{'form.jump'};
       } else { # the user is visiting the nav map from the remote
           # We're coming from the remote. We have either a url, a symb, or nothing,
           # and we need to figure out what.
           # Preference: Symb
           
           if ($ENV{'form.symb'}) {
               $hereType = $jumpType = $SYMB;
               $here = $jump = $ENV{'form.symb'};
           } elsif ($ENV{'form.postdata'}) {
               # couldn't find a symb, is there a URL?
               my $currenturl = $ENV{'form.postdata'};
               $currenturl=~s/^http\:\/\///;
               $currenturl=~s/^[^\/]+//;
   
               $hereType = $jumpType = $URL;
               $here = $jump = $currenturl;
           } else {
               # Nothing
               $hereType = $jumpType = $NOTHING;
           }
       }
   
       
     # alreadyHere allows us to only open the maps necessary to view      # alreadyHere allows us to only open the maps necessary to view
     # the current location once, while at the same time remembering      # the current location once, while at the same time remembering
     # the current location. Without that check, the user would never      # the current location. Without that check, the user would never
     # be able to close those maps; the user would close it, and the      # be able to close those maps; the user would close it, and the
     # currenturl scan would re-open it.      # currenturl scan would re-open it.
     my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .      my $queryAdd = "&alreadyHere=1";
         "&alreadyHere=1";  
   
     if ($condition) {      if ($condition) {
         $r->print("<a href=\"navmaps?condition=0&filter=&$queryAdd\">Close All Folders</a>");          $r->print("<a href=\"navmaps?condition=0&filter=&$queryAdd" .
                     "&hereType=$hereType&here=" . Apache::lonnet::escape($here) .
                     "\">Close All Folders</a>");
     } else {      } else {
         $r->print("<a href=\"navmaps?condition=1&filter=&$queryAdd\">Open All Folders</a>");          $r->print("<a href=\"navmaps?condition=1&filter=&$queryAdd" .
                     "&hereType=$hereType&here=" . Apache::lonnet::escape($here) . 
                     "\">Open All Folders</a>");
     }      }
   
     $r->print('<br>&nbsp;');      $r->print('<br>&nbsp;');
     $r->rflush();      $r->rflush();
   
     # Now that we've displayed some stuff to the user, init the navmap  
     $navmap->init();  
   
     # Check that it's defined      # Check that it's defined
     if (!($navmap->courseMapDefined())) {      if (!($navmap->courseMapDefined())) {
         $r->print('<font size="+2" color="red">Coursemap undefined.</font>' .          $r->print('<font size="+2" color="red">Coursemap undefined.</font>' .
Line 219  sub handler { Line 262  sub handler {
     # Here's a simple example of the iterator.      # Here's a simple example of the iterator.
     # Preprocess the map: Look for current URL, force inlined maps to display      # Preprocess the map: Look for current URL, force inlined maps to display
   
     my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, 1);      my $mapIterator = $navmap->getIterator(undef, undef, undef, 1);
     my $found = 0;      my $found = 0;
     my $depth = 1;      my $depth = 1;
     my $currentUrlIndex = 0; # keeps track of when the current resource is found,      my $currentJumpIndex = 0; # keeps track of when the current resource is found,
                              # so we can back up a few and put the anchor above the                               # so we can back up a few and put the anchor above the
                              # current resource                               # current resource
     my $currentUrlDelta = 5; # change this to change how many resources are displayed      my $currentJumpDelta = 2; # change this to change how many resources are displayed
                              # before the current resource when using #current                               # before the current resource when using #current
     $mapIterator->next(); # discard the first BEGIN_MAP      $mapIterator->next(); # discard the first BEGIN_MAP
     my $curRes = $mapIterator->next();      my $curRes = $mapIterator->next();
     my $counter = 0;      my $counter = 0;
       my $foundJump = ($jumpType == $NOTHING); # look for jump point if we have one
       my $looped = 0; 
   
     # We only need to do this if we need to open the maps to show the      # We only need to do this if we need to open the maps to show the
     # current position      # current position. This will change the counter so we can't count
       # for the jump marker with this loop.
     while ($depth > 0 && !$ENV{'form.alreadyHere'}) {      while ($depth > 0 && !$ENV{'form.alreadyHere'}) {
         if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }          if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
         if ($curRes == $mapIterator->END_MAP()) { $depth--; }          if ($curRes == $mapIterator->END_MAP()) { $depth--; }
   
         if (ref($curRes)) { $counter++; }          if (ref($curRes) && !$ENV{'form.alreadyHere'} && 
               ($hereType == $SYMB && $curRes->symb() eq $here) ||
         my $mapStack = $mapIterator->getStack();              (ref($curRes) && $hereType == $URL && $curRes->src() eq $here)) {
         if ($currenturl && !$ENV{'form.alreadyHere'} && ref($curRes) &&               my $mapStack = $mapIterator->getStack();
             $curRes->src() eq $currenturl) {  
             # If this is the correct resource, be sure to   
             # show it by making sure the containing maps  
             # are open.  
   
             # This is why we have to use the main iterator instead of the  
             # potentially faster DFS: The count has to be the same, so  
             # the order has to be the same, which DFS won't give us.  
             $currentUrlIndex = $counter;  
                           
             # Ensure the parent maps are open              # Ensure the parent maps are open
             for my $map (@{$mapStack}) {              for my $map (@{$mapStack}) {
Line 261  sub handler { Line 298  sub handler {
             }              }
             $ENV{'form.alreadyHere'} = 1;              $ENV{'form.alreadyHere'} = 1;
         }          }
                       $looped = 1;
   
           $curRes = $mapIterator->next();
       }            
       
       $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, 0);
       $depth = 1;
       $mapIterator->next();
       $curRes = $mapIterator->next();
   
       while ($depth > 0 && !$foundJump) {
           if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
           if ($curRes == $mapIterator->END_MAP()) { $depth--; }
           if (ref($curRes)) { $counter++; }
   
           if (ref($curRes) && 
               (($jumpType == $SYMB && $curRes->symb() eq $jump) ||
               ($jumpType == $URL && $curRes->src() eq $jump))) {
               # If this is the correct resource, be sure to 
               # show it by making sure the containing maps
               # are open.
   
               # This is why we have to use the main iterator instead of the
               # potentially faster DFS: The count has to be the same, so
               # the order has to be the same, which DFS won't give us.
               $currentJumpIndex = $counter;
               $foundJump = 1;
           }
   
         $curRes = $mapIterator->next();          $curRes = $mapIterator->next();
     }      }
           
Line 273  sub handler { Line 338  sub handler {
     my $now = time();      my $now = time();
     my $in24Hours = $now + 24 * 60 * 60;      my $in24Hours = $now + 24 * 60 * 60;
     my $displayedHereMarker = 0;      my $displayedHereMarker = 0;
       my $displayedJumpMarker = 0;
           
     # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}"      # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}"
     # code in iterator->next), so ignore the first one      # code in iterator->next), so ignore the first one
Line 287  sub handler { Line 353  sub handler {
   
     $counter = 0;      $counter = 0;
   
     # Print the 'current' anchor here if it would fall off the top  
     if ($currentUrlIndex - $currentUrlDelta < 0) {  
         $r->print('<a name="current" />');  
     }  
   
     while ($depth > 0) {      while ($depth > 0) {
         if ($curRes == $mapIterator->BEGIN_MAP() ||          if ($curRes == $mapIterator->BEGIN_MAP() ||
             $curRes == $mapIterator->BEGIN_BRANCH()) {              $curRes == $mapIterator->BEGIN_BRANCH()) {
Line 427  sub handler { Line 488  sub handler {
                     '"';                      '"';
   
                 my $title = $curRes->compTitle();                  my $title = $curRes->compTitle();
                   if ($src=~/^\/uploaded\//) {
       $nonLinkedText=$title;
                       $title='';
                   }
                 my $partLabel = "";                  my $partLabel = "";
                 my $newBranchText = "";                  my $newBranchText = "";
   
Line 461  sub handler { Line 526  sub handler {
                     $linkopen .= ($nowOpen xor $condition) ?                       $linkopen .= ($nowOpen xor $condition) ? 
                         addToFilter(\%filterHash, $mapId) :                          addToFilter(\%filterHash, $mapId) :
                         removeFromFilter(\%filterHash, $mapId);                          removeFromFilter(\%filterHash, $mapId);
                     $linkopen .= "&condition=$condition&$queryAdd\">";                      $linkopen .= "&condition=$condition&$queryAdd" . 
                           "&hereType=$hereType&here=" . 
                           Apache::lonnet::escape($here) . "&jumpType=$SYMB&" .
                           "jump=" . Apache::lonnet::escape($curRes->symb()) ."\">";
                     $linkclose = "</a>";                      $linkclose = "</a>";
   
                 }                  }
Line 492  sub handler { Line 560  sub handler {
                 $r->print("  <tr bgcolor=\"$backgroundColor\"><td align=\"left\" valign=\"center\">\n");                  $r->print("  <tr bgcolor=\"$backgroundColor\"><td align=\"left\" valign=\"center\">\n");
   
                 # Print the anchor if necessary                  # Print the anchor if necessary
                 if ($counter == $currentUrlIndex - $currentUrlDelta) {                  if ($counter == $currentJumpIndex - $currentJumpDelta ) {
                     $r->print('<a name="current" />');                      $r->print('<a name="curloc" />');
                       $displayedJumpMarker = 1;
                 }                  }
   
                 # print indentation                  # print indentation
Line 507  sub handler { Line 576  sub handler {
                 my $curMarkerEnd = "";                  my $curMarkerEnd = "";
   
                 # Is this the current resource?                  # Is this the current resource?
                 if ($curRes->src() eq $currenturl && !$displayedHereMarker) {                  if (!$displayedHereMarker && 
                     $curMarkerBegin = '<a name="curloc" /><font color="red" size="+2">&gt; </font>';                      (($hereType == $SYMB && $curRes->symb eq $here) ||
                       ($hereType == $URL && $curRes->src eq $here))) {
                       $curMarkerBegin = '<font color="red" size="+2">&gt; </font>';
                     $curMarkerEnd = '<font color="red" size="+2"> &lt;</font>';                      $curMarkerEnd = '<font color="red" size="+2"> &lt;</font>';
                     $displayedHereMarker = 1;                      $displayedHereMarker = 1;
                 }                  }
Line 523  sub handler { Line 594  sub handler {
   
                 $r->print("  $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText");                  $r->print("  $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText");
   
                 if ($curRes->{RESOURCE_ERROR}) {                  #if ($curRes->{RESOURCE_ERROR}) {
                     $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",                  #    $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",
                                               '<font size="-1">Host down</font>'));                  #                              '<font size="-1">Host down</font>'));
                     }                  #    }
   
                 $r->print("</td>\n");                  $r->print("</td>\n");
   
                 # SECOND COL: Is there text, feedback, errors??                  # SECOND COL: Is there text, feedback, errors??
                 my $discussionHTML = ""; my $feedbackHTML = "";                  my $discussionHTML = ""; my $feedbackHTML = ""; my $errorHTML = "";
   
                 if ($curRes->hasDiscussion()) {                  if ($curRes->hasDiscussion()) {
                     $discussionHTML = $linkopen .                      $discussionHTML = $linkopen .
Line 551  sub handler { Line 622  sub handler {
                     }                      }
                 }                  }
   
                 $r->print("<td width=\"75\" align=\"left\" valign=\"center\">$discussionHTML$feedbackHTML&nbsp;</td>");                  if ($curRes->getErrors()) {
                       my $errors = $curRes->getErrors();
                       foreach (split(/,/, $errors)) {
                           if ($_) {
                               $errorHTML .= '&nbsp;<a href="/adm/email?display='
                                   . &Apache::lonnet::escape($_) . '">'
                                   . '<img src="/adm/lonMisc/bomb.gif" '
                                   . 'border="0" /></a>';
                           }
                       }
                   }
   
                   $r->print("<td width=\"75\" align=\"left\" valign=\"center\">$discussionHTML$feedbackHTML$errorHTML&nbsp;</td>");
   
                 # Is this the first displayed part of a multi-part problem                  # Is this the first displayed part of a multi-part problem
                 # that has not been condensed, so we should suppress these two                  # that has not been condensed, so we should suppress these two
Line 596  sub handler { Line 679  sub handler {
         $curRes = $mapIterator->next();          $curRes = $mapIterator->next();
     }      }
   
     $r->print("</table></body></html>");      $r->print("</table>");
   
       # Print out the part that jumps to #curloc if it exists
       if ($displayedJumpMarker) {
           $r->print('<script>location += "#curloc";</script>');
       }
   
     $navmap->untieHashes();      $navmap->untieHashes();
   
       $r->print("</body></html>");
   
     return OK;      return OK;
 }  }
   
Line 909  sub new { Line 999  sub new {
         return undef;          return undef;
     }      }
   
     # Now copy the hashes for speed (?)      $self->{HASH_TIED} = 1;
     my %realnav; my %realparm;      $self->{NAV_HASH} = \%navmaphash;
     foreach (%navmaphash) { $realnav{$_} = $navmaphash{$_}; }      $self->{PARM_HASH} = \%parmhash;
     foreach (%parmhash) { $realparm{$_} = $navmaphash{$_}; }  
     $self->{NAV_HASH} = \%realnav;  
     $self->{PARM_HASH} = \%realparm;  
   
     bless($self);      bless($self);
     $self->untieHashes();  
                   
     return $self;      return $self;
 }  }
Line 988  sub init { Line 1074  sub init {
         my %emailstatus = &Apache::lonnet::dump('email_status');          my %emailstatus = &Apache::lonnet::dump('email_status');
         my $logoutTime = $emailstatus{'logout'};          my $logoutTime = $emailstatus{'logout'};
         my $courseLeaveTime = $emailstatus{'logout_'.$ENV{'request.course.id'}};          my $courseLeaveTime = $emailstatus{'logout_'.$ENV{'request.course.id'}};
         $self->{LAST_CHECK} = ($courseLeaveTime > $logoutTime ?          $self->{LAST_CHECK} = ($courseLeaveTime < $logoutTime ?
                                $courseLeaveTime : $logoutTime);                                 $courseLeaveTime : $logoutTime);
         my %discussiontime = &Apache::lonnet::dump('discussiontimes',           my %discussiontime = &Apache::lonnet::dump('discussiontimes', 
                                                    $cdom, $cnum);                                                     $cdom, $cnum);
Line 1069  sub DESTROY { Line 1155  sub DESTROY {
     $self->untieHashes();      $self->untieHashes();
 }  }
   
 # Private function: Does the given resource (as a symb string) have  # Private method: Does the given resource (as a symb string) have
 # current discussion? Returns 0 if chat/mail data not extracted.  # current discussion? Returns 0 if chat/mail data not extracted.
 sub hasDiscussion {  sub hasDiscussion {
     my $self = shift;      my $self = shift;
     my $symb = shift;      my $symb = shift;
     if (!defined($self->{DISCUSSION_TIME})) { return 0; }      if (!defined($self->{DISCUSSION_TIME})) { return 0; }
   
       #return defined($self->{DISCUSSION_TIME}->{$symb});
     return $self->{DISCUSSION_TIME}->{$symb} >      return $self->{DISCUSSION_TIME}->{$symb} >
            $self->{LAST_CHECK};             $self->{LAST_CHECK};
 }  }
   
 # Private function: Does the given resource (as a symb string) have  # Private method: Does the given resource (as a symb string) have
 # current feedback? Returns the string in the feedback hash, which  # current feedback? Returns the string in the feedback hash, which
 # will be false if it does not exist.  # will be false if it does not exist.
 sub getFeedback {   sub getFeedback { 
Line 1092  sub getFeedback { Line 1179  sub getFeedback {
     return $self->{FEEDBACK}->{$symb};      return $self->{FEEDBACK}->{$symb};
 }  }
   
   # Private method: Get the errors for that resource (by source).
   sub getErrors { 
       my $self = shift;
       my $src = shift;
       
       if (!defined($self->{ERROR_MSG})) { return ""; }
       return $self->{ERROR_MSG}->{$src};
   }
   
 =pod  =pod
   
 =item * B<getById>(id): Based on the ID of the resource (1.1, 3.2, etc.), get a resource object for that resource. This method, or other methods that use it (as in the resource object) is the only proper way to obtain a resource object.  =item * B<getById>(id): Based on the ID of the resource (1.1, 3.2, etc.), get a resource object for that resource. This method, or other methods that use it (as in the resource object) is the only proper way to obtain a resource object.
Line 1384  sub new { Line 1480  sub new {
                   
             if (ref($curRes)) {              if (ref($curRes)) {
                 # If there's only one resource, this will save it                  # If there's only one resource, this will save it
                 if($direction == FORWARD) { $resource = $curRes; $resourceCount++; }                  # we have to filter empty resources from consideration here,
                   # or even "empty", redirecting maps have two (start & finish)
                   # or three (start, finish, plus redirector)
                   if($direction == FORWARD && $curRes->src()) { 
                       $resource = $curRes; $resourceCount++; 
                   }
                 my $resultingVal = $curRes->{DATA}->{$valName};                  my $resultingVal = $curRes->{DATA}->{$valName};
                 my $nextResources = $curRes->$nextResourceMethod();                  my $nextResources = $curRes->$nextResourceMethod();
                 my $nextCount = scalar(@{$nextResources});                  my $nextCount = scalar(@{$nextResources});
Line 1576  sub next { Line 1677  sub next {
     }      }
   
     # If this is a blank resource, don't actually return it.      # If this is a blank resource, don't actually return it.
     if (!$self->{HERE}->src()) {      # Should you ever find you need it, make sure to add an option to the code
       #  that you can use; other things depend on this behavior.
       if (!$self->{HERE}->src() || !$self->{HERE}->browsePriv()) {
         return $self->next();          return $self->next();
     }      }
   
Line 1626  package Apache::lonnavmaps::DFSiterator; Line 1729  package Apache::lonnavmaps::DFSiterator;
 #  but this might as well be left seperate, since it is possible some other  #  but this might as well be left seperate, since it is possible some other
 #  use might be found for it. - Jeremy  #  use might be found for it. - Jeremy
   
   # Unlike the main iterator, this DOES return all resources, even blank ones.
   #  The main iterator needs them to correctly preprocess the map.
   
 sub BEGIN_MAP { return 1; }    # begining of a new map  sub BEGIN_MAP { return 1; }    # begining of a new map
 sub END_MAP { return 2; }      # end of the map  sub END_MAP { return 2; }      # end of the map
 sub FORWARD { return 1; }      # go forward  sub FORWARD { return 1; }      # go forward
Line 1763  sub next { Line 1869  sub next {
                                              $self->{CONDITION}, $self->{DIRECTION});                                               $self->{CONDITION}, $self->{DIRECTION});
     }      }
   
     # If this is a blank resource, ignore it.  
     if (!$self->{HERE}->src()) {  
         return $self->next();  
     }  
       
     return $self->{HERE};      return $self->{HERE};
 }  }
   
Line 2152  sub hasDiscussion { Line 2253  sub hasDiscussion {
   
 sub getFeedback {  sub getFeedback {
     my $self = shift;      my $self = shift;
     return $self->{NAV_MAP}->getFeedback($self->src());      my $source = $self->src();
       if ($source =~ /^\/res\//) { $source = substr $source, 5; }
       return $self->{NAV_MAP}->getFeedback($source);
   }
   
   sub getErrors {
       my $self = shift;
       my $source = $self->src();
       if ($source =~ /^\/res\//) { $source = substr $source, 5; }
       return $self->{NAV_MAP}->getErrors($source);
 }  }
   
 =pod  =pod
Line 2508  sub getNext { Line 2618  sub getNext {
         my $next = $choice->goesto();          my $next = $choice->goesto();
         $next = $self->{NAV_MAP}->getById($next);          $next = $self->{NAV_MAP}->getById($next);
   
         # Don't remember it if the student doesn't have browse priviledges          push @branches, $next;
         # future note: this may properly belong in the client of the resource  
         my $browsePriv = $self->{BROWSE_PRIV};  
         if (!defined($browsePriv)) {  
             $browsePriv = &Apache::lonnet::allowed('bre', $self->src);  
             $self->{BROWSE_PRIV} = $browsePriv;  
         }  
         if (!($browsePriv ne '2' && $browsePriv ne 'F')) {  
             push @branches, $next;  
         }  
     }      }
     return \@branches;      return \@branches;
 }  }
Line 2531  sub getPrevious { Line 2632  sub getPrevious {
         my $prev = $choice->comesfrom();          my $prev = $choice->comesfrom();
         $prev = $self->{NAV_MAP}->getById($prev);          $prev = $self->{NAV_MAP}->getById($prev);
   
         # Don't remember it if the student doesn't have browse priviledges          push @branches, $prev;
         # future note: this may properly belong in the client of the resource  
         my $browsePriv = $self->{BROWSE_PRIV};  
         if (!defined($browsePriv)) {  
             $browsePriv = &Apache::lonnet::allowed('bre', $self->src);  
             $self->{BROWSE_PRIV} = $browsePriv;  
         }  
         if (!($browsePriv ne '2' && $browsePriv ne 'F')) {  
             push @branches, $prev;  
         }  
     }      }
     return \@branches;      return \@branches;
 }  }
   
   sub browsePriv {
       my $self = shift;
       if (defined($self->{BROWSE_PRIV})) {
           return $self->{BROWSE_PRIV};
       }
   
       $self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre', $self->src());
   }
   
 =pod  =pod
   
 =back  =back

Removed from v.1.116  
changed lines
  Added in v.1.129.2.1


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