version 1.106, 2002/11/14 21:36:23
|
version 1.110, 2002/11/15 20:12:11
|
Line 113 sub handler {
|
Line 113 sub handler {
|
$condition = 1; |
$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) { |
if ($condition) { |
$r->print('<a href="navmaps?condition=0&filter=">Close All Folders</a>'); |
$r->print("<a href=\"navmaps?condition=0&filter=&$queryAdd\">Close All Folders</a>"); |
} else { |
} else { |
$r->print('<a href="navmaps?condition=1&filter=">Open All Folders</a>'); |
$r->print("<a href=\"navmaps?condition=1&filter=&$queryAdd\">Open All Folders</a>"); |
} |
} |
|
|
$r->print('<br> '); |
$r->print('<br> '); |
Line 193 sub handler {
|
Line 205 sub handler {
|
my $topResource = $navmap->getById("0.0"); |
my $topResource = $navmap->getById("0.0"); |
my $inlineTopLevelMaps = $topResource->src() =~ m|^/uploaded/.*default\.sequence$|; |
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 |
# Begin the HTML table |
# four cols: resource + indent, chat+feedback, icon, text string |
# four cols: resource + indent, chat+feedback, icon, text string |
$r->print('<table cellspacing="0" cellpadding="3" border="0" bgcolor="#FFFFFF">' ."\n"); |
$r->print('<table cellspacing="0" cellpadding="3" border="0" bgcolor="#FFFFFF">' ."\n"); |
Line 526 sub handler {
|
Line 526 sub handler {
|
} |
} |
|
|
$r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n"); |
$r->print(" ${newBranchText}${linkopen}$icon${linkclose}\n"); |
#$r->print($curRes->awarded($part)); |
|
|
|
my $curMarkerBegin = ""; |
my $curMarkerBegin = ""; |
my $curMarkerEnd = ""; |
my $curMarkerEnd = ""; |
Line 1284 sub min {
|
Line 1283 sub min {
|
if ($a < $b) { return $a; } else { return $b; } |
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 { |
sub new { |
# magic invocation to create a class instance |
# magic invocation to create a class instance |
my $proto = shift; |
my $proto = shift; |
Line 1326 sub new {
|
Line 1330 sub new {
|
|
|
my $maxDepth = 0; # tracks max depth |
my $maxDepth = 0; # tracks max depth |
|
|
|
# **1** |
|
|
foreach my $pass (@iterations) { |
foreach my $pass (@iterations) { |
my $direction = $pass->[0]; |
my $direction = $pass->[0]; |
my $valName = $pass->[1]; |
my $valName = $pass->[1]; |
Line 1351 sub new {
|
Line 1357 sub new {
|
my $nextResources = $curRes->$nextResourceMethod(); |
my $nextResources = $curRes->$nextResourceMethod(); |
my $resourceCount = scalar(@{$nextResources}); |
my $resourceCount = scalar(@{$nextResources}); |
|
|
if ($resourceCount == 1) { |
if ($resourceCount == 1) { # **3** |
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
} |
} |
|
|
if ($resourceCount > 1) { |
if ($resourceCount > 1) { # **4** |
foreach my $res (@{$nextResources}) { |
foreach my $res (@{$nextResources}) { |
my $current = $res->{DATA}->{$valName} || 999999999; |
my $current = $res->{DATA}->{$valName} || 999999999; |
$res->{DATA}->{$valName} = min($current, $resultingVal + 1); |
$res->{DATA}->{$valName} = min($current, $resultingVal + 1); |
Line 1364 sub new {
|
Line 1370 sub new {
|
} |
} |
} |
} |
|
|
# Assign the final val |
# Assign the final val (**2**) |
if (ref($curRes) && $direction == BACKWARD()) { |
if (ref($curRes) && $direction == BACKWARD()) { |
my $finalDepth = min($curRes->{DATA}->{TOP_DOWN_VAL}, |
my $finalDepth = min($curRes->{DATA}->{TOP_DOWN_VAL}, |
$curRes->{DATA}->{BOT_UP_VAL}); |
$curRes->{DATA}->{BOT_UP_VAL}); |
Line 1386 sub new {
|
Line 1392 sub new {
|
push @{$self->{STACK}}, []; |
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}; |
push @{$self->{STACK}->[0]}, $self->{FIRST_RESOURCE}; |
$self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1; |
$self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1; |
|
|
Line 1435 sub next {
|
Line 1441 sub next {
|
my $newDepth; |
my $newDepth; |
my $here; |
my $here; |
while ( $i >= 0 && !$found ) { |
while ( $i >= 0 && !$found ) { |
if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { |
if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { # **6** |
$here = pop @{$self->{STACK}->[$i]}; |
$here = pop @{$self->{STACK}->[$i]}; # **7** |
$found = 1; |
$found = 1; |
$newDepth = $i; |
$newDepth = $i; |
} |
} |
Line 1456 sub next {
|
Line 1462 sub next {
|
|
|
# If this is not a resource, it must be an END_BRANCH marker we want |
# If this is not a resource, it must be an END_BRANCH marker we want |
# to return directly. |
# to return directly. |
if (!ref($here)) { |
if (!ref($here)) { # **8** |
if ($here == END_BRANCH()) { # paranoia, in case of later extension |
if ($here == END_BRANCH()) { # paranoia, in case of later extension |
$self->{CURRENT_DEPTH}--; |
$self->{CURRENT_DEPTH}--; |
return $here; |
return $here; |
Line 1504 sub next {
|
Line 1510 sub next {
|
# one level lower. Thus, this is the end of the branch, since there are no |
# one level lower. Thus, this is the end of the branch, since there are no |
# more resources added to this level or above. |
# more resources added to this level or above. |
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; |
my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; |
if ($isEndOfBranch) { |
if ($isEndOfBranch) { # **9** |
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); |
push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); |
} |
} |
|
|
Line 1998 sub answerdate {
|
Line 2004 sub answerdate {
|
} |
} |
return $self->parmval("answerdate", $part); |
return $self->parmval("answerdate", $part); |
} |
} |
sub awarded { |
sub awarded { my $self = shift; return $self->queryRestoreHash('awarded', shift); } |
(my $self, my $part) = @_; |
|
return $self->parmval("awarded", $part); |
|
} |
|
sub duedate { |
sub duedate { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
return $self->parmval("duedate", $part); |
return $self->parmval("duedate", $part); |
Line 2026 sub tol {
|
Line 2029 sub tol {
|
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
return $self->parmval("tol", $part); |
return $self->parmval("tol", $part); |
} |
} |
sub tries { |
sub tries { |
my $self = shift; |
my $self = shift; |
my $part = shift; |
my $tries = $self->queryRestoreHash('tries', shift); |
$part = '0' if (!defined($part)); |
if (!defined($tries)) { return '0';} |
|
|
# Make sure return hash is loaded, should error check |
|
$self->getReturnHash(); |
|
|
|
my $tries = $self->{RETURN_HASH}->{'resource.'.$part.'.tries'}; |
|
if (!defined($tries)) {return '0';} |
|
return $tries; |
return $tries; |
} |
} |
sub type { |
sub type { |
(my $self, my $part) = @_; |
(my $self, my $part) = @_; |
return $self->parmval("type", $part); |
return $self->parmval("type", $part); |
} |
} |
sub weight { |
sub weight { |
(my $self, my $part) = @_; |
my $self = shift; my $part = shift; |
return $self->parmval("weight", $part); |
return $self->parmval("weight", $part); |
} |
} |
|
|
Line 2305 sub ATTEMPTED { return 16; }
|
Line 2302 sub ATTEMPTED { return 16; }
|
|
|
sub getCompletionStatus { |
sub getCompletionStatus { |
my $self = shift; |
my $self = shift; |
my $part = shift; |
|
$part = "0" if (!defined($part)); |
|
return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE}); |
return $self->NETWORK_FAILURE if ($self->{NAV_MAP}->{NETWORK_FAILURE}); |
|
|
# Make sure return hash exists |
my $status = $self->queryRestoreHash('solved', shift); |
$self->getReturnHash(); |
|
|
|
my $status = $self->{RETURN_HASH}->{'resource.'.$part.'.solved'}; |
|
|
|
# Left as seperate if statements in case we ever do more with this |
# Left as seperate if statements in case we ever do more with this |
if ($status eq 'correct_by_student') {return $self->CORRECT;} |
if ($status eq 'correct_by_student') {return $self->CORRECT;} |
Line 2324 sub getCompletionStatus {
|
Line 2316 sub getCompletionStatus {
|
return $self->NOT_ATTEMPTED; |
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 |
=pod |
|
|
B<Composite Status> |
B<Composite Status> |