Diff for /rat/lonpageflip.pm between versions 1.84 and 1.112

version 1.84, 2014/04/28 20:04:55 version 1.112, 2022/10/19 00:03:12
Line 36  use LONCAPA; Line 36  use LONCAPA;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http REDIRECT);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonnavmaps();
   use Apache::lonuserstate;
 use Apache::lonlocal;  use Apache::lonlocal;
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
Line 82  sub hash_src { Line 84  sub hash_src {
     my ($mapid,$resid)=split(/\./,$id);      my ($mapid,$resid)=split(/\./,$id);
     my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},      my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},
   $resid,$hash{'src_'.$id});    $resid,$hash{'src_'.$id});
       my $anchor;
       if ($hash{'ext_'.$id} eq 'true:') {
           if ($hash{'src_'.$id} =~ /(\#.+)$/) {
               $anchor = $1;
           }
       }
     if ($hash{'encrypted_'.$id}) {      if ($hash{'encrypted_'.$id}) {
  return (&Apache::lonenc::encrypted($hash{'src_'.$id}),   return (&Apache::lonenc::encrypted($hash{'src_'.$id}),
  &Apache::lonenc::encrypted($symb));   &Apache::lonenc::encrypted($symb),
                   $hash{'encrypted_'.$id},$anchor);
     }      }
     return ($hash{'src_'.$id},$symb);      return ($hash{'src_'.$id},$symb,$hash{'encrypted_'.$id},$anchor);
 }  }
   
 sub move {  sub move {
     my ($next,$endupmap,$direction) = @_;      my ($next,$endupmap,$direction,$firstres) = @_;
     my $safecount=0;      my $safecount=0;
     my $allowed=0;      my $allowed=0;
       my $deeplinkonly=0;
       my $deeplinkchecked;
       my $deeplink_login_pc;
       my $prev=$next;
       my ($prevmapid)=split(/\./,$next);
     do {      do {
  ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction);   ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction);
   
Line 103  sub move { Line 117  sub move {
  if ($url eq '' || $symb eq '') {   if ($url eq '' || $symb eq '') {
     $allowed = 0;      $allowed = 0;
  } else {   } else {
     my $priv = &Apache::lonnet::allowed('bre',$url,$symb);              my $nodeeplinkcheck = 0;
     $allowed = (($priv eq 'F') || ($priv eq '2'));              if ($hash{'is_map_'.$next}) {
                   $nodeeplinkcheck = 1;
               }
       my $priv = &Apache::lonnet::allowed('bre',$url,$symb,'','','','',$nodeeplinkcheck);
       $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A'));
  }   }
           $deeplinkonly = 0;
           if ($hash{'deeplinkonly_'.$next}) {
               my ($value,$level) = map { &unescape($_); } split(/:/,$hash{'deeplinkonly_'.$next});
               my ($state,$others,$listed,$scope,$protect) = split(/,/,$value);
               unless (($state eq 'both') || ($hash{'is_map_'.$next})) {
                   if ($level eq 'resource') {
                       $deeplinkonly = 1;
                   } elsif ($level eq 'map') {
                       if ($scope eq 'rec') {
                           unless ($mapid == $prevmapid) {
                               unless ($deeplinkchecked) {
                                   $deeplink_login_pc = &get_deeplink_login_pc();
                                   $deeplinkchecked = 1;
                               }
                               if ($deeplink_login_pc) {
                                   my $poss_map_pc;
                                   if ($hash{'is_map_'.$next}) {
                                       $poss_map_pc = $hash{'map_pc_'.$url};
                                   } else {
                                       $poss_map_pc = $hash{'map_pc_'.$hash{'map_id_'.$mapid}};
                                   }
                                   unless ($deeplink_login_pc == $poss_map_pc) {
                                       unless (grep(/^$deeplink_login_pc$/,split(/,/,$hash{'map_hierarchy_'.$poss_map_pc}))) {
                                           $deeplinkonly = 1;
                                       }
                                   }
                               } else {
                                   $deeplinkonly = 1;
                               }
                           }
                       } elsif ($mapid != $prevmapid) {
                           $deeplinkonly = 1;
                       }
                   }
               }
           } elsif (($hash{'deeplinkonly_'.$prev}) && (!$firstres)) {
               my ($value,$level) = map { &unescape($_); } split(/:/,$hash{'deeplinkonly_'.$prev});
               my ($state,$others,$listed,$scope,$protect) = split(/,/,$value);
               unless (($state eq 'both') || ($hash{'is_map_'.$prev})) {
                   if ($level eq 'resource') {
                       $deeplinkonly = 1;
                   } elsif ($level eq 'map') {
                       if ($scope eq 'rec') {
                           unless ($mapid == $prevmapid) {
                               unless ($deeplinkchecked) {
                                   $deeplink_login_pc = &get_deeplink_login_pc();
                                   $deeplinkchecked = 1;
                               }
                               if ($deeplink_login_pc) {
                                   my $poss_map_pc;
                                   if ($hash{'is_map_'.$prev}) {
                                       $poss_map_pc = $hash{'map_pc_'.$url};
                                   } else {
                                       $poss_map_pc = $hash{'map_pc_'.$hash{'map_id_'.$mapid}};
                                   }
                                   unless ($deeplink_login_pc == $poss_map_pc) {
                                       unless (grep(/^$deeplink_login_pc$/,split(/,/,$hash{'map_hierarchy_'.$poss_map_pc}))) {
                                           $deeplinkonly = 1;
                                       }
                                   }
                               }
                           }
                       } else {
                           if ($mapid != $prevmapid) {
                               $deeplinkonly = 1;
                           }
                       }
                   }
               }
           }
  $safecount++;   $safecount++;
     } while (   ($next)      } while (   ($next)
      && ($next!~/\,/)       && ($next!~/\,/)
      && (       && (
     (!$hash{'src_'.$next})      (!$hash{'src_'.$next})
  || (   || (
         (!$env{'request.role.adv'})                          (!$env{'request.role.adv'})
      &&  $hash{'randomout_'.$next}                       && (($hash{'randomout_'.$next})
                        ||  ($deeplinkonly)
                        ||  ($hash{'deeplinkout_'.$next}))
     )      )
  || (!$allowed)   || (!$allowed)
  )   )
Line 148  sub get_next_possible_move { Line 238  sub get_next_possible_move {
           }            }
                           if ($thiscond>$mincond) { $mincond=$thiscond; }                            if ($thiscond>$mincond) { $mincond=$thiscond; }
               }                }
                   }                     }
   foreach my $id (split(/\,/,$posnext))  {    foreach my $id (split(/\,/,$posnext))  {
                       my ($linkid,$condval)=split(/\:/,$id);                        my ($linkid,$condval)=split(/\:/,$id);
                       if ($condval>=$mincond) {                        if ($condval>=$mincond) {
Line 190  sub get_next_possible_move { Line 280  sub get_next_possible_move {
  }   }
  if ($thiscond>$mincond) { $mincond=$thiscond; }   if ($thiscond>$mincond) { $mincond=$thiscond; }
      }       }
  }    }
  foreach my $id (split(/\,/,$posnext)) {   foreach my $id (split(/\,/,$posnext)) {
      my ($linkid,$condval)=split(/\:/,$id);       my ($linkid,$condval)=split(/\:/,$id);
      if ($condval>=$mincond) {       if ($condval>=$mincond) {
Line 223  sub first_accessible_resource { Line 313  sub first_accessible_resource {
     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)) {
  $furl=$hash{'first_url'};   $furl=$hash{'first_url'};
  my %args;   my (%args,$url,$argstr);
  my ($url,$args) = split(/\?/,$furl);   if ($furl =~ m{^/enc/}) {
  foreach my $pair (split(/\&/,$args)) {      ($url,$argstr) = split(/\?/,&Apache::lonenc::unencrypted($furl));
    } else {
       ($url,$argstr) = split(/\?/,$furl);
    }
    foreach my $pair (split(/\&/,$argstr)) {
     my ($name,$value) = split(/=/,$pair);      my ($name,$value) = split(/=/,$pair);
     $args{&unescape($name)} = &unescape($value);      $args{&unescape($name)} = &unescape($value);
  }   }
         if (!&Apache::lonnet::allowed('bre',$url,$args{'symb'})) {          my $priv = &Apache::lonnet::allowed('bre',$url,$args{'symb'});
           my $allowed = (($priv eq 'F') || ($priv eq '2') || ($priv eq 'A'));
           if (!$allowed) {
 # Wow, we cannot see this ... move forward to the next one that we can see  # 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');      my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward',1);
 # Build the new URL  # Build the new URL
     my ($newmapid,$newresid)=split(/\./,$newrid);              if ($newrid eq '') {
     my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid});                  $furl = '/adm/navmaps';
     $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb });              } else {
     if ($hash{'encrypted_'.$newrid}) {          my ($newmapid,$newresid)=split(/\./,$newrid);
  $furl=&Apache::lonenc::encrypted($furl);          my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid});
     }          $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb });
           if ($hash{'encrypted_'.$newrid}) {
       $furl=&Apache::lonenc::encrypted($furl);
           }
               }
  }   }
  untie(%hash);   untie(%hash);
  return $furl;   return $furl;
Line 247  sub first_accessible_resource { Line 347  sub first_accessible_resource {
     }      }
 }  }
   
   sub first_answerable_ressymb {
       my $navmap = Apache::lonnavmaps::navmap->new;
       return unless (ref($navmap));
       my $iterator = $navmap->getIterator(undef,undef,undef,1);
       return unless (ref($iterator));
       my ($curRes,$result);
       while ($curRes = $iterator->next()) {
           if (ref($curRes) && $curRes->is_problem()) {
               foreach my $part (@{$curRes->parts()}) {
                   if ($curRes->tries($part) < $curRes->maxtries($part)) {
                       $result = $curRes->link().'?symb='.$curRes->shown_symb();
                       last;
                   }    
               }
           }
       }
       if ($result) {
           return $result; 
       } else {
           return &first_accessible_resource(); 
       }
   }
   
   sub check_http_req {
       my ($srcref,$hostname) = @_;
       return unless (ref($srcref) eq 'SCALAR');
       my $usehttp;
       if ($env{'request.course.id'}) {
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) &&
               ($ENV{'SERVER_PORT'} == 443) &&
               ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
               unless ((&Apache::lonnet::uses_sts()) ||
                       (&Apache::lonnet::waf_allssl($hostname))) {
                   $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1';
                   $usehttp = 1;
               }
           } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) &&
                    ($ENV{'SERVER_PORT'} == 443)) {
               unless ((&Apache::lonnet::uses_sts()) ||
                       (&Apache::lonnet::waf_allssl($hostname))) {
                   my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/);
                   $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; 
                   $usehttp = 1;
               }
           }
       }
       return $usehttp;
   }
   
   sub reinited_js {
       my ($url,$cid,$timeout) = @_;
       if (!$timeout) {
           $timeout = 0;
       }
       return <<"END";
   <script type="text/javascript">
   // <![CDATA[
   setTimeout(function() {
       var newurl = '$url';
       if (document.getElementById('LC_update_$cid')) {
           document.getElementById('LC_update_$cid').style.display = 'none';
       }
       if ((newurl !== null) && (newurl !== '') && (newurl !== 'undefined')) {
           window.location.href = "$url";
       }
   }, $timeout);
   // ]]>
   </script>
   END
   }
   
   sub get_deeplink_login_pc {
       my $deeplink_login_pc;
       if (($env{'request.deeplink.login'}) && ($env{'request.course.id'})) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
           if ($deeplink_symb) {
               my $loginmap;
               if ($deeplink_symb =~ /\.(page|sequence)$/) {
                   $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
               } else {
                   $loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[0]);
               }
               $deeplink_login_pc = $hash{'map_pc_'.$loginmap};
           }
       }
       return $deeplink_login_pc;
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
Line 263  sub handler { Line 455  sub handler {
   my %cachehash=();     my %cachehash=(); 
   my $multichoice=0;    my $multichoice=0;
   my %multichoicehash=();    my %multichoicehash=();
   my ($redirecturl,$redirectsymb);    my %prog_state=();
     my ($redirecturl,$redirectsymb,$enc,$anchor,$deeplinklevel);
   my $next='';    my $next='';
     my $hostname = $r->hostname();
   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+)\:(.*)/;        my ($direction,$currenturl) = ($env{'form.postdata'}=~/(\w+)\:(.*)/);
       my $direction=$1;  
       my $currenturl=$2;  
       if ($currenturl=~m|^/enc/|) {        if ($currenturl=~m|^/enc/|) {
   $currenturl=&Apache::lonenc::unencrypted($currenturl);            $currenturl=&Apache::lonenc::unencrypted($currenturl);
       }        }
       $currenturl=~s/\.\d+\.(\w+)$/\.$1/;        $currenturl=~s/\.\d+\.(\w+)$/\.$1/;
         $currenturl=~s/^https?\:\/\///;
         $currenturl=~s/^[^\/]+//;
         my ($preupdatepos,$last,$reinitcheck);
         if ($direction eq 'return') {
             if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                       &GDBM_READER(),0640)) {
                 $last=$hash{'last_known'};
                 untie(%hash);
             }
         } elsif ($direction eq 'firstanswerable') {
             my $furl = &first_answerable_ressymb();
             my $usehttp = &check_http_req(\$furl,$hostname);
             if (($usehttp) && ($hostname ne '')) {
                 $furl='http://'.$hostname.$furl;
             } else {
                 $furl=&Apache::lonnet::absolute_url().$furl;
             }
             &Apache::loncommon::content_type($r,'text/html');
             $r->header_out(Location => $furl);
             return REDIRECT;
         } elsif ($direction eq 'endplacement') {
             &Apache::loncommon::content_type($r,'text/html');
             $r->send_http_header;
             $r->print(&Apache::lonplacementtest::showresult());
             return OK;
         }
         if ($env{'request.course.id'}) {
             # Check if course needs to be re-initialized
             my $loncaparev = $r->dir_config('lonVersion');
             ($reinitcheck,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);
             if ($reinitcheck eq 'switch') {
                 &Apache::loncommon::content_type($r,'text/html');
                 $r->send_http_header;
                 $r->print(&Apache::loncommon::check_release_result(@reinit));
                 return OK;
             }
             my ($cnum,$cdom);
             if ($reinitcheck) {
                 $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                 $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
             }
             if (($reinitcheck eq 'main') || ($reinitcheck eq 'both')) {
                 $preupdatepos = &Apache::lonnet::symbread($currenturl);
                 unless ($direction eq 'return') {
                     if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                                   &GDBM_READER(),0640)) {
                         $last=$hash{'last_known'};
                         untie(%hash);
                     }
                 }
                 &Apache::loncommon::content_type($r,'text/html');
                 $r->send_http_header;
                 $r->print(&Apache::loncommon::start_page('Content Changed'));
                 my $preamble = '<div id="LC_update_'.$env{'request.course.id'}.'" class="LC_info">'.
                                '<br />'.
                                &mt('Your course session is being updated because of recent changes by course personnel.').
                                ' '.&mt('Please be patient').'.<br /></div>'.
                                '<div style="padding:0;clear:both;margin:0;border:0"></div>';
                 %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);
                 &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course'));
                 my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");
                 &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!'));
                 if ($ferr) {
                     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                     my $requrl = $r->uri;
                     $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
                     $env{'user.reinit'} = 1;
                     return HTTP_NOT_ACCEPTABLE;
                 } else {
                     if ($last) {
                         my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last);
                         unless (&Apache::lonnet::symbverify($last,$fn)) {
                             undef($last);
                         }
                     }
                 }
             }
             if (($reinitcheck eq 'both') || ($reinitcheck eq 'supp')) {
                 my ($supplemental,$refs_updated) = &Apache::lonnet::get_supplemental($cnum,$cdom);
                 unless ($refs_updated) {
                     &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental);
                 }
             }
         }
       if ($direction eq 'firstres') {        if ($direction eq 'firstres') {
   my $furl=&first_accessible_resource();    my $furl=&first_accessible_resource();
   &Apache::loncommon::content_type($r,'text/html');            my $usehttp = &check_http_req(\$furl,$hostname);
   $r->header_out(Location =>             if (($usehttp) && ($hostname ne '')) {
  &Apache::lonnet::absolute_url().$furl);                $furl='http://'.$hostname.$furl;
                  } else {
   return REDIRECT;                $furl=&Apache::lonnet::absolute_url().$furl;
             }
             if ($reinitcheck eq 'update') {
                 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                 $r->print(&reinited_js($furl,$env{'request.course.id'},100));
                 $r->print(&Apache::loncommon::end_page());
                 return OK;
             } else {
         &Apache::loncommon::content_type($r,'text/html');
         $r->header_out(Location => $furl);
         return REDIRECT;
             }
       }        }
       if ($direction eq 'return') {        if ($direction eq 'return') {
 # -------------------------------------------------------- Return to last known  # -------------------------------------------------------- Return to last known
          my $last;           my ($newloc,$usehttp);
          if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',  
                     &GDBM_READER(),0640)) {  
      $last=$hash{'last_known'};  
              untie(%hash);  
          }  
          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,$id,$fn)=&Apache::lonnet::decode_symb($last);              my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last);
     $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id;      $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id;
     $newloc=$hash{'src_'.$id};      $newloc=$hash{'src_'.$id};
     if ($newloc) {      if ($newloc) {
  if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); }                  $usehttp = &check_http_req(\$newloc,$hostname);
          if ($hash{'encrypted_'.$id}) { 
                       $newloc=&Apache::lonenc::encrypted($newloc);
                   }
                   if ($newloc =~ m{^(/adm/wrapper/ext/[^\#]+)(?:|(\#[^\#]+))$}) {
                       my ($url,$anchor) = ($1,$2);
                       if ($anchor) {
                           $newloc = $url.(($url=~/\?/)?'&':'?').'symb='.&escape($last).$anchor;
                       }
                   }
     } else {      } else {
  $newloc='/adm/navmaps';   $newloc='/adm/navmaps';
     }      }
             untie %hash;              untie %hash;
          } else {           } else {
     $newloc='/adm/navmaps';      $newloc='/adm/navmaps';
          }             }
            if (($usehttp) && ($hostname ne '')) {
                $newloc='http://'.$hostname.$newloc;
            } else {
                $newloc=&Apache::lonnet::absolute_url().$newloc
            }
            if ($reinitcheck eq 'update') {
                $r->print(&reinited_js($newloc,$env{'request.course.id'},100));
                $r->print(&Apache::loncommon::end_page());
                return OK;
            } else {
      &Apache::loncommon::content_type($r,'text/html');       &Apache::loncommon::content_type($r,'text/html');
      $r->header_out(Location =>        $r->header_out(Location => $newloc);
     &Apache::lonnet::absolute_url().$newloc);  
        
      return REDIRECT;       return REDIRECT;
            }
       }        }
       $currenturl=~s/^https?\:\/\///;  
       $currenturl=~s/^[^\/]+//;  
 #  #
 # Is the current URL on the map? If not, start with last known URL  # Is the current URL on the map? If not, start with last known URL
 #  #
   
       unless (&Apache::lonnet::is_on_map($currenturl)) {        unless (&Apache::lonnet::is_on_map($currenturl)) {
  my $last;           if ($preupdatepos) {
          if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',               undef($preupdatepos);
                     &GDBM_READER(),0640)) {           } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
      $last=$hash{'last_known'};                              &GDBM_READER(),0640)) {
                $last=$hash{'last_known'};
              untie(%hash);               untie(%hash);
          }           }
          if ($last) {           if ($last) {
      $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]);       $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]);
  } else {   } else {
  &Apache::loncommon::content_type($r,'text/html');               my $newloc = &Apache::lonnet::absolute_url().
  $r->header_out(Location =>                             '/adm/navmaps'; 
  &Apache::lonnet::absolute_url().               if ($reinitcheck eq 'update') {
  '/adm/noidea.html');                   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  return REDIRECT;                   $r->print(&reinited_js($newloc,$env{'request.course.id'},100));
                    $r->print(&Apache::loncommon::end_page());
                    return OK;
                } else {
            &Apache::loncommon::content_type($r,'text/html');
            $r->header_out(Location => $newloc); 
            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 ($preupdatepos) {
             $position = $preupdatepos;
         } else {
             $position=Apache::lonnet::symbread($currenturl);
         }
         if ($position) {
 # ------------------------------------------------------------------------- Yes  # ------------------------------------------------------------------------- Yes
   my ($startoutmap,$mapnum,$thisurl)=&Apache::lonnet::decode_symb($position);    my ($startoutmap,$mapnum,$thisurl)=&Apache::lonnet::decode_symb($position);
           $cachehash{$startoutmap}{$thisurl}=[$thisurl,$mapnum];            $cachehash{$startoutmap}{$thisurl}=[$thisurl,$mapnum];
Line 360  sub handler { Line 670  sub handler {
                   @possibilities=split(/\,/,$next);                    @possibilities=split(/\,/,$next);
                   if ($#possibilities==0) {                    if ($#possibilities==0) {
 # ---------------------------------------------- Only one possibility, redirect  # ---------------------------------------------- Only one possibility, redirect
               ($redirecturl,$redirectsymb)=&hash_src($next);                ($redirecturl,$redirectsymb,$enc,$anchor)=&hash_src($next);
                       $cachehash{$endupmap}{$redirecturl}=                        $cachehash{$endupmap}{$redirecturl}=
   [$redirecturl,(split(/\./,$next))[1]];    [$redirecturl,(split(/\./,$next))[1]];
                   } else {                    } else {
Line 385  sub handler { Line 695  sub handler {
       } else {        } else {
 # -------------------------------------------------------------- No place to go  # -------------------------------------------------------------- No place to go
                   $multichoice=-1;                    $multichoice=-1;
                     if ($position && $env{'request.deeplink.login'}) {
                         my ($map,$resid,$url) = &Apache::lonnet::decode_symb($position);
                         my $mapid = $hash{'map_pc_'.&Apache::lonnet::clutter($map)};
                         my $position_deeplink = $hash{'deeplinkonly_'.$mapid.'.'.$resid};
                         if ($position_deeplink) {
                             (my $value,$deeplinklevel) = map { &unescape($_); } 
                                                          split(/:/,$position_deeplink);
                         }
                     }
               }                }
 # ----------------- 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,'notasymb'];                $cachehash{$startoutmap}{'last_direction'}=[$direction,'notasymb'];
               foreach my $thismap (keys %cachehash) {                foreach my $thismap (keys(%cachehash)) {
   my $mapnum=$cachehash{$thismap}->{'mapnum'};    my $mapnum=$cachehash{$thismap}->{'mapnum'};
   delete($cachehash{$thismap}->{'mapnum'});    delete($cachehash{$thismap}->{'mapnum'});
   &Apache::lonnet::symblist($thismap,    &Apache::lonnet::symblist($thismap,
Line 405  sub handler { Line 724  sub handler {
   if ($direction eq 'back') {    if ($direction eq 'back') {
                      &Apache::lonnet::linklog($redirecturl,$currenturl);                       &Apache::lonnet::linklog($redirecturl,$currenturl);
   }    }
 # ------------------------------------------------- Check for critical messages  # ------------------------------------- Check for and display critical messages
   if ((time-$env{'user.criticalcheck.time'})>300) {                    my ($redirect, $url) = &Apache::loncommon::critical_redirect(300,'flip');
                      my @what=&Apache::lonnet::dump                    unless ($redirect) {
                                   ('critical',$env{'user.domain'},                        my $usehttp = &check_http_req(\$redirecturl,$hostname);
                                               $env{'user.name'});                        if (($usehttp) && ($hostname ne '')) {
                      if ($what[0]) {                            $url='http://'.$hostname.$redirecturl;
                 if (($what[0] ne 'con_lost') &&                         } else {
                             ($what[0]!~/^error\:/)) {                            $url=&Apache::lonnet::absolute_url().$redirecturl;
                    $redirecturl='/adm/email?critical=display';                        }
    $redirectsymb='';                        my $addanchor;
                         }                        if (($anchor ne '') && (!$enc || $env{'request.role.adv'})) {
                      }                            $addanchor = 1;
                      &Apache::lonnet::appenv({'user.criticalcheck.time'=>time});                            $url =~ s/\#.+$//;
   }                        }
                         $url = &add_get_param($url, { 'symb' => $redirectsymb});
   &Apache::loncommon::content_type($r,'text/html');                        if ($addanchor) {
   my $url=&Apache::lonnet::absolute_url().$redirecturl;                            $url .= $anchor;
   $url = &add_get_param($url, { 'symb' => $redirectsymb});                        }
                   $r->header_out(Location => $url);                    }
                   return REDIRECT;                    if ($reinitcheck eq 'update') {
                         &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                         $r->print(&reinited_js($url,$env{'request.course.id'},100)); 
                         $r->print(&Apache::loncommon::end_page());
                         return OK;
                     } else {
                         &Apache::loncommon::content_type($r,'text/html');
                         $r->header_out(Location => $url);
                         return REDIRECT;
                     }
       } else {        } else {
 # --------------------------------------------------------- There was a problem  # --------------------------------------------------------- There was a problem
                   &Apache::loncommon::content_type($r,'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',    my %lt=&Apache::lonlocal::texthash('title' => 'End of Sequence',
                                                        'deeplink' => 'No link available',
                                                        'deeplinkres' =>
                                                        'Navigation to other content is unavailable when accessing content via deep-linking',
                                                        'deeplinkmap' =>
                                                        'You have reached the end of the sequence of available materials for access via deep-linking',
      'explain' =>       'explain' =>
      'You have reached the end of the sequence of materials.',       'You have reached the end of the sequence of materials.',
      'back' => 'Go Back',       'back' => 'Go Back',
Line 439  sub handler { Line 772  sub handler {
      'pick' =>       'pick' =>
      'Please click on the the resource you intend to access',       'Please click on the the resource you intend to access',
      'titleheader' => 'Title',       'titleheader' => 'Title',
      'type' => 'Type');       'type' => 'Type',
                                                        'update' => 'Content updated',
                                                        'expupdate' => 'As a result of a recent update to the sequence of materials, it is not possible to complete the page flip.',
                                                        'gonav' => 'Go to the Contents page to select a resource to display.',
                                                        );
                   if (&Apache::loncommon::course_type() eq 'Community') {                    if (&Apache::loncommon::course_type() eq 'Community') {
                       $lt{'nav'} = &mt('Community Contents');                        $lt{'nav'} = &mt('Community Contents');
                   }                    }
Line 456  $lt{'pick'}: Line 793  $lt{'pick'}:
 <tr><th>$lt{'titleheader'}</th><th>$lt{'type'}</th></tr>  <tr><th>$lt{'titleheader'}</th><th>$lt{'type'}</th></tr>
 ENDSTART  ENDSTART
                      foreach my $id (@possibilities) {                       foreach my $id (@possibilities) {
                           my $src = $multichoicehash{'src_'.$id};
                           my $usehttp = &check_http_req(\$src,$hostname);
                           if (($usehttp) && ($hostname ne '')) {
                               $src = 'http://'.$hostname.$src;
                           }
                         $r->print(                          $r->print(
                               '<tr><td><a href="'.                                '<tr><td><a href="'.
   &add_get_param($multichoicehash{'src_'.$id},    &add_get_param($src,
  {'symb' =>   {'symb' =>
       $multichoicehash{'symb_'.$id},        $multichoicehash{'symb_'.$id},
   }).'">'.    }).'">'.
Line 468  ENDSTART Line 810  ENDSTART
                      }                       }
                      $r->print('</table>');                       $r->print('</table>');
                   } else {                    } else {
                       $r->print(                        if ($reinitcheck) {
                           &Apache::loncommon::start_page('No Resource')                            if (&Apache::loncommon::course_type() eq 'Community') {
                          .'<h2>'.$lt{'title'}.'</h2>'                                $r->print(
                          .'<p>'.$lt{'explain'}.'</p>');                                    &Apache::loncommon::start_page('Community Contents Updated'));
                   }                            } else { 
                   $r->print(                                $r->print(
                       &Apache::lonhtmlcommon::actionbox(                                    &Apache::loncommon::start_page('Course Contents Updated'));
                           ['<a href="/adm/flip?postdata=return:">'.$lt{'back'}.'</a></li>',                            }
                            '<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'                            $r->print('<h2>'.$lt{'update'}.'</h2>'
                           ])                                    .'<p>'.$lt{'expupdate'}.'<br />'
                      .&Apache::loncommon::end_page());                                    .$lt{'gonav'}.'</p>');
                         } else {
                             if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') && 
                                 (!$env{'request.role.adv'})) {
                                 my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1); 
                                 if ($incomplete) {
                                     $r->print(&Apache::lonplacementtest::showincomplete($incomplete)); 
                                 } else {
                                     $r->print(&Apache::lonplacementtest::showresult(1));
                                 }
                             } else {
                                 $r->print(
                                     &Apache::loncommon::start_page('No Resource'));
                                 if ($deeplinklevel eq 'resource') {
                                     $r->print('<h2>'.$lt{'deeplink'}.'</h2>'
                                              .'<p>'.$lt{'deeplinkres'}.'</p>');
                                 } elsif ($deeplinklevel eq 'map') {
                                     $r->print('<h2>'.$lt{'title'}.'</h2>'
                                              .'<p>'.$lt{'deeplinkmap'}.'</p>');
                                 } else {
                                     $r->print('<h2>'.$lt{'title'}.'</h2>'
                                              .'<p>'.$lt{'explain'}.'</p>');
                                 }
                             }
                         }
     }
                     unless (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') &&
                             (!$env{'request.role.adv'})) {
                         if ($deeplinklevel) {
                             $r->print(
                                 &Apache::lonhtmlcommon::actionbox(
                                     ['<a href="/adm/flip?postdata=return:">'.$lt{'back'}.'</a>']));
                         } elsif ((!@possibilities) && ($reinitcheck))  {
                             $r->print(
                                 &Apache::lonhtmlcommon::actionbox(
                                     ['<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'
                                     ]));
                         } else {
                             $r->print(
                                 &Apache::lonhtmlcommon::actionbox(
                                     ['<a href="/adm/flip?postdata=return:">'.$lt{'back'}.'</a></li>',
                                      '<a href="/adm/navmaps">'.$lt{'nav'}.'</a></li>'
                                     ]));
                         }
   
                     }
                     $r->print(&Apache::loncommon::end_page());
         
                   return OK;                    return OK;
       }        }
   } else {    } else {
 # ------------------------------------------------- Problem, could not tie hash  # ------------------------------------------------- Problem, could not tie hash
                 if ($reinitcheck eq 'update') {
                     &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                     $r->print(&Apache::loncommon::end_page());
                 } 
               $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');            my $newloc = '/adm/ambiguous';
             if ($reinitcheck eq 'update') {
                 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
                 $r->print(&reinited_js($newloc,$env{'request.course.id'},100));
                 $r->print(&Apache::loncommon::end_page());
             } else {
         $r->internal_redirect($newloc);
             }
           return OK;            return OK;
       }        }
   } else {    } else {

Removed from v.1.84  
changed lines
  Added in v.1.112


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.