version 1.117, 2002/11/26 17:01:29
|
version 1.123, 2003/01/10 17:46:46
|
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','', |
Line 116 sub handler {
|
Line 121 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> '); |
$r->print('<br> '); |
Line 219 sub handler {
|
Line 260 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 296 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 336 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 351 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 486 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 524 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 558 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 574 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">> </font>'; |
(($hereType == $SYMB && $curRes->symb eq $here) || |
|
($hereType == $URL && $curRes->src eq $here))) { |
|
$curMarkerBegin = '<font color="red" size="+2">> </font>'; |
$curMarkerEnd = '<font color="red" size="+2"> <</font>'; |
$curMarkerEnd = '<font color="red" size="+2"> <</font>'; |
$displayedHereMarker = 1; |
$displayedHereMarker = 1; |
} |
} |
Line 523 sub handler {
|
Line 592 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"); |
|
|
Line 596 sub handler {
|
Line 665 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>'); |
|
} |
|
|
|
$r->print("</body></html>"); |
|
|
$navmap->untieHashes(); |
$navmap->untieHashes(); |
|
|
Line 909 sub new {
|
Line 985 sub new {
|
return undef; |
return undef; |
} |
} |
|
|
# Now copy the hashes for speed (?) |
$self->{NAV_HASH} = \%navmaphash; |
my %realnav; my %realparm; |
$self->{PARM_HASH} = \%parmhash; |
foreach (%navmaphash) { $realnav{$_} = $navmaphash{$_}; } |
|
foreach (%parmhash) { $realparm{$_} = $navmaphash{$_}; } |
|
$self->{NAV_HASH} = \%realnav; |
|
$self->{PARM_HASH} = \%realparm; |
|
|
|
bless($self); |
bless($self); |
$self->untieHashes(); |
$self->untieHashes(); |