--- loncom/interface/lonnavmaps.pm 2002/11/14 21:36:23 1.106 +++ loncom/interface/lonnavmaps.pm 2002/11/15 20:12:11 1.110 @@ -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.110 2002/11/15 20:12:11 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -113,10 +113,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 +205,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 +526,6 @@ sub handler { } $r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n"); - #$r->print($curRes->awarded($part)); my $curMarkerBegin = ""; my $curMarkerEnd = ""; @@ -1284,6 +1283,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 +1330,8 @@ sub new { my $maxDepth = 0; # tracks max depth + # **1** + foreach my $pass (@iterations) { my $direction = $pass->[0]; my $valName = $pass->[1]; @@ -1351,12 +1357,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 +1370,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 +1392,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 +1441,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 +1462,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; @@ -1504,7 +1510,7 @@ sub next { # one level lower. Thus, this is the end of the branch, since there are no # more resources added to this level or above. my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; - if ($isEndOfBranch) { + if ($isEndOfBranch) { # **9** push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); } @@ -1998,10 +2004,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 +2029,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 +2302,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 +2316,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