Diff for /rat/lonpageflip.pm between versions 1.40 and 1.62

version 1.40, 2003/08/15 14:49:26 version 1.62, 2006/01/09 18:51:26
Line 26 Line 26
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (Page Handler  
 #  
 # (TeX Content Handler  
 #  
 # 05/29/00,05/30 Gerd Kortemeyer)  
 # 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/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 REDIRECT);  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 74  sub addrid { Line 63  sub addrid {
   
 sub fullmove {  sub fullmove {
     my ($rid,$mapurl,$direction)=@_;      my ($rid,$mapurl,$direction)=@_;
     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)) {
  ($rid,$mapurl)=&move($rid,$mapurl,$direction);   ($rid,$mapurl)=&move($rid,$mapurl,$direction);
         untie(%hash);          untie(%hash);
Line 82  sub fullmove { Line 71  sub fullmove {
     return($rid,$mapurl);      return($rid,$mapurl);
 }  }
   
   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}),
    &Apache::lonenc::encrypted($symb));
       }
       return ($hash{'src_'.$id},$symb);
   }
   
 sub move {  sub move {
     my ($rid,$mapurl,$direction)=@_;      my ($rid,$mapurl,$direction)=@_;
     my $startoutrid=$rid;      my $startoutrid=$rid;
Line 95  sub move { Line 96  sub move {
                   while ($hash{'type_'.$rid} eq 'finish') {                    while ($hash{'type_'.$rid} eq 'finish') {
              $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};               $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
                   }                    }
                   map {    foreach my $id (split(/\,/,$hash{'to_'.$rid})) {
                       my $thiscond=        my $thiscond=
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});        &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$id}});
                       if ($thiscond>=$mincond) {                        if ($thiscond>=$mincond) {
           if ($posnext) {            if ($posnext) {
              $posnext.=','.$_.':'.$thiscond;               $posnext.=','.$id.':'.$thiscond;
                           } else {                            } else {
                              $posnext=$_.':'.$thiscond;                               $posnext=$id.':'.$thiscond;
           }            }
                           if ($thiscond>$mincond) { $mincond=$thiscond; }                            if ($thiscond>$mincond) { $mincond=$thiscond; }
               }                }
                   } split(/\,/,$hash{'to_'.$rid});                    } 
                   map {    foreach my $id (split(/\,/,$posnext))  {
                       my ($linkid,$condval)=split(/\:/,$_);                        my ($linkid,$condval)=split(/\:/,$id);
                       if ($condval>=$mincond) {                        if ($condval>=$mincond) {
           $next=&addrid($next,$hash{'goesto_'.$linkid},            $next=&addrid($next,$hash{'goesto_'.$linkid},
                                 $hash{'condid_'.$hash{'undercond_'.$linkid}});                                  $hash{'condid_'.$hash{'undercond_'.$linkid}});
                       }                        }
                   } split(/\,/,$posnext);                    }
                   if ($hash{'is_map_'.$next}) {                    if ($hash{'is_map_'.$next}) {
 # This jumps to the beginning of a new map (going down level)  # This jumps to the beginning of a new map (going down level)
                       if (                        if (
       $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {        $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
   $mapurl=$hash{'src_'.$next};    $mapurl=$hash{'src_'.$next};
   $next=$hash{'map_start_'.$hash{'src_'.$next}};    $next=$hash{'map_start_'.$hash{'src_'.$next}};
                        } elsif (
   # This jumps back up from an empty sequence, to a page up one level
                            $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'page') {
                            $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
                      }                       }
                   } elsif                     } elsif 
                     ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {                      ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {
 # This comes up from a map (coming up one level);  # This comes up from a map (coming up one level);
       $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};        $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
                   }    }
               } elsif ($direction eq 'back') {                } elsif ($direction eq 'back') {
 # ------------------------------------------------------------------- Backwards  # ------------------------------------------------------------------- Backwards
                  while ($hash{'type_'.$rid} eq 'start') {                   while ($hash{'type_'.$rid} eq 'start') {
              $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};               $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
  }   }
                   map {   foreach my $id (split(/\,/,$hash{'from_'.$rid})) {
                       my $thiscond=       my $thiscond=
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});        &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$id}});
                       if ($thiscond>=$mincond) {       if ($thiscond>=$mincond) {
           if ($posnext) {   if ($posnext) {
              $posnext.=','.$_.':'.$thiscond;               $posnext.=','.$id.':'.$thiscond;
                           } else {   } else {
                              $posnext=$_.':'.$thiscond;                               $posnext=$id.':'.$thiscond;
           }   }
                           if ($thiscond>$mincond) { $mincond=$thiscond; }   if ($thiscond>$mincond) { $mincond=$thiscond; }
               }       }
                   } split(/\,/,$hash{'from_'.$rid});   } 
                   map {   foreach my $id (split(/\,/,$posnext)) {
                       my ($linkid,$condval)=split(/\:/,$_);       my ($linkid,$condval)=split(/\:/,$id);
                       if ($condval>=$mincond) {       if ($condval>=$mincond) {
           $next=&addrid($next,$hash{'comesfrom_'.$linkid},   $next=&addrid($next,$hash{'comesfrom_'.$linkid},
                                 $hash{'condid_'.$hash{'undercond_'.$linkid}});         $hash{'condid_'.$hash{'undercond_'.$linkid}});
                       }       }
                   } split(/\,/,$posnext);   }
                   if ($hash{'is_map_'.$next}) {                    if ($hash{'is_map_'.$next}) {
 # This jumps to the end of a new map (going down one level)  # This jumps to the end of a new map (going down one level)
                       if (                        if (
       $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {        $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'sequence') {
   $mapurl=$hash{'src_'.$next};    $mapurl=$hash{'src_'.$next};
   $next=$hash{'map_finish_'.$hash{'src_'.$next}};    $next=$hash{'map_finish_'.$hash{'src_'.$next}};
                      }                        } elsif (
         $hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$next}}} eq 'page') {
   # This jumps back up from an empty sequence, to a page up one level
                             $mapurl=$hash{'map_id_'.(split(/\./,$next))[0]};
                         }
                   } elsif                     } elsif 
                     ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {                      ((split(/\./,$startoutrid))[0]!=(split(/\./,$next))[0]) {
 # This comes back up from a map (going up one level);  # This comes back up from a map (going up one level);
Line 166  sub move { Line 175  sub move {
               return ($next,$mapurl);                return ($next,$mapurl);
 }  }
   
   sub navlaunch {
       my ($r)=@_;
       &Apache::loncommon::content_type($r,'text/html');
       &Apache::loncommon::no_cache($r);
       $r->send_http_header;
       my $html=&Apache::lonxml::xmlbegin();
       $r->print("$html<head>\n");
       $r->print('</head>'.
         &Apache::loncommon::bodytag('Launched'));   
       $r->print(<<ENDNAV);
       <p><a href="/adm/flip?postdata=firstres%3a">Goto first resource</a></p>
       <script type="text/javascript">
    function collapse() {
       menu=window.open("/adm/navmaps?collapseExternal","loncapanav",
        "height=600,width=400,scrollbars=1");
       this.document.location='/adm/navmaps?turningOffExternal';
    }
       </script>
       <p><a href="javascript:collapse();">Collapse external navigation window</a></p>
   ENDNAV
       $r->print(&Apache::loncommon::endbodytag().'</html>');
   }
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 174  sub handler { Line 205  sub handler {
 # ------------------------------------------- Set document type for header only  # ------------------------------------------- Set document type for header only
   
   if ($r->header_only) {    if ($r->header_only) {
      $r->content_type('text/html');        &Apache::loncommon::content_type($r,'text/html');
      $r->send_http_header;        $r->send_http_header;
      return OK;        return OK;
   }    }
   
   my %cachehash=();     my %cachehash=(); 
   my $multichoice=0;    my $multichoice=0;
   my %multichoicehash=();    my %multichoicehash=();
   my $redirecturl='';    my ($redirecturl,$redirectsymb);
   my $next='';    my $next='';
   my @possibilities=();    my @possibilities=();
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']);     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']);
   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;
       if ($direction eq 'return') {        if ($currenturl=~m|^/enc/|) {
     $currenturl=&Apache::lonenc::unencrypted($currenturl);
         }
         $currenturl=~s/\.\d+\.(\w+)$/\.$1/;
         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  # -------------------------------------------------------- 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) && (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'.db',           if (($last) && (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db',
                         &GDBM_READER(),0640))) {                          &GDBM_READER(),0640))) {
             my ($murl,$fn)=split(/\_\_\_/,$last);              my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last);
             my $id;      $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id;
             ($murl,$id,$fn)=split(/\_\_\_/,&Apache::lonnet::symbread($fn));      $newloc=$hash{'src_'.$id};
     $newloc=$hash{'src_'.      if ($newloc) {
                 $hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id};   if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); }
             unless ($newloc) { $newloc='/adm/noidea.html'; }        
       } else {
    $newloc='/adm/navmaps';
       }
             untie %hash;              untie %hash;
          } else {           } else {
     $newloc='/adm/noidea.html';      $newloc='/adm/navmaps';
          }             }  
  $r->content_type('text/html');   if ($newloc eq '/adm/navmaps' && $direction eq 'navlaunch') {
          $r->header_out(Location =>        &navlaunch($r);
  'http://'.$ENV{'HTTP_HOST'}.$newloc);       return OK;
                                   } else {
          return REDIRECT;       &Apache::loncommon::content_type($r,'text/html');
        $r->header_out(Location => 
       'http://'.$ENV{'HTTP_HOST'}.$newloc);
        
        return REDIRECT;
    }
       }        }
       $currenturl=~s/^http\:\/\///;        $currenturl=~s/^http\:\/\///;
       $currenturl=~s/^[^\/]+//;        $currenturl=~s/^[^\/]+//;
Line 224  sub handler { Line 280  sub handler {
 #  #
       unless (&Apache::lonnet::is_on_map($currenturl)) {        unless (&Apache::lonnet::is_on_map($currenturl)) {
  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=&Apache::lonnet::clutter((split(/\_\_\_/,$last))[1]);       $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]);
  } else {   } else {
      $r->content_type('text/html');       if ($direction eq 'return') {
              $r->header_out(Location =>    &Apache::loncommon::content_type($r,'text/html');
                                'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html');   $r->header_out(Location => 
              return REDIRECT;   'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html');
    return REDIRECT;
        } else {
    &navlaunch($r);
    return OK;
        }
          }           }
       }        }
 # ------------------------------------------- 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 ($startoutmap,$mapnum,$thisurl)=split(/\_\_\_/,$position);    my ($startoutmap,$mapnum,$thisurl)=&Apache::lonnet::decode_symb($position);
           $cachehash{$startoutmap}{$thisurl}=$mapnum;            $cachehash{$startoutmap}{$thisurl}=[$thisurl,$mapnum];
           $cachehash{$startoutmap}{'last_known'}=            $cachehash{$startoutmap}{'last_known'}=
                                        &Apache::lonnet::declutter($currenturl);                               [&Apache::lonnet::declutter($currenturl),$mapnum];
   
 # ============================================================ 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_'.&Apache::lonnet::clutter($startoutmap)}.                my $rid=$hash{'map_pc_'.&Apache::lonnet::clutter($startoutmap)}.
                       '.'.$mapnum;                        '.'.$mapnum;
Line 259  sub handler { Line 320  sub handler {
 # -------------------------------------- Do we have one and only one empty URL?  # -------------------------------------- Do we have one and only one empty URL?
               my $safecount=0;                my $safecount=0;
               while (($next) && ($next!~/\,/) &&                 while (($next) && ($next!~/\,/) && 
                      ((!$hash{'src_'.$next}) || ($hash{'randomout_'.$next}))                       ((!$hash{'src_'.$next}) || 
         ((!$env{'request.role.adv'}) && $hash{'randomout_'.$next}))
                      && ($safecount<10000)) {                       && ($safecount<10000)) {
                   ($next,$endupmap)=&move($next,$endupmap,$direction);                    ($next,$endupmap)=&move($next,$endupmap,$direction);
                   $safecount++;                    $safecount++;
Line 270  sub handler { Line 332  sub handler {
                   @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,$redirectsymb)=&hash_src($next);
                       $cachehash{$endupmap}                        $cachehash{$endupmap}{$redirecturl}=
                                 {&Apache::lonnet::declutter($redirecturl)}    [$redirecturl,(split(/\./,$next))[1]];
                                  =(split(/\./,$next))[1];  
                   } else {                    } else {
 # ------------------------ There are multiple possibilities for a next resource  # ------------------------ There are multiple possibilities for a next resource
                       $multichoice=1;                        $multichoice=1;
                       map {        foreach my $id (@possibilities) {
   $multichoicehash{'src_'.$_}=$hash{'src_'.$_};    $multichoicehash{'src_'.$id}=$hash{'src_'.$id};
                           $multichoicehash{'title_'.$_}=$hash{'title_'.$_};                            $multichoicehash{'title_'.$id}=$hash{'title_'.$id};
                           $multichoicehash{'type_'.$_}=$hash{'type_'.$_};                            $multichoicehash{'type_'.$id}=$hash{'type_'.$id};
                           (my $first, my $second) = $_ =~ /(\d+).(\d+)/;                            (my $first, my $second) = $id =~ /(\d+).(\d+)/;
                           my $symbSrc = Apache::lonnet::declutter($hash{'src_'.$_});                            my $symbSrc = Apache::lonnet::declutter($hash{'src_'.$id});
                           $multichoicehash{'symb_'.$_} =                             $multichoicehash{'symb_'.$id} = 
                               Apache::lonnet::declutter($hash{'map_id_'.$first}.'___'.                                Apache::lonnet::declutter($hash{'map_id_'.$first}.'___'.
                                                         $second.'___'.$symbSrc);                                                          $second.'___'.$symbSrc);
                                                                                                                     
                           my ($choicemap,$choiceres)=split(/\./,$_);                            my ($choicemap,$choiceres)=split(/\./,$id);
                           $cachehash    my $map=&Apache::lonnet::declutter($hash{'src_'.$choicemap});
  {&Apache::lonnet::declutter($hash{'src_'.$choicemap})}    my $url=$multichoicehash{'src_'.$id};
                          {&Apache::lonnet::declutter(                            $cachehash{$map}{$url}=[$url,$choiceres];
       $multichoicehash                        }
                                                          {'src_'.$_}  
                                                        )}  
                                  =$choiceres;  
                       } @possibilities;  
                   }                    }
       } else {        } else {
 # -------------------------------------------------------------- No place to go  # -------------------------------------------------------------- No place to go
Line 304  sub handler { Line 361  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{$startoutmap}{'last_direction'}=$direction;                $cachehash{$startoutmap}{'last_direction'}=[$direction,'notasymb'];
               foreach my $thismap (keys %cachehash) {                foreach my $thismap (keys %cachehash) {
                  &Apache::lonnet::symblist($thismap,%{$cachehash{$thismap}});    my $mapnum=$cachehash{$thismap}->{'mapnum'};
     delete($cachehash{$thismap}->{'mapnum'});
     &Apache::lonnet::symblist($thismap,
       %{$cachehash{$thismap}});
       }        }
 # ============================================== Do not return before this line  # ============================================== Do not return before this line
               if ($redirecturl) {                if ($redirecturl) {
Line 318  sub handler { Line 378  sub handler {
                      &Apache::lonnet::linklog($redirecturl,$currenturl);                       &Apache::lonnet::linklog($redirecturl,$currenturl);
   }    }
 # ------------------------------------------------- Check for critical messages  # ------------------------------------------------- Check for critical messages
   if ((time-$ENV{'user.criticalcheck.time'})>300) {    if ((time-$env{'user.criticalcheck.time'})>300) {
                      my @what=&Apache::lonnet::dump                       my @what=&Apache::lonnet::dump
                                   ('critical',$ENV{'user.domain'},                                    ('critical',$env{'user.domain'},
                                               $ENV{'user.name'});                                                $env{'user.name'});
                      if ($what[0]) {                       if ($what[0]) {
                 if (($what[0] ne 'con_lost') &&                   if (($what[0] ne 'con_lost') && 
                             ($what[0]!~/^error\:/)) {                              ($what[0]!~/^error\:/)) {
                    $redirecturl='/adm/email?critical=display';                     $redirecturl='/adm/email?critical=display';
      $redirectsymb='';
                         }                          }
                      }                       }
                      &Apache::lonnet::appenv('user.criticalcheck.time'=>time);                       &Apache::lonnet::appenv('user.criticalcheck.time'=>time);
   }    }
   
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
                   $r->header_out(Location =>     my $url='http://'.$ENV{'HTTP_HOST'}.$redirecturl;
                                 'http://'.$ENV{'HTTP_HOST'}.$redirecturl);    if ($redirectsymb ne '') { $url.='?symb='.&Apache::lonnet::escape($redirectsymb); }
                     $r->header_out(Location => $url);
                   return REDIRECT;                    return REDIRECT;
       } else {        } else {
 # --------------------------------------------------------- There was a problem  # --------------------------------------------------------- There was a problem
                   $r->content_type('text/html');                    &Apache::loncommon::content_type($r,'text/html');
                   $r->send_http_header;                    $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) {                    if ($#possibilities>0) {
       my $bodytag=        my $bodytag=
                              &Apache::loncommon::bodytag('Multiple Resources');                               &Apache::loncommon::bodytag('Multiple Resources');
                      $r->print(<<ENDSTART);                       $r->print(<<ENDSTART);
 <head><title>Choose Next Location</title></head>  <head><title>Choose Next Location</title></head>
 $bodytag  $bodytag
 <h3>There are several possibilities of where to go next</h3>  <h3>$lt{'wherenext'}</h3>
 <p>  <p>
 Please click on the the resource you intend to access:  $lt{'pick'}:
 <p>  <p>
 <table border=2>  <table border=2>
 <tr><th>Title</th><th>Type</th></tr>  <tr><th>$lt{'titleheader'}</th><th>$lt{'type'}</th></tr>
 ENDSTART  ENDSTART
                      foreach (@possibilities) {                       foreach my $id (@possibilities) {
                         $r->print(                          $r->print(
                               '<tr><td><a href="'.                                '<tr><td><a href="'.
                               $multichoicehash{'src_'.$_}.'?symb=' .                                $multichoicehash{'src_'.$id}.'?symb=' .
                                   Apache::lonnet::escape($multichoicehash{'symb_'.$_}).'">'.                                    Apache::lonnet::escape($multichoicehash{'symb_'.$id}).'">'.
                               $multichoicehash{'title_'.$_}.                                $multichoicehash{'title_'.$id}.
                               '</a></td><td>'.$multichoicehash{'type_'.$_}.                                '</a></td><td>'.$multichoicehash{'type_'.$id}.
       '</td></tr>');        '</td></tr>');
                      }                       }
                      $r->print('</table></body></html>');                       $r->print('</table>');
      return OK;  
                   } else {                    } else {
       my $bodytag=&Apache::loncommon::bodytag('No Resource');        my $bodytag=&Apache::loncommon::bodytag('No Resource');
                      $r->print(<<ENDNONE);        $r->print(<<ENDNONE);
 <head><title>No Resource</title></head>  <head><title>No Resource</title></head>
 $bodytag  $bodytag
 <h3>Next resource could not be identified.</h3>  <h3>$lt{'title'}</h3>
 <p>You probably are at the <b>beginning</b> or the <b>end</b> of the   <p>$lt{'explain'}</p>
 course.</p>  
 <ul>  
 <li><a href="/adm/flip?postdata=return:">Go Back</a></li>  
 <li><a href="/adm/navmaps">Navigate Course Content</a></li>  
 </ul>  
 </body>  
 </html>  
 ENDNONE  ENDNONE
                      return OK;    }
          }    $r->print(<<ENDMENU);
      }  <ul>
   <li><a href="/adm/flip?postdata=return:">$lt{'back'}</a></li>
   <li><a href="/adm/navmaps">$lt{'nav'}</a></li>
   </ul></body></html>
   ENDMENU
                     return OK;
         }
   } else {    } else {
 # ------------------------------------------------- Problem, could not tie hash  # ------------------------------------------------- Problem, could not tie hash
               $ENV{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing";                $env{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing";
               return HTTP_NOT_ACCEPTABLE;                 return HTTP_NOT_ACCEPTABLE; 
           }            }
       } else {        } else {
 # ---------------------------------------- No, could not determine where we are  # ---------------------------------------- No, could not determine where we are
          $r->internal_redirect('/adm/ambiguous');    $r->internal_redirect('/adm/ambiguous');
       }        }
   } else {    } else {
 # -------------------------- Class was not initialized or page fliped strangely  # -------------------------- 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; 
   }     } 
 }  }

Removed from v.1.40  
changed lines
  Added in v.1.62


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.