Diff for /loncom/interface/loncommon.pm between versions 1.332 and 1.342

version 1.332, 2006/04/13 19:01:25 version 1.342, 2006/04/18 22:35:41
Line 61  use POSIX qw(strftime mktime); Line 61  use POSIX qw(strftime mktime);
 use Apache::lonmenu();  use Apache::lonmenu();
 use Apache::lonlocal;  use Apache::lonlocal;
 use HTML::Entities;  use HTML::Entities;
   use Apache::lonhtmlcommon();
   use Apache::loncoursedata();
   
 my $readit;  my $readit;
   
Line 2751  Inputs: Line 2753  Inputs:
 =item * $notopbar, if true, keep the 'what is this' info but remove the  =item * $notopbar, if true, keep the 'what is this' info but remove the
                    navigational links                     navigational links
   
 =item * $bgcolor, used to override the bg coor on a webpage to a specific value  =item * $bgcolor, used to override the bgcolor on a webpage to a specific value
   
   =item * $notitle, if true keep the nav controls, but remove the title bar
   
   
 =back  =back
   
Line 2764  other decorations will be returned. Line 2769  other decorations will be returned.
   
 sub bodytag {  sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle,      my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle,
  $notopbar,$bgcolor)=@_;   $notopbar,$bgcolor,$notitle)=@_;
   
     $title=&mt($title);      $title=&mt($title);
   
     $function = &get_users_function() if (!$function);      $function = &get_users_function() if (!$function);
     my $img=&designparm($function.'.img',$domain);      my $img =    &designparm($function.'.img',$domain);
     my $pgbg= $bgcolor || &designparm($function.'.pgbg',$domain);      my $tabbg =  &designparm($function.'.tabbg',$domain);
     my $tabbg=&designparm($function.'.tabbg',$domain);      my $font =   &designparm($function.'.font',$domain);
     my $font=&designparm($function.'.font',$domain);      my $sidebg = &designparm($function.'.sidebg',$domain);
     my $link=&designparm($function.'.link',$domain);      my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);
     my $alink=&designparm($function.'.alink',$domain);  
     my $vlink=&designparm($function.'.vlink',$domain);      my %design = ( 'style'   => 'margin-top: 0px',
     my $sidebg=&designparm($function.'.sidebg',$domain);     'bgcolor' => $pgbg,
 # Accessibility font enhance     'text'    => $font,
     my $addstyle='';                     'alink'   => &designparm($function.'.alink',$domain),
     if ($env{'browser.fontenhance'} eq 'on') {     'vlink'   => &designparm($function.'.vlink',$domain),
  $addstyle=' font-size: x-large;';     'link'    => &designparm($function.'.link',$domain),);
     }      @$addentries{keys(%design)} = @design{keys(%design)};
   
  # role and realm   # role and realm
     my ($role,$realm)      my ($role,$realm)
        =&Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]);         =&Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]);
Line 2808  form, .inline { display: inline; } Line 2816  form, .inline { display: inline; }
 .center { text-align: center; }  .center { text-align: center; }
 .filename {font-family: monospace;}  .filename {font-family: monospace;}
 </style>  </style>
 <body bgcolor="$pgbg" text="$font" alink="$alink" vlink="$vlink" link="$link"  <body $extra_body_attr>
 style="margin-top: 0px;$addstyle" $extra_body_attr>  
 END  END
   
     $bodytag .= &Apache::lontexconvert::init_math_support();      $bodytag .= &Apache::lontexconvert::init_math_support();
Line 2823  END Line 2830  END
     } elsif ($env{'browser.interface'} eq 'textual') {      } elsif ($env{'browser.interface'} eq 'textual') {
 # Accessibility  # Accessibility
                       
         return $bodytag.&Apache::lonmenu::menubuttons($forcereg,'web',   $bodytag.=&Apache::lonmenu::menubuttons($forcereg,$forcereg);
                                                       $forcereg).   if (!$notitle) {
                '<h1>LON-CAPA: '.$title.'</h1>';      $bodytag.='<h1>LON-CAPA: '.$title.'</h1>';
    }
    return $bodytag;
     } elsif ($env{'environment.remote'} eq 'off') {      } elsif ($env{'environment.remote'} eq 'off') {
 # No Remote  # No Remote
  my $roleinfo=(<<ENDROLE);   my $roleinfo=(<<ENDROLE);
Line 2874  ENDROLE Line 2883  ENDROLE
             }              }
     $forcereg=1;      $forcereg=1;
         }          }
         my $titletable = '<table bgcolor="'.$pgbg.'" width="100%" border="0" '.          my $titletable;
    if (!$notitle) {
       $titletable =
    '<table bgcolor="'.$pgbg.'" width="100%" border="0" '.
                          'cellspacing="3" cellpadding="3">'.                           'cellspacing="3" cellpadding="3">'.
                          '<tr><td bgcolor="'.$tabbg.'">'.                           '<tr><td bgcolor="'.$tabbg.'">'.
                          $titleinfo.'</td>'.$roleinfo.'</tr></table>';                           $titleinfo.'</td>'.$roleinfo.'</tr></table>';
         if ($env{'request.state'} eq 'construct') {   }
    if ($env{'request.state'} eq 'construct') {
             if ($notopbar) {              if ($notopbar) {
                 $bodytag .= $titletable;                  $bodytag .= $titletable;
             } else {              } else {
                 $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable);                  $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg,
     $titletable);
             }              }
  } else {   } else {
             if ($notopbar) {              if ($notopbar) {
                 $bodytag .= $titletable;                  $bodytag .= $titletable;
             } else {              } else {
                 $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg).                  $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg).
                         $titletable;                          $titletable;
             }              }
         }          }
Line 2915  ENDROLE Line 2929  ENDROLE
     # Explicit link to get inline menu      # Explicit link to get inline menu
     my $menu='<br /><font size="2" face="Arial, Helvetica, sans-serif">&nbsp;<a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a></font>';      my $menu='<br /><font size="2" face="Arial, Helvetica, sans-serif">&nbsp;<a href="/adm/remote?action=collapse">'.&mt('Switch to Inline Menu Mode').'</a></font>';
     #      #
       if ($notitle) {
    return $bodytag;
       }
     return(<<ENDBODY);      return(<<ENDBODY);
 $bodytag  $bodytag
 <table width="100%" cellspacing="0" border="0" cellpadding="0">  <table width="100%" cellspacing="0" border="0" cellpadding="0">
Line 2953  sub make_attr_string { Line 2970  sub make_attr_string {
     }      }
   
     if ($register) {      if ($register) {
  $attr_ref->{'onload'}   = &Apache::lonmenu::loadevents().   my ($on_load,$on_unload);
     $attr_ref->{'onload'};   foreach my $key (keys(%{$attr_ref})) {
  $attr_ref->{'onunload'} = &Apache::lonmenu::unloadevents().      if      (lc($key) eq 'onload') {
     $attr_ref->{'onunload'};   $on_load.=$attr_ref->{$key}.';';
    delete($attr_ref->{$key});
   
       } elsif (lc($key) eq 'onunload') {
    $on_unload.=$attr_ref->{$key}.';';
    delete($attr_ref->{$key});
       }
    }
    $attr_ref->{'onload'}  =
       &Apache::lonmenu::loadevents().  $on_load;
    $attr_ref->{'onunload'}=
       &Apache::lonmenu::unloadevents().$on_unload;
       }
   
   # Accessibility font enhance
       if ($env{'browser.fontenhance'} eq 'on') {
    my $style;
    foreach my $key (keys(%{$attr_ref})) {
       if (lc($key) eq 'style') {
    $style.=$attr_ref->{$key}.';';
    delete($attr_ref->{$key});
       }
    }
    $attr_ref->{'style'}=$style.'; font-size: x-large;';
       }
   
       if ($env{'browser.blackwhite'} eq 'on') {
    delete($attr_ref->{'font'});
    delete($attr_ref->{'link'});
    delete($attr_ref->{'alink'});
    delete($attr_ref->{'vlink'});
    delete($attr_ref->{'bgcolor'});
    delete($attr_ref->{'background'});
     }      }
   
     my $attr_string;      my $attr_string;
     foreach my $attr (keys(%$attr_ref)) {      foreach my $attr (keys(%$attr_ref)) {
  $attr_string .= " $attr=\"".$attr_ref->{$attr}.'" ';   $attr_string .= " $attr=\"".$attr_ref->{$attr}.'" ';
Line 3012  Inputs: $title - optional title for the Line 3062  Inputs: $title - optional title for the
         $args - optional arguments          $args - optional arguments
             force_register - if is true call registerurl so the remote is               force_register - if is true call registerurl so the remote is 
                              informed                               informed
                                
             redirect - array ref of seconds before redirect occurs              redirect - array ref of seconds before redirect occurs
                                     url to redirect to                                      url to redirect to
                            (side effect of setting                              (side effect of setting 
Line 3027  sub headtag { Line 3076  sub headtag {
           
     my $result =      my $result =
  '<head>'.   '<head>'.
  &Apache::lonxml::fontsettings().   &font_settings().
  &Apache::lonhtmlcommon::htmlareaheaders();   &Apache::lonhtmlcommon::htmlareaheaders();
   
     if ($args->{'force_register'}) {      if ($args->{'force_register'}) {
Line 3055  ADDMETA Line 3104  ADDMETA
   
 =over 4  =over 4
   
   =item * &font_settings()
   
   Returns neccessary <meta> to set the proper encoding
   
   Inputs: none
   
   =back
   
   =cut
   
   sub font_settings {
       my $headerstring='';
       if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) { 
    $headerstring.=
       '<meta Content-Type="text/html; charset=x-mac-roman" />';
       } elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) {
    $headerstring.=
       '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
       }
       return $headerstring;
   }
   
   =pod
   
   =over 4
   
   =item * &xml_begin()
   
   Returns the needed doctype and <html>
   
   Inputs: none
   
   =back
   
   =cut
   
   sub xml_begin {
       my $output='';
   
       &Apache::lonhtmlcommon::init_htmlareafields();
   
       if ($env{'browser.mathml'}) {
    $output='<?xml version="1.0"?>'
               #.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n"
   #            .'<!DOCTYPE html SYSTEM "/adm/MathML/mathml.dtd" '
               
   #    .'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [<!ENTITY mathns "http://www.w3.org/1998/Math/MathML">] >'
       .'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">'
               .'<html xmlns:math="http://www.w3.org/1998/Math/MathML" ' 
       .'xmlns="http://www.w3.org/1999/xhtml">';
       } else {
    $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>';
       }
       return $output;
   }
   
   =pod
   
   =over 4
   
 =item * &endheadtag()  =item * &endheadtag()
   
 Returns a uniform </head> for LON-CAPA web pages.  Returns a uniform </head> for LON-CAPA web pages.
Line 3120  Inputs: $title - optional title for the Line 3229  Inputs: $title - optional title for the
                                     is not auto translated like the $title is                                      is not auto translated like the $title is
                   frameset       -> if true will start with a <frameset>                    frameset       -> if true will start with a <frameset>
                                     rather than <body>                                      rather than <body>
                     no_title       -> if true the title bar won't be shown
                     skip_phases    -> hash ref of 
                                       head -> skip the <html><head> generation
                                       body -> skip all <body> generation
   
 =back  =back
   
 =cut  =cut
Line 3135  sub start_page { Line 3249  sub start_page {
     }      }
   
     $env{'internal.start_page'}++;      $env{'internal.start_page'}++;
     my $result =       my $result;
  &Apache::lonxml::xmlbegin().      if (! exists($args->{'skip_phases'}{'head'}) ) {
  &headtag($title,$head_extra,\%head_args).&endheadtag();   $result.=
     if ($args->{'frameset'}) {      &xml_begin().
  my $attr_string = &make_attr_string($args->{'force_register'},      &headtag($title,$head_extra,\%head_args).&endheadtag();
     $args->{'add_entries'});      }
  $result .= "\n<frameset $attr_string>\n";      
     } else {      if (! exists($args->{'skip_phases'}{'body'}) ) {
  $result .=   if ($args->{'frameset'}) {
     &bodytag($title,       my $attr_string = &make_attr_string($args->{'force_register'},
      $args->{'function'},       $args->{'add_entries'},   $args->{'add_entries'});
      $args->{'only_body'},      $args->{'domain'},      $result .= "\n<frameset $attr_string>\n";
      $args->{'force_register'}, $args->{'body_title'},   } else {
      $args->{'no_nav_bar'},     $args->{'bgcolor'});      $result .=
    &bodytag($title, 
    $args->{'function'},       $args->{'add_entries'},
    $args->{'only_body'},      $args->{'domain'},
    $args->{'force_register'}, $args->{'body_title'},
    $args->{'no_nav_bar'},     $args->{'bgcolor'},
    $args->{'no_title'});
    }
     }      }
   
     if ($args->{'js_ready'}) {      if ($args->{'js_ready'}) {
  $result = &js_ready($result);   $result = &js_ready($result);
     }      }
Line 3184  sub end_page { Line 3306  sub end_page {
     #&Apache::lonnet::logthis("end_page ".join(':',caller(0)));      #&Apache::lonnet::logthis("end_page ".join(':',caller(0)));
     $env{'internal.end_page'}++;      $env{'internal.end_page'}++;
     my $result;      my $result;
       if ($args->{'discussion'}) {
    my ($target,$parser);
    if (ref($args->{'discussion'})) {
       ($target,$parser) =($args->{'discussion'}{'target'},
    $args->{'discussion'}{'parser'});
    }
    $result .= &Apache::lonxml::xmlend($target,$parser);
       }
   
     if ($args->{'frameset'}) {      if ($args->{'frameset'}) {
  $result .= '</frameset>';   $result .= '</frameset>';
     } else {      } else {
Line 3194  sub end_page { Line 3325  sub end_page {
     if ($args->{'js_ready'}) {      if ($args->{'js_ready'}) {
  $result = &js_ready($result);   $result = &js_ready($result);
     }      }
   
     if ($args->{'html_encode'}) {      if ($args->{'html_encode'}) {
  $result = &html_encode($result);   $result = &html_encode($result);
     }      }
   
     return $result;      return $result;
 }  }
   
Line 3673  sub get_user_info { Line 3806  sub get_user_info {
     return;      return;
 }  }
   
 ###############################################  
   
 sub get_posted_cgi {  
     my $r=shift;  
   
     my $buffer;  
     if ($r->header_in('Content-length')) {  
  $r->read($buffer,$r->header_in('Content-length'),0);  
     }  
     unless ($buffer=~/^(\-+\w+)\s+Content\-Disposition\:\s*form\-data/si) {  
  my @pairs=split(/&/,$buffer);  
  my $pair;  
  foreach $pair (@pairs) {  
     my ($name,$value) = split(/=/,$pair);  
     $value =~ tr/+/ /;  
     $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  
     $name  =~ tr/+/ /;  
     $name  =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  
     &add_to_env("form.$name",$value);  
  }  
     } else {  
  my $contentsep=$1;  
  my @lines = split (/\n/,$buffer);  
  my $name='';  
  my $value='';  
  my $fname='';  
  my $fmime='';  
  my $i;  
  for ($i=0;$i<=$#lines;$i++) {  
     if ($lines[$i]=~/^$contentsep/) {  
  if ($name) {  
     chomp($value);  
     if ($fname) {  
  $env{"form.$name.filename"}=$fname;  
  $env{"form.$name.mimetype"}=$fmime;  
     } else {  
  $value=~s/\s+$//s;  
     }  
     &add_to_env("form.$name",$value);  
  }  
  if ($i<$#lines) {  
     $i++;  
     $lines[$i]=~  
  /Content\-Disposition\:\s*form\-data\;\s*name\=\"([^\"]+)\"/i;  
     $name=$1;  
     $value='';  
     if ($lines[$i]=~/filename\=\"([^\"]+)\"/i) {  
  $fname=$1;  
  if   
                             ($lines[$i+1]=~/Content\-Type\:\s*([\w\-\/]+)/i) {  
  $fmime=$1;  
  $i++;  
     } else {  
  $fmime='';  
     }  
     } else {  
  $fname='';  
  $fmime='';  
     }  
     $i++;  
  }  
     } else {  
  $value.=$lines[$i]."\n";  
     }  
  }  
     }  
 #  
 # Digested POSTed values  
 #  
 # Remember the way this was originally done (GET or POST)  
 #  
     $env{'request.method'}=$ENV{'REQUEST_METHOD'};  
 #  
 # There may also be stuff in the query string  
 # Tell subsequent handlers that this was GET, not POST, so they can access query string.  
 # Also, unset POSTed content length to cover all tracks.  
 #  
   
 # This does not work, because M_GET is not defined (if it's defined, it is just 0).   
 # Commenting out for now ... not sure if harm is done.  
 #    $r->method_number(M_GET);  
   
     $r->method('GET');  
     $r->headers_in->unset('Content-length');  
 }  
   
 =pod  =pod
   
 =item * get_unprocessed_cgi($query,$possible_names)  =item * get_unprocessed_cgi($query,$possible_names)

Removed from v.1.332  
changed lines
  Added in v.1.342


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