Diff for /rat/lonpageflip.pm between versions 1.25 and 1.59

version 1.25, 2002/05/23 15:07:55 version 1.59, 2005/11/10 19:16:02
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 50  use GDBM_File; Line 39  use GDBM_File;
       
 my %hash;  my %hash;
   
   sub cleanup {
       if (tied(%hash)){
    &Apache::lonnet::logthis('Cleanup pageflip: hash');
           unless (untie(%hash)) {
       &Apache::lonnet::logthis('Failed cleanup pageflip: hash');
           }
       }
   }
   
 sub addrid {  sub addrid {
     my ($current,$new,$condid)=@_;      my ($current,$new,$condid)=@_;
     unless ($condid) { $condid=0; }      unless ($condid) { $condid=0; }
     if (&Apache::lonnet::allowed('bre',$hash{'src_'.$new})) {  
  if ($current) {   if ($current) {
     $current.=','.$new;      $current.=','.$new;
         } else {          } else {
             $current=''.$new;              $current=''.$new;
         }          }
     }  
     return $current;      return $current;
 }  }
   
 sub fullmove {  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);
     }      }
     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 83  sub move { Line 93  sub move {
               my $posnext='';                my $posnext='';
               if ($direction eq 'forward') {                if ($direction eq 'forward') {
 # --------------------------------------------------------------------- Forward  # --------------------------------------------------------------------- Forward
                   if ($hash{'type_'.$rid} eq 'finish') {                    while ($hash{'type_'.$rid} eq 'finish') {
              $rid=$hash{'ids_/res/'.$mapurl};                $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
                   }                    }
                   map {                    map {
                       my $thiscond=                        my $thiscond=
Line 111  sub move { Line 121  sub move {
       $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]) {
Line 119  sub move { Line 133  sub move {
                   }                    }
               } elsif ($direction eq 'back') {                } elsif ($direction eq 'back') {
 # ------------------------------------------------------------------- Backwards  # ------------------------------------------------------------------- Backwards
                   if ($hash{'type_'.$rid} eq 'start') {                   while ($hash{'type_'.$rid} eq 'start') {
              $rid=$hash{'ids_/res/'.$mapurl};               $rid=$hash{'ids_'.$hash{'map_id_'.(split(/\./,$rid))[0]}};
                   }   }
                   map {                    map {
                       my $thiscond=                        my $thiscond=
       &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});        &Apache::lonnet::directcondval($hash{'condid_'.$hash{'undercond_'.$_}});
Line 147  sub move { Line 161  sub move {
       $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 157  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 165  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=();
   if (($ENV{'form.postdata'})&&($ENV{'request.course.fn'})) {     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']);
       $ENV{'form.postdata'}=~/(\w+)\:(.*)/;    if (($env{'form.postdata'})&&($env{'request.course.fn'})) {
         $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) {           if (($last) && (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db',
             $newloc='/res/'.(split(/\_\_\_/,$last))[1];                          &GDBM_READER(),0640))) {
               my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last);
       $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id;
       $newloc=$hash{'src_'.$id};
       if ($newloc) {
    if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); }
         
       } else {
    $newloc='/adm/navmaps';
       }
               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/^[^\/]+//;
       unless (($currenturl=~/^\/res\//) ||   #
               ($currenturl=~/^\/adm\/wrapper\//))  {  # Is the current URL on the map? If not, start with last known URL
   #
         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='/res/'.(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_/res/'.$startoutmap}.'.'.$mapnum;                my $rid=$hash{'map_pc_'.&Apache::lonnet::clutter($startoutmap)}.
                         '.'.$mapnum;
   
 # ------------------------------------------------- Move forward, backward, etc  # ------------------------------------------------- Move forward, backward, etc
               my $endupmap;                my $endupmap;
               ($next,$endupmap)=&move($rid,$startoutmap,$direction);                ($next,$endupmap)=&move($rid,$startoutmap,$direction);
 # -------------------------------------- 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!~/\,/) && (!$hash{'src_'.$next})                while (($next) && ($next!~/\,/) && 
                      && ($safecount<25)) {                       ((!$hash{'src_'.$next}) || 
         ((!$env{'request.role.adv'}) && $hash{'randomout_'.$next}))
                        && ($safecount<10000)) {
                   ($next,$endupmap)=&move($next,$endupmap,$direction);                    ($next,$endupmap)=&move($next,$endupmap,$direction);
                   $safecount++;                    $safecount++;
               }                }
Line 249  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;
Line 260  sub handler { Line 342  sub handler {
   $multichoicehash{'src_'.$_}=$hash{'src_'.$_};    $multichoicehash{'src_'.$_}=$hash{'src_'.$_};
                           $multichoicehash{'title_'.$_}=$hash{'title_'.$_};                            $multichoicehash{'title_'.$_}=$hash{'title_'.$_};
                           $multichoicehash{'type_'.$_}=$hash{'type_'.$_};                            $multichoicehash{'type_'.$_}=$hash{'type_'.$_};
                             (my $first, my $second) = $_ =~ /(\d+).(\d+)/;
                             my $symbSrc = Apache::lonnet::declutter($hash{'src_'.$_});
                             $multichoicehash{'symb_'.$_} = 
                                 Apache::lonnet::declutter($hash{'map_id_'.$first}.'___'.
                                                           $second.'___'.$symbSrc);
                                                            
                           my ($choicemap,$choiceres)=split(/\./,$_);                            my ($choicemap,$choiceres)=split(/\./,$_);
                           $cachehash    my $map=&Apache::lonnet::declutter($hash{'src_'.$choicemap});
  {&Apache::lonnet::declutter($hash{'src_'.$choicemap})}    my $url=$multichoicehash{'src_'.$_};
                          {&Apache::lonnet::declutter(                            $cachehash{$map}{$url}=[$url,$choiceres];
       $multichoicehash  
                                                          {'src_'.$_}  
                                                        )}  
                                  =$choiceres;  
                       } @possibilities;                        } @possibilities;
                   }                    }
       } else {        } else {
Line 277  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) {
 # ----------------------------------------------------- There is a URL to go to  # ----------------------------------------------------- There is a URL to go to
   $r->content_type('text/html');    if ($direction eq 'forward') {
                   $r->header_out(Location =>                        &Apache::lonnet::linklog($currenturl,$redirecturl);
                                 'http://'.$ENV{'HTTP_HOST'}.$redirecturl);    }
     if ($direction eq 'back') {
                        &Apache::lonnet::linklog($redirecturl,$currenturl);
     }
   # ------------------------------------------------- Check for critical messages
     if ((time-$env{'user.criticalcheck.time'})>300) {
                        my @what=&Apache::lonnet::dump
                                     ('critical',$env{'user.domain'},
                                                 $env{'user.name'});
                        if ($what[0]) {
                   if (($what[0] ne 'con_lost') && 
                               ($what[0]!~/^error\:/)) {
                      $redirecturl='/adm/email?critical=display';
      $redirectsymb='';
                           }
                        }
                        &Apache::lonnet::appenv('user.criticalcheck.time'=>time);
     }
   
     &Apache::loncommon::content_type($r,'text/html');
     my $url='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=
                                &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>
 <body bgcolor="#FFFFFF">  $bodytag
 <h1>LON-CAPA</h1>  <h3>$lt{'wherenext'}</h3>
 There are several possibilities of where to go next.  
 <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
                      map {                       foreach (@possibilities) {
                         $r->print(                          $r->print(
                               '<tr><td><a href="'.                                '<tr><td><a href="'.
                               $multichoicehash{'src_'.$_}.'">'.                                $multichoicehash{'src_'.$_}.'?symb=' .
                                     Apache::lonnet::escape($multichoicehash{'symb_'.$_}).'">'.
                               $multichoicehash{'title_'.$_}.                                $multichoicehash{'title_'.$_}.
                               '</a></td><td>'.$multichoicehash{'type_'.$_}.                                '</a></td><td>'.$multichoicehash{'type_'.$_}.
       '</td></tr>');        '</td></tr>');
                      } @possibilities;                       }
                      $r->print('</table></body></html>');                       $r->print('</table>');
      return OK;  
                   } else {                    } else {
                      $r->print(<<ENDNONE);        my $bodytag=&Apache::loncommon::bodytag('No Resource');
 <head><title>Choose Next Location</title></head>        $r->print(<<ENDNONE);
 <body bgcolor="#FFFFFF">  <head><title>No Resource</title></head>
 <img src="/adm/lonIcons/lonlogos.gif" align=right>  $bodytag
 <h1>Sorry!</h1>  <h3>$lt{'title'}</h3>
 <h2>Next resource could not be identified.</h2>  <p>$lt{'explain'}</p>
 <h3>You probably are at the beginning or the end of the course.</h3>  
 </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');    if ( &Apache::lonnet::mod_perl_version() == 2 ) {
         &Apache::lonnet::cleanenv();
     }
     $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.25  
changed lines
  Added in v.1.59


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.