--- loncom/interface/lonnavmaps.pm 2002/11/14 21:36:23 1.106
+++ loncom/interface/lonnavmaps.pm 2002/11/15 21:23:03 1.111
@@ -2,7 +2,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.106 2002/11/14 21:36:23 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.111 2002/11/15 21:23:03 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -83,8 +83,11 @@ sub handler {
return HTTP_NOT_ACCEPTABLE;
}
+ $r->print("
\n");
+ $r->print("Navigate Course Contents");
+
# Header
- $r->print(&Apache::loncommon::bodytag('Navigate Course Map','',
+ $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',
''));
$r->print('');
@@ -113,10 +116,22 @@ sub handler {
$condition = 1;
}
+ my $currenturl = $ENV{'form.postdata'};
+ $currenturl=~s/^http\:\/\///;
+ $currenturl=~s/^[^\/]+//;
+
+ # alreadyHere allows us to only open the maps necessary to view
+ # the current location once, while at the same time remembering
+ # the current location. Without that check, the user would never
+ # be able to close those maps; the user would close it, and the
+ # currenturl scan would re-open it.
+ my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .
+ "&alreadyHere=1";
+
if ($condition) {
- $r->print('Close All Folders');
+ $r->print("Close All Folders");
} else {
- $r->print('Open All Folders');
+ $r->print("Open All Folders");
}
$r->print('
');
@@ -193,18 +208,6 @@ sub handler {
my $topResource = $navmap->getById("0.0");
my $inlineTopLevelMaps = $topResource->src() =~ m|^/uploaded/.*default\.sequence$|;
- my $currenturl = $ENV{'form.postdata'};
- $currenturl=~s/^http\:\/\///;
- $currenturl=~s/^[^\/]+//;
-
- # alreadyHere allows us to only open the maps necessary to view
- # the current location once, while at the same time remembering
- # the current location. Without that check, the user would never
- # be able to close those maps; the user would close it, and the
- # currenturl scan would re-open it.
- my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .
- "&alreadyHere=1";
-
# Begin the HTML table
# four cols: resource + indent, chat+feedback, icon, text string
$r->print('' ."\n");
@@ -526,7 +529,6 @@ sub handler {
}
$r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n");
- #$r->print($curRes->awarded($part));
my $curMarkerBegin = "";
my $curMarkerEnd = "";
@@ -1284,6 +1286,11 @@ sub min {
if ($a < $b) { return $a; } else { return $b; }
}
+# In the CVS repository, documentation of this algorithm is included
+# in /doc/lonnavdocs, as a PDF and .tex source. Markers like **1**
+# will reference the same location in the text as the part of the
+# algorithm is running through.
+
sub new {
# magic invocation to create a class instance
my $proto = shift;
@@ -1326,6 +1333,8 @@ sub new {
my $maxDepth = 0; # tracks max depth
+ # **1**
+
foreach my $pass (@iterations) {
my $direction = $pass->[0];
my $valName = $pass->[1];
@@ -1351,12 +1360,12 @@ sub new {
my $nextResources = $curRes->$nextResourceMethod();
my $resourceCount = scalar(@{$nextResources});
- if ($resourceCount == 1) {
+ if ($resourceCount == 1) { # **3**
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999;
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current);
}
- if ($resourceCount > 1) {
+ if ($resourceCount > 1) { # **4**
foreach my $res (@{$nextResources}) {
my $current = $res->{DATA}->{$valName} || 999999999;
$res->{DATA}->{$valName} = min($current, $resultingVal + 1);
@@ -1364,7 +1373,7 @@ sub new {
}
}
- # Assign the final val
+ # Assign the final val (**2**)
if (ref($curRes) && $direction == BACKWARD()) {
my $finalDepth = min($curRes->{DATA}->{TOP_DOWN_VAL},
$curRes->{DATA}->{BOT_UP_VAL});
@@ -1386,7 +1395,7 @@ sub new {
push @{$self->{STACK}}, [];
}
- # Prime the recursion w/ the first resource
+ # Prime the recursion w/ the first resource **5**
push @{$self->{STACK}->[0]}, $self->{FIRST_RESOURCE};
$self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1;
@@ -1435,8 +1444,8 @@ sub next {
my $newDepth;
my $here;
while ( $i >= 0 && !$found ) {
- if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) {
- $here = pop @{$self->{STACK}->[$i]};
+ if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { # **6**
+ $here = pop @{$self->{STACK}->[$i]}; # **7**
$found = 1;
$newDepth = $i;
}
@@ -1456,7 +1465,7 @@ sub next {
# If this is not a resource, it must be an END_BRANCH marker we want
# to return directly.
- if (!ref($here)) {
+ if (!ref($here)) { # **8**
if ($here == END_BRANCH()) { # paranoia, in case of later extension
$self->{CURRENT_DEPTH}--;
return $here;
@@ -1503,8 +1512,11 @@ sub next {
# BC branch and gets to C, it will see F as the only next resource, but it's
# one level lower. Thus, this is the end of the branch, since there are no
# more resources added to this level or above.
+ # We don't do this if the examined resource is the finish resource,
+ # because the condition given above is true, but the "END_MAP" will
+ # take care of things and we should already be at depth 0.
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH};
- if ($isEndOfBranch) {
+ if ($isEndOfBranch && $here != $self->{FINISH_RESOURCE}) { # **9**
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH();
}
@@ -1998,10 +2010,7 @@ sub answerdate {
}
return $self->parmval("answerdate", $part);
}
-sub awarded {
- (my $self, my $part) = @_;
- return $self->parmval("awarded", $part);
-}
+sub awarded { my $self = shift; return $self->queryRestoreHash('awarded', shift); }
sub duedate {
(my $self, my $part) = @_;
return $self->parmval("duedate", $part);
@@ -2026,24 +2035,18 @@ sub tol {
(my $self, my $part) = @_;
return $self->parmval("tol", $part);
}
-sub tries {
- my $self = shift;
- my $part = shift;
- $part = '0' if (!defined($part));
-
- # Make sure return hash is loaded, should error check
- $self->getReturnHash();
-
- my $tries = $self->{RETURN_HASH}->{'resource.'.$part.'.tries'};
- if (!defined($tries)) {return '0';}
+sub tries {
+ my $self = shift;
+ my $tries = $self->queryRestoreHash('tries', shift);
+ if (!defined($tries)) { return '0';}
return $tries;
}
sub type {
(my $self, my $part) = @_;
return $self->parmval("type", $part);
}
-sub weight {
- (my $self, my $part) = @_;
+sub weight {
+ my $self = shift; my $part = shift;
return $self->parmval("weight", $part);
}
@@ -2305,14 +2308,9 @@ sub ATTEMPTED { return 16; }
sub getCompletionStatus {
my $self = shift;
- my $part = shift;
- $part = "0" if (!defined($part));
return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE});
- # Make sure return hash exists
- $self->getReturnHash();
-
- my $status = $self->{RETURN_HASH}->{'resource.'.$part.'.solved'};
+ my $status = $self->queryRestoreHash('solved', shift);
# Left as seperate if statements in case we ever do more with this
if ($status eq 'correct_by_student') {return $self->CORRECT;}
@@ -2324,6 +2322,18 @@ sub getCompletionStatus {
return $self->NOT_ATTEMPTED;
}
+sub queryRestoreHash {
+ my $self = shift;
+ my $hashentry = shift;
+ my $part = shift;
+ $part = "0" if (!defined($part));
+ return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE});
+
+ $self->getReturnHash();
+
+ return $self->{RETURN_HASH}->{'resource.'.$part.'.'.$hashentry};
+}
+
=pod
B