Diff for /rat/lonpageflip.pm between versions 1.53 and 1.66

version 1.53, 2005/04/07 06:56:27 version 1.66, 2006/03/06 23:41:07
Line 46  sub cleanup { Line 46  sub cleanup {
     &Apache::lonnet::logthis('Failed cleanup pageflip: hash');      &Apache::lonnet::logthis('Failed cleanup pageflip: hash');
         }          }
     }      }
       return OK;
 }  }
   
 sub addrid {  sub addrid {
Line 73  sub fullmove { Line 74  sub fullmove {
   
 sub hash_src {  sub hash_src {
     my ($id)=@_;      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}) {      if ($hash{'encrypted_'.$id}) {
  return &Apache::lonenc::encrypted($hash{'src_'.$id});   return (&Apache::lonenc::encrypted($hash{'src_'.$id}),
    &Apache::lonenc::encrypted($symb));
     }      }
     return $hash{'src_'.$id};      return ($hash{'src_'.$id},$symb);
   }
   
   # Inputs are a url, adn a hash ref of
   # form name => value pairs
   # takes care of properly adding the form name elements and values to the 
   # the url doing proper escaping of the values and joining with ? or & as 
   # needed
   
   sub add_get_param {
       my ($url,$form_data) = @_;
       my $needs_question_mark = ($url !~ /\?/);
   
       while (my ($name,$value) = each(%$form_data)) {
    if ($needs_question_mark) {
       $url.='?';
       $needs_question_mark = 0;
    } else { 
       $url.='&';
    }
    $url.=$name.'='.&Apache::lonnet::escape($form_data->{$name});
       }
       return $url;
 }  }
   
 sub move {  sub move {
Line 92  sub move { Line 119  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 $condition= $hash{'conditions_'.$hash{'goesto_'.$id}};
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});       my $rescond  = &Apache::lonnet::docondval($condition);
                       if ($thiscond>=$mincond) {       my $linkcond = &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$id}});
        my $thiscond = ($rescond<$linkcond)?$rescond:$linkcond;
        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 (
Line 126  sub move { Line 155  sub move {
                     ((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 $condition= $hash{'conditions_'.$hash{'comesfrom_'.$id}};
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});       my $rescond  = &Apache::lonnet::docondval($condition);
                       if ($thiscond>=$mincond) {       my $linkcond = &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$id}});
           if ($posnext) {       my $thiscond = ($rescond<$linkcond)?$rescond:$linkcond;
              $posnext.=','.$_.':'.$thiscond;       if ($thiscond>=$mincond) {
                           } else {   if ($posnext) {
                              $posnext=$_.':'.$thiscond;               $posnext.=','.$id.':'.$thiscond;
           }   } else {
                           if ($thiscond>$mincond) { $mincond=$thiscond; }                               $posnext=$id.':'.$thiscond;
               }   }
                   } split(/\,/,$hash{'from_'.$rid});   if ($thiscond>$mincond) { $mincond=$thiscond; }
                   map {       }
                       my ($linkid,$condval)=split(/\:/,$_);   } 
                       if ($condval>=$mincond) {   foreach my $id (split(/\,/,$posnext)) {
           $next=&addrid($next,$hash{'comesfrom_'.$linkid},       my ($linkid,$condval)=split(/\:/,$id);
                                 $hash{'condid_'.$hash{'undercond_'.$linkid}});       if ($condval>=$mincond) {
                       }   $next=&addrid($next,$hash{'comesfrom_'.$linkid},
                   } split(/\,/,$posnext);         $hash{'condid_'.$hash{'undercond_'.$linkid}});
        }
    }
                   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 (
Line 171  sub move { Line 202  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 187  sub handler { Line 240  sub handler {
   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']);
Line 199  sub handler { Line 252  sub handler {
   $currenturl=&Apache::lonenc::unencrypted($currenturl);    $currenturl=&Apache::lonenc::unencrypted($currenturl);
       }        }
       $currenturl=~s/\.\d+\.(\w+)$/\.$1/;        $currenturl=~s/\.\d+\.(\w+)$/\.$1/;
       if ($direction eq 'return') {        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',
Line 217  sub handler { Line 283  sub handler {
  if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); }   if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); }
               
     } else {      } else {
  $newloc='/adm/noidea.html';   $newloc='/adm/navmaps';
     }      }
             untie %hash;              untie %hash;
          } else {           } else {
     $newloc='/adm/noidea.html';      $newloc='/adm/navmaps';
          }             }  
  &Apache::loncommon::content_type($r,'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 244  sub handler { Line 315  sub handler {
          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');       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?
Line 283  sub handler { Line 359  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}{$redirecturl}=                        $cachehash{$endupmap}{$redirecturl}=
   [$redirecturl,(split(/\./,$next))[1]];    [$redirecturl,(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);
   my $map=&Apache::lonnet::declutter($hash{'src_'.$choicemap});    my $map=&Apache::lonnet::declutter($hash{'src_'.$choicemap});
   my $url=$multichoicehash{'src_'.$_};    my $url=$multichoicehash{'src_'.$id};
                           $cachehash{$map}{$url}=[$url,$choiceres];                            $cachehash{$map}{$url}=[$url,$choiceres];
                       } @possibilities;                        }
                   }                    }
       } else {        } else {
 # -------------------------------------------------------------- No place to go  # -------------------------------------------------------------- No place to go
Line 337  sub handler { Line 413  sub handler {
                 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);
   }    }
   
   &Apache::loncommon::content_type($r,'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);    $url = &add_get_param($url, { 'symb' => $redirectsymb});
                     $r->header_out(Location => $url);
                   return REDIRECT;                    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',
        '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=' .    &add_get_param($multichoicehash{'src_'.$id},
                                   Apache::lonnet::escape($multichoicehash{'symb_'.$_}).'">'.   {'symb' =>
                               $multichoicehash{'title_'.$_}.        $multichoicehash{'symb_'.$id},
                               '</a></td><td>'.$multichoicehash{'type_'.$_}.    }).'">'.
                                 $multichoicehash{'title_'.$id}.
                                 '</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";
Line 399  ENDNONE Line 488  ENDNONE
           }            }
       } else {        } else {
 # ---------------------------------------- No, could not determine where we are  # ---------------------------------------- No, could not determine where we are
   if ( &Apache::lonnet::mod_perl_version() == 2 ) {  
       &Apache::lonnet::cleanenv();  
   }  
   $r->internal_redirect('/adm/ambiguous');    $r->internal_redirect('/adm/ambiguous');
       }        }
   } else {    } else {

Removed from v.1.53  
changed lines
  Added in v.1.66


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.