--- rat/lonpageflip.pm 2005/04/07 06:56:27 1.53
+++ rat/lonpageflip.pm 2006/05/08 22:14:15 1.68
@@ -2,7 +2,7 @@
#
# Page flip handler
#
-# $Id: lonpageflip.pm,v 1.53 2005/04/07 06:56:27 albertel Exp $
+# $Id: lonpageflip.pm,v 1.68 2006/05/08 22:14:15 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -30,6 +30,7 @@
package Apache::lonpageflip;
use strict;
+use LONCAPA;
use Apache::Constants qw(:common :http REDIRECT);
use Apache::lonnet;
use HTML::TokeParser;
@@ -46,6 +47,7 @@ sub cleanup {
&Apache::lonnet::logthis('Failed cleanup pageflip: hash');
}
}
+ return OK;
}
sub addrid {
@@ -73,10 +75,14 @@ sub fullmove {
sub hash_src {
my ($id)=@_;
+ my ($mapid,$resid)=split(/\./,$id);
+ my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},
+ $resid,$hash{'src_'.$id});
if ($hash{'encrypted_'.$id}) {
- return &Apache::lonenc::encrypted($hash{'src_'.$id});
+ return (&Apache::lonenc::encrypted($hash{'src_'.$id}),
+ &Apache::lonenc::encrypted($symb));
}
- return $hash{'src_'.$id};
+ return ($hash{'src_'.$id},$symb);
}
sub move {
@@ -92,25 +98,27 @@ sub move {
while ($hash{'type_'.$rid} eq 'finish') {
$rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
}
- map {
- my $thiscond=
- &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
- if ($thiscond>=$mincond) {
+ foreach my $id (split(/\,/,$hash{'to_'.$rid})) {
+ my $condition= $hash{'conditions_'.$hash{'goesto_'.$id}};
+ my $rescond = &Apache::lonnet::docondval($condition);
+ my $linkcond = &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$id}});
+ my $thiscond = ($rescond<$linkcond)?$rescond:$linkcond;
+ if ($thiscond>=$mincond) {
if ($posnext) {
- $posnext.=','.$_.':'.$thiscond;
+ $posnext.=','.$id.':'.$thiscond;
} else {
- $posnext=$_.':'.$thiscond;
+ $posnext=$id.':'.$thiscond;
}
if ($thiscond>$mincond) { $mincond=$thiscond; }
}
- } split(/\,/,$hash{'to_'.$rid});
- map {
- my ($linkid,$condval)=split(/\:/,$_);
+ }
+ foreach my $id (split(/\,/,$posnext)) {
+ my ($linkid,$condval)=split(/\:/,$id);
if ($condval>=$mincond) {
$next=&addrid($next,$hash{'goesto_'.$linkid},
$hash{'condid_'.$hash{'undercond_'.$linkid}});
}
- } split(/\,/,$posnext);
+ }
if ($hash{'is_map_'.$next}) {
# This jumps to the beginning of a new map (going down level)
if (
@@ -126,31 +134,33 @@ sub move {
((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {
# This comes up from a map (coming up one level);
$mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
- }
+ }
} elsif ($direction eq 'back') {
# ------------------------------------------------------------------- Backwards
while ($hash{'type_'.$rid} eq 'start') {
$rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
}
- map {
- my $thiscond=
- &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
- if ($thiscond>=$mincond) {
- if ($posnext) {
- $posnext.=','.$_.':'.$thiscond;
- } else {
- $posnext=$_.':'.$thiscond;
- }
- if ($thiscond>$mincond) { $mincond=$thiscond; }
- }
- } split(/\,/,$hash{'from_'.$rid});
- map {
- my ($linkid,$condval)=split(/\:/,$_);
- if ($condval>=$mincond) {
- $next=&addrid($next,$hash{'comesfrom_'.$linkid},
- $hash{'condid_'.$hash{'undercond_'.$linkid}});
- }
- } split(/\,/,$posnext);
+ foreach my $id (split(/\,/,$hash{'from_'.$rid})) {
+ my $condition= $hash{'conditions_'.$hash{'comesfrom_'.$id}};
+ my $rescond = &Apache::lonnet::docondval($condition);
+ my $linkcond = &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$id}});
+ my $thiscond = ($rescond<$linkcond)?$rescond:$linkcond;
+ if ($thiscond>=$mincond) {
+ if ($posnext) {
+ $posnext.=','.$id.':'.$thiscond;
+ } else {
+ $posnext=$id.':'.$thiscond;
+ }
+ if ($thiscond>$mincond) { $mincond=$thiscond; }
+ }
+ }
+ foreach my $id (split(/\,/,$posnext)) {
+ my ($linkid,$condval)=split(/\:/,$id);
+ if ($condval>=$mincond) {
+ $next=&addrid($next,$hash{'comesfrom_'.$linkid},
+ $hash{'condid_'.$hash{'undercond_'.$linkid}});
+ }
+ }
if ($hash{'is_map_'.$next}) {
# This jumps to the end of a new map (going down one level)
if (
@@ -171,6 +181,25 @@ sub move {
return ($next,$mapurl);
}
+sub navlaunch {
+ my ($r)=@_;
+ &Apache::loncommon::content_type($r,'text/html');
+ &Apache::loncommon::no_cache($r);
+ $r->send_http_header;
+ $r->print(&Apache::loncommon::start_page('Launched'));
+ $r->print(<
Collapse external navigation window
+ENDNAV + $r->print(&Apache::loncommon::end_page()); +} # ================================================================ Main Handler sub handler { @@ -187,7 +216,7 @@ sub handler { my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my $redirecturl=''; + my ($redirecturl,$redirectsymb); my $next=''; my @possibilities=(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']); @@ -199,7 +228,20 @@ sub handler { $currenturl=&Apache::lonenc::unencrypted($currenturl); } $currenturl=~s/\.\d+\.(\w+)$/\.$1/; - if ($direction eq 'return') { + if ($direction eq 'firstres') { + my $furl; + if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db', + &GDBM_READER(),0640)) { + $furl=$bighash{'first_url'}; + untie(%bighash); + } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.$furl); + + return REDIRECT; + } + if ($direction eq 'return' || $direction eq 'navlaunch') { # -------------------------------------------------------- Return to last known my $last; if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', @@ -217,17 +259,22 @@ sub handler { if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); } } else { - $newloc='/adm/noidea.html'; + $newloc='/adm/navmaps'; } untie %hash; } else { - $newloc='/adm/noidea.html'; + $newloc='/adm/navmaps'; } - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$newloc); - - return REDIRECT; + if ($newloc eq '/adm/navmaps' && $direction eq 'navlaunch') { + &navlaunch($r); + return OK; + } else { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.$newloc); + + return REDIRECT; + } } $currenturl=~s/^http\:\/\///; $currenturl=~s/^[^\/]+//; @@ -244,10 +291,15 @@ sub handler { if ($last) { $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html'); - return REDIRECT; + if ($direction eq 'return') { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html'); + return REDIRECT; + } else { + &navlaunch($r); + return OK; + } } } # ------------------------------------------- Do we have any idea where we are? @@ -283,27 +335,27 @@ sub handler { @possibilities=split(/\,/,$next); if ($#possibilities==0) { # ---------------------------------------------- Only one possibility, redirect - $redirecturl=&hash_src($next); + ($redirecturl,$redirectsymb)=&hash_src($next); $cachehash{$endupmap}{$redirecturl}= [$redirecturl,(split(/\./,$next))[1]]; } else { # ------------------------ There are multiple possibilities for a next resource $multichoice=1; - map { - $multichoicehash{'src_'.$_}=$hash{'src_'.$_}; - $multichoicehash{'title_'.$_}=$hash{'title_'.$_}; - $multichoicehash{'type_'.$_}=$hash{'type_'.$_}; - (my $first, my $second) = $_ =~ /(\d+).(\d+)/; - my $symbSrc = Apache::lonnet::declutter($hash{'src_'.$_}); - $multichoicehash{'symb_'.$_} = + foreach my $id (@possibilities) { + $multichoicehash{'src_'.$id}=$hash{'src_'.$id}; + $multichoicehash{'title_'.$id}=$hash{'title_'.$id}; + $multichoicehash{'type_'.$id}=$hash{'type_'.$id}; + (my $first, my $second) = $id =~ /(\d+).(\d+)/; + my $symbSrc = Apache::lonnet::declutter($hash{'src_'.$id}); + $multichoicehash{'symb_'.$id} = Apache::lonnet::declutter($hash{'map_id_'.$first}.'___'. $second.'___'.$symbSrc); - my ($choicemap,$choiceres)=split(/\./,$_); + my ($choicemap,$choiceres)=split(/\./,$id); my $map=&Apache::lonnet::declutter($hash{'src_'.$choicemap}); - my $url=$multichoicehash{'src_'.$_}; + my $url=$multichoicehash{'src_'.$id}; $cachehash{$map}{$url}=[$url,$choiceres]; - } @possibilities; + } } } else { # -------------------------------------------------------------- No place to go @@ -337,61 +389,74 @@ sub handler { if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) { $redirecturl='/adm/email?critical=display'; + $redirectsymb=''; } } &Apache::lonnet::appenv('user.criticalcheck.time'=>time); } &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$redirecturl); + my $url='http://'.$ENV{'HTTP_HOST'}.$redirecturl; + $url = &add_get_param($url, { 'symb' => $redirectsymb}); + $r->header_out(Location => $url); return REDIRECT; } else { # --------------------------------------------------------- There was a problem &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; + my %lt=&Apache::lonlocal::texthash('title' => 'End of Sequence', + 'explain' => + 'You have reached the end of the sequence of materials.', + 'back' => 'Go Back', + 'nav' => 'Navigate Course Content', + 'wherenext' => + 'There are several possibilities of where to go next', + 'pick' => + 'Please click on the the resource you intend to access', + 'titleheader' => 'Title', + 'type' => 'Type'); if ($#possibilities>0) { - my $bodytag= - &Apache::loncommon::bodytag('Multiple Resources'); + my $start_page= + &Apache::loncommon::start_page('Multiple Resources'); $r->print(<-Please click on the the resource you intend to access: +$lt{'pick'}:
Title | Type | |
---|---|---|
$lt{'titleheader'} | $lt{'type'} | |
'. - $multichoicehash{'title_'.$_}. - ' | '.$multichoicehash{'type_'.$_}. + &add_get_param($multichoicehash{'src_'.$id}, + {'symb' => + $multichoicehash{'symb_'.$id}, + }).'">'. + $multichoicehash{'title_'.$id}. + ' | '.$multichoicehash{'type_'.$id}. ' |