Diff for /rat/lonpageflip.pm between versions 1.12 and 1.30

version 1.12, 2000/11/14 19:14:03 version 1.30, 2002/09/07 02:55:38
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,10/09,10/10,10/11,10/16,10/17,11/14 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;
   
Line 27  my %hash; Line 53  my %hash;
 sub addrid {  sub addrid {
     my ($current,$new,$condid)=@_;      my ($current,$new,$condid)=@_;
     unless ($condid) { $condid=0; }      unless ($condid) { $condid=0; }
     if (&Apache::lonnet::allowed('bre',$hash{'src_'.$new})) {  
  if ($current) {   if ($current) {
     $current.=','.$new;      $current.=','.$new;
         } else {          } else {
             $current=''.$new;              $current=''.$new;
         }          }
     }  
     return $current;      return $current;
 }  }
   
   sub fullmove {
       my ($rid,$mapurl,$direction)=@_;
       if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                           &GDBM_READER(),0640)) {
    ($rid,$mapurl)=&move($rid,$mapurl,$direction);
           untie(%hash);
       }
       return($rid,$mapurl);
   }
   
   sub move {
       my ($rid,$mapurl,$direction)=@_;
       my $startoutrid=$rid;
   
       my $next='';
   
                 my $mincond=1;
                 my $posnext='';
                 if ($direction eq 'forward') {
   # --------------------------------------------------------------------- Forward
                     if ($hash{'type_'.$rid} eq 'finish') {
                $rid=$hash{'ids_'.&Apache::lonnet::clutter($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}) {
   # This jumps to the beginning of a new map (going down level)
                         if (
         $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
     $mapurl=$hash{'src_'.$next};
     $next=$hash{'map_start_'.$hash{'src_'.$next}};
                        }
                     } elsif 
                       ((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
                     if ($hash{'type_'.$rid} eq 'start') {
                $rid=$hash{'ids_'.&Apache::lonnet::clutter($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}) {
   # This jumps to the end of a new map (going down one level)
                         if (
         $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
     $mapurl=$hash{'src_'.$next};
     $next=$hash{'map_finish_'.$hash{'src_'.$next}};
                        }
                     } elsif 
                       ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {
   # This comes back up from a map (going up one level);
         $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
                     }
         }
                 return ($next,$mapurl);
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 56  sub handler { Line 176  sub handler {
   my $redirecturl='';    my $redirecturl='';
   my $next='';    my $next='';
   my @possibilities=();    my @possibilities=();
   
   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;
Line 65  sub handler { Line 184  sub handler {
 # -------------------------------------------------------- Return to last known  # -------------------------------------------------------- Return to last known
          my $last;           my $last;
          if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',           if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                     &GDBM_READER,0640)) {                      &GDBM_READER(),0640)) {
      $last=$hash{'last_known'};       $last=$hash{'last_known'};
              untie(%hash);               untie(%hash);
          }           }
          my $newloc;           my $newloc;
          if ($last) {           if ($last) {
             $newloc='/res/'.(split(/\_\_\_/,$last))[1];              $newloc=&Apache::lonnet::clutter((split(/\_\_\_/,$last))[1]);
          } else {           } else {
     $newloc='/adm/noidea.html';      $newloc='/adm/noidea.html';
          }             }  
Line 83  sub handler { Line 202  sub handler {
       }        }
       $currenturl=~s/^http\:\/\///;        $currenturl=~s/^http\:\/\///;
       $currenturl=~s/^[^\/]+//;        $currenturl=~s/^[^\/]+//;
       unless ($currenturl=~/\/res\//) {        unless ($currenturl=~/^\/(res|adm\/wrapper|public|adm\/coursedocs)\//) {
  my $last;   my $last;
          if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',           if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db',
                     &GDBM_READER,0640)) {                      &GDBM_READER(),0640)) {
      $last=$hash{'last_known'};       $last=$hash{'last_known'};
              untie(%hash);               untie(%hash);
          }           }
          if ($last) {           if ($last) {
      $currenturl='/res/'.(split(/\_\_\_/,$last))[1];       $currenturl=&Apache::lonnet::clutter((split(/\_\_\_/,$last))[1]);
  } else {   } else {
      $r->content_type('text/html');       $r->content_type('text/html');
              $r->header_out(Location =>                $r->header_out(Location => 
Line 103  sub handler { Line 222  sub handler {
       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 ($startoutmap,$mapnum,$thisurl)=split(/\_\_\_/,$position);
           $cachehash{$thisurl}=$mapnum;            $cachehash{$startoutmap}{$thisurl}=$mapnum;
             $cachehash{$startoutmap}{'last_known'}=
                                          &Apache::lonnet::declutter($currenturl);
   
 # ============================================================ Tie the big hash  # ============================================================ 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_'.&Apache::lonnet::clutter($startoutmap)}.
               my $next='';                        '.'.$mapnum;
               my $mincond=1;  
               my $posnext='';  # ------------------------------------------------- Move forward, backward, etc
               if ($direction eq 'forward') {                my $endupmap;
 # --------------------------------------------------------------------- Forward                ($next,$endupmap)=&move($rid,$startoutmap,$direction);
                   map {  # -------------------------------------- Do we have one and only one empty URL?
                       my $thiscond=                my $safecount=0;
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});                while (($next) && ($next!~/\,/) && 
                       if ($thiscond>=$mincond) {                       ((!$hash{'src_'.$next}) || ($hash{'randomout_'.$next}))
           if ($posnext) {                       && ($safecount<10000)) {
              $posnext.=','.$_.':'.$thiscond;                    ($next,$endupmap)=&move($next,$endupmap,$direction);
                           } else {                    $safecount++;
                              $posnext=$_.':'.$thiscond;                }
           }  # We are now at at least one non-empty URL
                           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);  
               } elsif ($direction eq 'back') {  
 # ------------------------------------------------------------------- Backwards  
                   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);  
        } elsif ($direction eq 'up') {  
 # -------------------------------------------------------------------------- Up  
               } elsif ($direction eq 'down') {  
 # ------------------------------------------------------------------------ Down  
       }  
 # ----------------------------------------------------- Check out possibilities  # ----------------------------------------------------- Check out possibilities
               if ($next) {                if ($next) {
                   @possibilities=split(/\,/,$next);                    @possibilities=split(/\,/,$next);
                   if ($#possibilities==0) {                    if ($#possibilities==0) {
 # ---------------------------------------------- Only one possibility, redirect  # ---------------------------------------------- Only one possibility, redirect
               $redirecturl=$hash{'src_'.$next};                $redirecturl=$hash{'src_'.$next};
                       $cachehash{&Apache::lonnet::declutter($redirecturl)}                        $cachehash{$endupmap}
                                   {&Apache::lonnet::declutter($redirecturl)}
                                  =(split(/\./,$next))[1];                                   =(split(/\./,$next))[1];
       if ($hash{'param_'.$next}) {  
          my ($mapid,$resid)=split(/\./,$next);  
                          &Apache::lonnet::appendparms(  
                          &Apache::lonnet::declutter($hash{'map_id_'.$mapid}).  
                          '___'.$resid.'___'.  
                          &Apache::lonnet::declutter($redirecturl),  
                          $hash{'param_'.$next});  
                       }  
                   } else {                    } else {
 # ------------------------ There are multiple possibilities for a next resource  # ------------------------ There are multiple possibilities for a next resource
                       $multichoice=1;                        $multichoice=1;
Line 182  sub handler { Line 261  sub handler {
   $multichoicehash{'src_'.$_}=$hash{'src_'.$_};    $multichoicehash{'src_'.$_}=$hash{'src_'.$_};
                           $multichoicehash{'title_'.$_}=$hash{'title_'.$_};                            $multichoicehash{'title_'.$_}=$hash{'title_'.$_};
                           $multichoicehash{'type_'.$_}=$hash{'type_'.$_};                            $multichoicehash{'type_'.$_}=$hash{'type_'.$_};
                             my ($choicemap,$choiceres)=split(/\./,$_);
                           $cachehash                            $cachehash
                             {&Apache::lonnet::declutter(   {&Apache::lonnet::declutter($hash{'src_'.$choicemap})}
                            {&Apache::lonnet::declutter(
       $multichoicehash        $multichoicehash
                                                          {'src_'.$_}                                                           {'src_'.$_}
                                                        )}                                                         )}
                                  =(split(/\./,$_))[1];                                   =$choiceres;
                           if ($hash{'param_'.$_}) {  
             my ($mapid,$resid)=split(/\./,$_);  
                              &Apache::lonnet::appendparms(  
                            &Apache::lonnet::declutter($hash{'map_id_'.$mapid}).  
                            '___'.$resid.'___'.  
                            &Apache::lonnet::declutter($hash{'src_'.$_}),  
                              $hash{'param_'.$_});  
   }  
                       } @possibilities;                        } @possibilities;
                   }                    }
       } else {        } else {
Line 205  sub handler { Line 278  sub handler {
 # ----------------- The program must come past this point to untie the big hash  # ----------------- The program must come past this point to untie the big hash
       untie(%hash);        untie(%hash);
 # --------------------------------------------------------- Store position info  # --------------------------------------------------------- Store position info
               $cachehash{'last_direction'}=$direction;                $cachehash{$startoutmap}{'last_direction'}=$direction;
               $cachehash{'last_known'}=&Apache::lonnet::declutter($currenturl);                foreach my $thismap (keys %cachehash) {
               &Apache::lonnet::symblist($mapurl,%cachehash);                   &Apache::lonnet::symblist($thismap,%{$cachehash{$thismap}});
         }
 # ============================================== Do not return before this line  # ============================================== Do not return before this line
               if ($redirecturl) {                if ($redirecturl) {
 # ----------------------------------------------------- There is a URL to go to  # ----------------------------------------------------- There is a URL to go to
Line 231  Please click on the the resource you int Line 305  Please click on the the resource you int
 <table border=2>  <table border=2>
 <tr><th>Title</th><th>Type</th></tr>  <tr><th>Title</th><th>Type</th></tr>
 ENDSTART  ENDSTART
                      map {                       foreach (@possibilities) {
                         $r->print(                          $r->print(
                               '<tr><td><a href="'.                                '<tr><td><a href="'.
                               $multichoicehash{'src_'.$_}.'">'.                                $multichoicehash{'src_'.$_}.'">'.
                               $multichoicehash{'title_'.$_}.                                $multichoicehash{'title_'.$_}.
                               '</a></td><td>'.$multichoicehash{'type_'.$_}.                                '</a></td><td>'.$multichoicehash{'type_'.$_}.
       '</td></tr>');        '</td></tr>');
                      } @possibilities;                       }
                      $r->print('</table></body></html>');                       $r->print('</table></body></html>');
      return OK;       return OK;
                   } else {                    } else {
                      $r->print(<<ENDNONE);                       $r->print(<<ENDNONE);
 <head><title>Choose Next Location</title></head>  <head><title>Choose Next Location</title></head>
 <body bgcolor="#FFFFFF">  <body bgcolor="#FFFFFF">
 <img src="/adm/lonKaputt/lonlogo_broken.gif" align=left>  <img src="/adm/lonIcons/lonlogos.gif" align=right>
 <h1>Sorry!</h1>  <h1>Sorry!</h1>
 <h2>Next resource could not be identified.</h2>  <h2>Next resource could not be identified.</h2>
   <h3>You probably are at the beginning or the end of the course.</h3>
 </body>  </body>
 </html>  </html>
 ENDNONE  ENDNONE

Removed from v.1.12  
changed lines
  Added in v.1.30


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