Diff for /rat/lonpageflip.pm between versions 1.3 and 1.18

version 1.3, 2000/10/07 22:30:30 version 1.18, 2001/11/29 19:23:49
Line 2 Line 2
 #  #
 # Page flip handler  # Page flip handler
 #  #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # (Page Handler  # (Page Handler
 #  #
 # (TeX Content Handler  # (TeX Content Handler
Line 10 Line 34
 # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,  # 08/30,08/31,09/06,09/14,09/15,09/16,09/19,09/20,09/21,09/23,
 # 10/02 Gerd Kortemeyer)  # 10/02 Gerd Kortemeyer)
 #  #
 # 10/03,10/05,10/06,10/07 Gerd Kortemeyer  # 10/03,10/05,10/06,10/07,10/09,10/10,10/11,10/16,10/17,
   # 11/14,11/16,
   # 10/01/01,05/01,05/28,07/05 Gerd Kortemeyer
   
 package Apache::lonpageflip;  package Apache::lonpageflip;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http REDIRECT);
 use Apache::lonnet();  use Apache::lonnet();
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
Line 25  use GDBM_File; Line 51  use GDBM_File;
 my %hash;  my %hash;
   
 sub addrid {  sub addrid {
     my ($current,$new)=@_;      my ($current,$new,$condid)=@_;
       unless ($condid) { $condid=0; }
     if (&Apache::lonnet::allowed('bre',$hash{'src_'.$new})) {      if (&Apache::lonnet::allowed('bre',$hash{'src_'.$new})) {
  if ($current) {   if ($current) {
     $current.=','.$new;      $current.=','.$new;
Line 36  sub addrid { Line 63  sub addrid {
     return $current;      return $current;
 }  }
   
   sub move {
       my ($rid,$mapurl,$direction)=@_;
   
       my $next='';
   
                 my $mincond=1;
                 my $posnext='';
                 if ($direction eq 'forward') {
   # --------------------------------------------------------------------- Forward
                     if ($hash{'type_'.$rid} eq 'finish') {
                $rid=$hash{'ids_/res/'.$mapurl}; 
                     }
                     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{'to_'.$rid});
                     map {
                         my ($linkid,$condval)=split(/\:/,$_);
                         if ($condval>=$mincond) {
             $next=&addrid($next,$hash{'goesto_'.$linkid},
                                   $hash{'condid_'.$hash{'undercond_'.$linkid}});
                         }
                     } split(/\,/,$posnext);
                     if ($hash{'is_map_'.$next}) {
                         if (
         $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
     $mapurl=$hash{'src_'.$next};
     $next=$hash{'map_start_'.$hash{'src_'.$next}};
                        }
                     }
                 } elsif ($direction eq 'back') {
   # ------------------------------------------------------------------- Backwards
                     if ($hash{'type_'.$rid} eq 'start') {
                $rid=$hash{'ids_/res/'.$mapurl};
                     }
                     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);
                     if ($hash{'is_map_'.$next}) {
                         if (
         $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
     $mapurl=$hash{'src_'.$next};
     $next=$hash{'map_finish_'.$hash{'src_'.$next}};
                        }
                     }
         }
   
                 return ($next,$mapurl);
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 49  sub handler { Line 150  sub handler {
      return OK;       return OK;
   }    }
   
     my %cachehash=(); 
 # --------BEGIN DEBUG ONLY TRASH    my $multichoice=0;
     $r->content_type('text/html');    my %multichoicehash=();
      $r->send_http_header;    my $redirecturl='';
     my $next='';
   $r->print('<html><body>');    my @possibilities=();
 # --------END DEBUG ONLY TRASH  
   
   my %cachehash=();  
   my $redir=0;  
   
   if (($ENV{'form.postdata'})&&($ENV{'request.course.fn'})) {    if (($ENV{'form.postdata'})&&($ENV{'request.course.fn'})) {
       $ENV{'form.postdata'}=~/(\w+)\:(.*)/;        $ENV{'form.postdata'}=~/(\w+)\:(.*)/;
       my $direction=$1;        my $direction=$1;
       my $currenturl=$2;        my $currenturl=$2;
       my $redirecturl=$currenturl;        if ($direction eq 'return') {
   # -------------------------------------------------------- Return to last known
            my $last;
            if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                       &GDBM_READER,0640)) {
        $last=$hash{'last_known'};
                untie(%hash);
            }
            my $newloc;
            if ($last) {
               $newloc='/res/'.(split(/\_\_\_/,$last))[1];
            } else {
       $newloc='/adm/noidea.html';
            }  
    $r->content_type('text/html');
            $r->header_out(Location => 
    'http://'.$ENV{'HTTP_HOST'}.$newloc);
                                  
            return REDIRECT;
         }
       $currenturl=~s/^http\:\/\///;        $currenturl=~s/^http\:\/\///;
       $currenturl=~s/^[^\/]+//;        $currenturl=~s/^[^\/]+//;
         unless (($currenturl=~/^\/res\//) || 
                 ($currenturl=~/^\/adm\/wrapper\//))  {
    my $last;
            if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                       &GDBM_READER,0640)) {
        $last=$hash{'last_known'};
                untie(%hash);
            }
            if ($last) {
        $currenturl='/res/'.(split(/\_\_\_/,$last))[1];
    } else {
        $r->content_type('text/html');
                $r->header_out(Location => 
                                  'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html');
                return REDIRECT;
            }
         }
 # ------------------------------------------- Do we have any idea where we are?  # ------------------------------------------- Do we have any idea where we are?
       my $position;        my $position;
       if ($position=Apache::lonnet::symbread($currenturl)) {        if ($position=Apache::lonnet::symbread($currenturl)) {
 # ------------------------------------------------------------------------- Yes  # ------------------------------------------------------------------------- Yes
   my ($mapurl,$mapnum,$thisurl)=split(/\_\_\_/,$position);    my ($mapurl,$mapnum,$thisurl)=split(/\_\_\_/,$position);
           $cachehash{$thisurl}=$mapnum;            $cachehash{$thisurl}=$mapnum;
   # ============================================================ Tie the big hash
           if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',            if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                         &GDBM_READER,0640)) {                          &GDBM_READER,0640)) {
               my $rid=$hash{'map_pc_/res/'.$mapurl}.'.'.$mapnum;                my $rid=$hash{'map_pc_/res/'.$mapurl}.'.'.$mapnum;
               my $next='';  
               if ($direction eq 'forward') {  # ------------------------------------------------- Move forward, backward, etc
                  map {  
     $next=&addrid($next,$hash{'goesto_'.$_});                ($next,$mapurl)=&move($rid,$mapurl,$direction);
                   } split(/\,/,$hash{'to_'.$rid});  # -------------------------------------- Do we have one and only one empty URL?
                   my @possibilities=split(/,/,$next);                my $safecount=0;
                   if ($#possibilities==1) {                while (($next) && ($next!~/\,/) && (!$hash{'src_'.$next})
               my $goto=$possibilities[0];                       && ($safecount<25)) {
   }                    ($next,$mapurl)=&move($next,$mapurl,$direction);
               } elsif ($direction eq 'back') {                    $safecount++;
       } elsif ($direction eq 'up') {                }
               } elsif ($direction eq 'down') {  # ----------------------------------------------------- Check out possibilities
                 if ($next) {
                     @possibilities=split(/\,/,$next);
                     if ($#possibilities==0) {
   # ---------------------------------------------- Only one possibility, redirect
                 $redirecturl=$hash{'src_'.$next};
                         $cachehash{&Apache::lonnet::declutter($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_'.$_};
                             $cachehash
                               {&Apache::lonnet::declutter(
         $multichoicehash
                                                            {'src_'.$_}
                                                          )}
                                    =(split(/\./,$_))[1];
                         } @possibilities;
                     }
         } else {
   # -------------------------------------------------------------- No place to go
                     $multichoice=-1;
               }                }
   # ----------------- The program must come past this point to untie the big hash
       untie(%hash);        untie(%hash);
               $r->print($rid.' - '.$next);  # --------------------------------------------------------- Store position info
                 $cachehash{'last_direction'}=$direction;
                 $cachehash{'last_known'}=&Apache::lonnet::declutter($currenturl);
                 &Apache::lonnet::symblist($mapurl,%cachehash);
   # ============================================== Do not return before this line
                 if ($redirecturl) {
   # ----------------------------------------------------- There is a URL to go to
     $r->content_type('text/html');
                     $r->header_out(Location => 
                                   'http://'.$ENV{'HTTP_HOST'}.$redirecturl);
                     return REDIRECT;
         } else {
   # --------------------------------------------------------- There was a problem
                     $r->content_type('text/html');
                     $r->send_http_header;
                     if ($#possibilities>0) {
                        $r->print(<<ENDSTART);
   <head><title>Choose Next Location</title></head>
   <body bgcolor="#FFFFFF">
   <h1>LON-CAPA</h1>
   There are several possibilities of where to go next.
   <p>
   Please click on the the resource you intend to access:
   <p>
   <table border=2>
   <tr><th>Title</th><th>Type</th></tr>
   ENDSTART
                        map {
                           $r->print(
                                 '<tr><td><a href="'.
                                 $multichoicehash{'src_'.$_}.'">'.
                                 $multichoicehash{'title_'.$_}.
                                 '</a></td><td>'.$multichoicehash{'type_'.$_}.
         '</td></tr>');
                        } @possibilities;
                        $r->print('</table></body></html>');
        return OK;
                     } else {
                        $r->print(<<ENDNONE);
   <head><title>Choose Next Location</title></head>
   <body bgcolor="#FFFFFF">
   <img src="/adm/lonIcons/lonlogos.gif" align=right>
   <h1>Sorry!</h1>
   <h2>Next resource could not be identified.</h2>
   <h3>You probably are at the beginning or the end of the course.</h3>
   </body>
   </html>
   ENDNONE
                        return OK;
            }
        }
     } else {
   # ------------------------------------------------- Problem, could not tie hash
                 $ENV{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing";
                 return HTTP_NOT_ACCEPTABLE; 
           }            }
       } else {        } else {
 # -------------------------------------------------------------------------- No  # ---------------------------------------- No, could not determine where we are
   $r->print('No idea '.$currenturl);           $r->internal_redirect('/adm/ambiguous');
       }        }
 # -------------------------- Class was not initialized or page fliped strangely  
   } else {    } else {
   # -------------------------- Class was not initialized or page fliped strangely
       $ENV{'user.error.msg'}="/adm/flip:bre:0:0:Choose Course";        $ENV{'user.error.msg'}="/adm/flip:bre:0:0:Choose Course";
       return HTTP_NOT_ACCEPTABLE;         return HTTP_NOT_ACCEPTABLE; 
   }     } 
   
   
   
   
 # ------TRASH BELOW  
 # --------------------------- TRASH  
   
   $r->print('</body></html>');  
   return OK;  
   
   
 # ========================================================= TOTAL TRASH  
   
 #                  &Apache::lonnet::symblist($requrl,%symbhash);  
   
 }  }
   
 1;  1;

Removed from v.1.3  
changed lines
  Added in v.1.18


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>