--- rat/lonpageflip.pm 2006/05/30 19:47:40 1.69
+++ rat/lonpageflip.pm 2013/11/28 02:23:25 1.83
@@ -2,7 +2,7 @@
#
# Page flip handler
#
-# $Id: lonpageflip.pm,v 1.69 2006/05/30 19:47:40 www Exp $
+# $Id: lonpageflip.pm,v 1.83 2013/11/28 02:23:25 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -27,12 +27,15 @@
# http://www.lon-capa.org/
#
+
+
package Apache::lonpageflip;
use strict;
use LONCAPA;
use Apache::Constants qw(:common :http REDIRECT);
use Apache::lonnet;
+use Apache::loncommon();
use HTML::TokeParser;
use GDBM_File;
@@ -86,6 +89,39 @@ sub hash_src {
}
sub move {
+ my ($next,$endupmap,$direction) = @_;
+ my $safecount=0;
+ my $allowed=0;
+ do {
+ ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction);
+
+ my $url = $hash{'src_'.$next};
+ my ($mapid,$resid)=split(/\./,$next);
+ my $symb = &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},
+ $resid,$url);
+ if ($url eq '' || $symb eq '') {
+ $allowed = 0;
+ } else {
+ my $priv = &Apache::lonnet::allowed('bre',$url,$symb);
+ $allowed = (($priv eq 'F') || ($priv eq '2'));
+ }
+ $safecount++;
+ } while ( ($next)
+ && ($next!~/\,/)
+ && (
+ (!$hash{'src_'.$next})
+ || (
+ (!$env{'request.role.adv'})
+ && $hash{'randomout_'.$next}
+ )
+ || (!$allowed)
+ )
+ && ($safecount<10000));
+
+ return ($next,$endupmap);
+}
+
+sub get_next_possible_move {
my ($rid,$mapurl,$direction)=@_;
my $startoutrid=$rid;
@@ -181,36 +217,22 @@ 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()); -} - sub first_accessible_resource { my $furl; if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { $furl=$hash{'first_url'}; - if (!&Apache::lonnet::allowed('bre',$furl)) { + my %args; + my ($url,$args) = split(/\?/,$furl); + foreach my $pair (split(/\&/,$args)) { + my ($name,$value) = split(/=/,$pair); + $args{&unescape($name)} = &unescape($value); + } + if (!&Apache::lonnet::allowed('bre',$url,$args{'symb'})) { # Wow, we cannot see this ... move forward to the next one that we can see my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward'); # Build the new URL - my ($newresid,$newmapid)=split(/\./,$newrid); + my ($newmapid,$newresid)=split(/\./,$newrid); my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid}); $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb }); if ($hash{'encrypted_'.$newrid}) { @@ -256,11 +278,11 @@ sub handler { my $furl=&first_accessible_resource(); &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$furl); + &Apache::lonnet::absolute_url().$furl); return REDIRECT; } - if ($direction eq 'return' || $direction eq 'navlaunch') { + if ($direction eq 'return') { # -------------------------------------------------------- Return to last known my $last; if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', @@ -284,18 +306,13 @@ sub handler { } else { $newloc='/adm/navmaps'; } - 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); + &Apache::lonnet::absolute_url().$newloc); return REDIRECT; - } } - $currenturl=~s/^http\:\/\///; + $currenturl=~s/^https?\:\/\///; $currenturl=~s/^[^\/]+//; # # Is the current URL on the map? If not, start with last known URL @@ -310,15 +327,11 @@ sub handler { if ($last) { $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { - if ($direction eq 'return') { &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html'); + &Apache::lonnet::absolute_url(). + '/adm/noidea.html'); return REDIRECT; - } else { - &navlaunch($r); - return OK; - } } } # ------------------------------------------- Do we have any idea where we are? @@ -340,14 +353,6 @@ sub handler { my $endupmap; ($next,$endupmap)=&move($rid,$startoutmap,$direction); # -------------------------------------- Do we have one and only one empty URL? - my $safecount=0; - while (($next) && ($next!~/\,/) && - ((!$hash{'src_'.$next}) || - ((!$env{'request.role.adv'}) && $hash{'randomout_'.$next})) - && ($safecount<10000)) { - ($next,$endupmap)=&move($next,$endupmap,$direction); - $safecount++; - } # We are now at at least one non-empty URL # ----------------------------------------------------- Check out possibilities if ($next) { @@ -411,11 +416,11 @@ sub handler { $redirectsymb=''; } } - &Apache::lonnet::appenv('user.criticalcheck.time'=>time); + &Apache::lonnet::appenv({'user.criticalcheck.time'=>time}); } &Apache::loncommon::content_type($r,'text/html'); - my $url='http://'.$ENV{'HTTP_HOST'}.$redirecturl; + my $url=&Apache::lonnet::absolute_url().$redirecturl; $url = &add_get_param($url, { 'symb' => $redirectsymb}); $r->header_out(Location => $url); return REDIRECT; @@ -427,13 +432,16 @@ sub handler { 'explain' => 'You have reached the end of the sequence of materials.', 'back' => 'Go Back', - 'nav' => 'Navigate Course Content', + 'nav' => 'Course Contents', '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 (&Apache::loncommon::course_type() eq 'Community') { + $lt{'nav'} = &mt('Community Contents'); + } if ($#possibilities>0) { my $start_page= &Apache::loncommon::start_page('Multiple Resources'); @@ -443,7 +451,7 @@ $start_page$lt{'pick'}:
-
$lt{'titleheader'} | $lt{'type'} |
---|
$lt{'explain'}
-ENDNONE - } - $r->print(<'.$lt{'explain'}.'
'); + } + $r->print( + &Apache::lonhtmlcommon::actionbox( + [''.$lt{'back'}.'', + ''.$lt{'nav'}.'' + ]) + .&Apache::loncommon::end_page()); return OK; } } else { @@ -484,6 +488,7 @@ ENDMENU } else { # ---------------------------------------- No, could not determine where we are $r->internal_redirect('/adm/ambiguous'); + return OK; } } else { # -------------------------- Class was not initialized or page fliped strangely @@ -495,6 +500,44 @@ ENDMENU 1; __END__ +=pod + +=head1 NAME + +Apache::lonpageflip + +=head1 SYNOPSIS + +Deals with forward, backward, and other page flips. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 OVERVIEW + +(empty) + +=head1 SUBROUTINES + +=over cleanup() + +=item addrid() + +=item fullmove() + +=item hash_src() + +=item move() + +=item get_next_possible_move() + +=item first_accessible_resource() + +=item handler() + +=back + +=cut