--- loncom/interface/loncommon.pm 2006/04/11 20:00:44 1.331
+++ loncom/interface/loncommon.pm 2006/05/01 20:48:55 1.359
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.331 2006/04/11 20:00:44 albertel Exp $
+# $Id: loncommon.pm,v 1.359 2006/05/01 20:48:55 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -61,6 +61,9 @@ use POSIX qw(strftime mktime);
use Apache::lonmenu();
use Apache::lonlocal;
use HTML::Entities;
+use Apache::lonhtmlcommon();
+use Apache::loncoursedata();
+use Apache::lontexconvert();
my $readit;
@@ -73,7 +76,7 @@ my %language;
my %supported_language;
my %cprtag;
my %scprtag;
-my %fe; my %fd;
+my %fe; my %fd; my %fm;
my %category_extensions;
# ---------------------------------------------- Designs
@@ -104,10 +107,10 @@ BEGIN {
my $langtabfile = $Apache::lonnet::perlvar{'lonTabDir'}.
'/language.tab';
if ( open(my $fh,"<$langtabfile") ) {
- while (<$fh>) {
- next if /^\#/;
- chomp;
- my ($key,$two,$country,$three,$enc,$val,$sup)=(split(/\t/,$_));
+ while (my $line = <$fh>) {
+ next if ($line=~/^\#/);
+ chomp($line);
+ my ($key,$two,$country,$three,$enc,$val,$sup)=(split(/\t/,$line));
$language{$key}=$val.' - '.$enc;
if ($sup) {
$supported_language{$key}=$sup;
@@ -121,24 +124,24 @@ BEGIN {
my $copyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}.
'/copyright.tab';
if ( open (my $fh,"<$copyrightfile") ) {
- while (<$fh>) {
- next if /^\#/;
- chomp;
- my ($key,$val)=(split(/\s+/,$_,2));
+ while (my $line = <$fh>) {
+ next if ($line=~/^\#/);
+ chomp($line);
+ my ($key,$val)=(split(/\s+/,$line,2));
$cprtag{$key}=$val;
}
close($fh);
}
}
-# ------------------------------------------------------------------ source copyrights
+# ----------------------------------------------------------- source copyrights
{
my $sourcecopyrightfile = $Apache::lonnet::perlvar{'lonIncludes'}.
'/source_copyright.tab';
if ( open (my $fh,"<$sourcecopyrightfile") ) {
- while (<$fh>) {
- next if /^\#/;
- chomp;
- my ($key,$val)=(split(/\s+/,$_,2));
+ while (my $line = <$fh>) {
+ next if ($line =~ /^\#/);
+ chomp($line);
+ my ($key,$val)=(split(/\s+/,$line,2));
$scprtag{$key}=$val;
}
close($fh);
@@ -156,10 +159,10 @@ BEGIN {
{
my $designfile = $designdir.'/'.$filename;
if ( open (my $fh,"<$designfile") ) {
- while (<$fh>) {
- next if /^\#/;
- chomp;
- my ($key,$val)=(split(/\=/,$_));
+ while (my $line = <$fh>) {
+ next if ($line =~ /^\#/);
+ chomp($line);
+ my ($key,$val)=(split(/\=/,$line));
if ($val) { $designhash{$domain.'.'.$key}=$val; }
}
close($fh);
@@ -175,10 +178,10 @@ BEGIN {
my $categoryfile = $Apache::lonnet::perlvar{'lonTabDir'}.
'/filecategories.tab';
if ( open (my $fh,"<$categoryfile") ) {
- while (<$fh>) {
- next if /^\#/;
- chomp;
- my ($extension,$category)=(split(/\s+/,$_,2));
+ while (my $line = <$fh>) {
+ next if ($line =~ /^\#/);
+ chomp($line);
+ my ($extension,$category)=(split(/\s+/,$line,2));
push @{$category_extensions{lc($category)}},$extension;
}
close($fh);
@@ -190,13 +193,14 @@ BEGIN {
my $typesfile = $Apache::lonnet::perlvar{'lonTabDir'}.
'/filetypes.tab';
if ( open (my $fh,"<$typesfile") ) {
- while (<$fh>) {
- next if (/^\#/);
- chomp;
- my ($ending,$emb,$descr)=split(/\s+/,$_,3);
+ while (my $line = <$fh>) {
+ next if ($line =~ /^\#/);
+ chomp($line);
+ my ($ending,$emb,$mime,$descr)=split(/\s+/,$line,4);
if ($descr ne '') {
$fe{$ending}=lc($emb);
$fd{$ending}=$descr;
+ if ($mime ne 'unk') { $fm{$ending}=$mime; }
}
}
close($fh);
@@ -703,8 +707,9 @@ sub help_open_menu {
my $origurl = $ENV{'REQUEST_URI'};
$origurl=~s|^/~|/priv/|;
my $timestamp = time;
- foreach (\$color,\$function,\$topic,\$component_help,\$faq,\$bug,\$origurl) {
- $$_ = &Apache::lonnet::escape($$_);
+ foreach my $datum (\$color,\$function,\$topic,\$component_help,\$faq,
+ \$bug,\$origurl) {
+ $$datum = &Apache::lonnet::escape($$datum);
}
if (!$stayOnPage) {
$link = "javascript:helpMenu('open')";
@@ -1149,8 +1154,8 @@ sub get_domains {
# The code below was stolen from "The Perl Cookbook", p 102, 1st ed.
my @domains;
my %seen;
- foreach (sort values(%Apache::lonnet::hostdom)) {
- push (@domains,$_) unless $seen{$_}++;
+ foreach my $dom (sort(values(%Apache::lonnet::hostdom))) {
+ push(@domains,$dom) unless $seen{$dom}++;
}
return @domains;
}
@@ -1204,7 +1209,7 @@ sub multiple_select_form {
my @order = ref($order) ? @$order
: sort(keys(%$hash));
foreach my $key (@order) {
- $output.='\n";
}
@@ -1234,10 +1239,11 @@ sub select_form {
} else {
@keys=sort(keys(%hash));
}
- foreach (@keys) {
- $selectform.="\n";
+ foreach my $key (@keys) {
+ $selectform.=
+ '\n";
}
$selectform.="";
return $selectform;
@@ -1301,10 +1307,10 @@ sub select_dom_form {
my @domains = get_domains();
if ($includeempty) { @domains=('',@domains); }
my $selectdomain = "";
return $selectdomain;
@@ -1326,9 +1332,9 @@ given $domain.
sub get_library_servers {
my $domain = shift;
my %library_servers;
- foreach (keys(%Apache::lonnet::libserv)) {
- if ($Apache::lonnet::hostdom{$_} eq $domain) {
- $library_servers{$_} = $Apache::lonnet::hostname{$_};
+ foreach my $hostid (keys(%Apache::lonnet::libserv)) {
+ if ($Apache::lonnet::hostdom{$hostid} eq $domain) {
+ $library_servers{$hostid} = $Apache::lonnet::hostname{$hostid};
}
}
return %library_servers;
@@ -1350,9 +1356,10 @@ sub home_server_option_list {
my $domain = shift;
my %servers = &get_library_servers($domain);
my $result = '';
- foreach (sort keys(%servers)) {
+ foreach my $hostid (sort(keys(%servers))) {
$result.=
- '\n";
+ '\n";
}
return $result;
}
@@ -1842,8 +1849,8 @@ sub initialize_keywords {
}
untie %thesaurus_db;
# Remove special values from %Keywords.
- foreach ('total.count','average.count') {
- delete($Keywords{$_}) if (exists($Keywords{$_}));
+ foreach my $value ('total.count','average.count') {
+ delete($Keywords{$value}) if (exists($Keywords{$value}));
}
return 1;
}
@@ -1899,11 +1906,11 @@ sub get_related_words {
}
my @Words=();
if (exists($thesaurus_db{$keyword})) {
- $_ = $thesaurus_db{$keyword};
- (undef,@Words) = split/:/; # The first element is the number of times
- # the word appears. We do not need it now.
+ # The first element is the number of times
+ # the word appears. We do not need it now.
+ (undef,@Words) = (split(/:/,$thesaurus_db{$keyword}));
for (my $i=0;$i<=$#Words;$i++) {
- ($Words[$i],undef)= split/\,/,$Words[$i];
+ ($Words[$i],undef)= split(/\,/,$Words[$i]);
}
}
untie %thesaurus_db;
@@ -1944,7 +1951,7 @@ sub plainname {
$name=~s/^\s+//;
$name=~s/\s+$//;
$name=~s/\s+/ /g;
- if ($name !~ /\S/) { $name=$uname.'@'.$udom; }
+ if ($name !~ /\S/) { $name=$uname.':'.$udom; }
return $name;
}
@@ -2180,7 +2187,8 @@ category
=cut
sub filecategorytypes {
- return @{$category_extensions{lc($_[0])}};
+ my ($cat) = @_;
+ return @{$category_extensions{lc($cat)}};
}
=pod
@@ -2195,6 +2203,10 @@ sub fileembstyle {
return $fe{lc(shift(@_))};
}
+sub filemimetype {
+ return $fm{lc(shift(@_))};
+}
+
sub filecategoryselect {
my ($name,$value)=@_;
@@ -2251,13 +2263,13 @@ sub fileextensions {
sub display_languages {
my %languages=();
- foreach (&preferred_languages()) {
- $languages{$_}=1;
+ foreach my $lang (&preferred_languages()) {
+ $languages{$lang}=1;
}
&get_unprocessed_cgi($ENV{'QUERY_STRING'},['displaylanguage']);
if ($env{'form.displaylanguage'}) {
- foreach (split(/\s*(\,|\;|\:)\s*/,$env{'form.displaylanguage'})) {
- $languages{$_}=1;
+ foreach my $lang (split(/\s*(\,|\;|\:)\s*/,$env{'form.displaylanguage'})) {
+ $languages{$lang}=1;
}
}
return %languages;
@@ -2292,11 +2304,11 @@ sub preferred_languages {
}
# turn "en-ca" into "en-ca,en"
my @genlanguages;
- foreach (@languages) {
- unless ($_=~/\w/) { next; }
- push (@genlanguages,$_);
- if ($_=~/(\-|\_)/) {
- push (@genlanguages,(split(/(\-|\_)/,$_))[0]);
+ foreach my $lang (@languages) {
+ unless ($lang=~/\w/) { next; }
+ push (@genlanguages,$lang);
+ if ($lang=~/(\-|\_)/) {
+ push(@genlanguages,(split(/(\-|\_)/,$lang))[0]);
}
}
return @genlanguages;
@@ -2352,14 +2364,14 @@ sub get_previous_attempt {
my %lasthash=();
my $version;
for ($version=1;$version<=$returnhash{'version'};$version++) {
- foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) {
- $lasthash{$_}=$returnhash{$version.':'.$_};
+ foreach my $key (sort(split(/\:/,$returnhash{$version.':keys'}))) {
+ $lasthash{$key}=$returnhash{$version.':'.$key};
}
}
$prevattempts='
';
$prevattempts.='History | ';
- foreach (sort(keys %lasthash)) {
- my ($ign,@parts) = split(/\./,$_);
+ foreach my $key (sort(keys(%lasthash))) {
+ my ($ign,@parts) = split(/\./,$key);
if ($#parts > 0) {
my $data=$parts[-1];
pop(@parts);
@@ -2375,27 +2387,27 @@ sub get_previous_attempt {
if ($getattempt eq '') {
for ($version=1;$version<=$returnhash{'version'};$version++) {
$prevattempts.=' Transaction '.$version.' | ';
- foreach (sort(keys %lasthash)) {
+ foreach my $key (sort(keys(%lasthash))) {
my $value;
- if ($_ =~ /timestamp/) {
- $value=scalar(localtime($returnhash{$version.':'.$_}));
+ if ($key =~ /timestamp/) {
+ $value=scalar(localtime($returnhash{$version.':'.$key}));
} else {
- $value=$returnhash{$version.':'.$_};
+ $value=$returnhash{$version.':'.$key};
}
$prevattempts.=''.&Apache::lonnet::unescape($value).' | ';
}
}
}
$prevattempts.=' Current | ';
- foreach (sort(keys %lasthash)) {
+ foreach my $key (sort(keys(%lasthash))) {
my $value;
- if ($_ =~ /timestamp/) {
- $value=scalar(localtime($lasthash{$_}));
+ if ($key =~ /timestamp/) {
+ $value=scalar(localtime($lasthash{$key}));
} else {
- $value=$lasthash{$_};
+ $value=$lasthash{$key};
}
$value=&Apache::lonnet::unescape($value);
- if ($_ =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}
+ if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}
$prevattempts.=''.$value.' | ';
}
$prevattempts.='
|
';
@@ -2427,14 +2439,14 @@ sub relative_to_absolute {
}
}
$thisdir=~s-/[^/]*$--;
- foreach (@rlinks) {
- unless (($_=~/^http:\/\//i) ||
- ($_=~/^\//) ||
- ($_=~/^javascript:/i) ||
- ($_=~/^mailto:/i) ||
- ($_=~/^\#/)) {
- my $newlocation=&Apache::lonnet::hreflocation($thisdir,$_);
- $output=~s/(\"|\'|\=\s*)$_(\"|\'|\s|\>)/$1$newlocation$2/;
+ foreach my $link (@rlinks) {
+ unless (($link=~/^http:\/\//i) ||
+ ($link=~/^\//) ||
+ ($link=~/^javascript:/i) ||
+ ($link=~/^mailto:/i) ||
+ ($link=~/^\#/)) {
+ my $newlocation=&Apache::lonnet::hreflocation($thisdir,$link);
+ $output=~s/(\"|\'|\=\s*)\Q$link\E(\"|\'|\s|\>)/$1$newlocation$2/;
}
}
# -------------------------------------------------- Deal with Applet codebases
@@ -2602,11 +2614,17 @@ sub maketime {
#########################################
sub findallcourses {
- my %courses=();
+ my ($roles) = @_;
+ my %roles;
+ if (ref($roles)) { %roles = map { $_ => 1 } @{$roles}; }
+ my %courses;
my $now=time;
- foreach (keys %env) {
- if ($_=~/^user\.role\.\w+\.\/(\w+)\/(\w+)/) {
- my ($starttime,$endtime)=$env{$_};
+ foreach my $key (keys(%env)) {
+ if ( $key=~m{^user\.role\.(\w+)\./(\w+)/(\w+)} ) {
+ my ($role,$domain,$id) = ($1,$2,$3);
+ next if ($role eq 'ca' || $role eq 'aa');
+ next if (%roles && !exists($roles{$role}));
+ my ($starttime,$endtime)=split(/\./,$env{$key});
my $active=1;
if ($starttime) {
if ($now<$starttime) { $active=0; }
@@ -2614,10 +2632,10 @@ sub findallcourses {
if ($endtime) {
if ($now>$endtime) { $active=0; }
}
- if ($active) { $courses{$1.'_'.$2}=1; }
+ if ($active) { $courses{$domain.'_'.$id}=1; }
}
}
- return keys %courses;
+ return keys(%courses);
}
###############################################
@@ -2751,7 +2769,10 @@ Inputs:
=item * $notopbar, if true, keep the 'what is this' info but remove the
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
@@ -2764,31 +2785,33 @@ other decorations will be returned.
sub bodytag {
my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle,
- $notopbar,$bgcolor)=@_;
+ $notopbar,$bgcolor,$notitle)=@_;
+
$title=&mt($title);
+
$function = &get_users_function() if (!$function);
- my $img=&designparm($function.'.img',$domain);
- my $pgbg= $bgcolor || &designparm($function.'.pgbg',$domain);
- my $tabbg=&designparm($function.'.tabbg',$domain);
- my $font=&designparm($function.'.font',$domain);
- my $link=&designparm($function.'.link',$domain);
- my $alink=&designparm($function.'.alink',$domain);
- my $vlink=&designparm($function.'.vlink',$domain);
- my $sidebg=&designparm($function.'.sidebg',$domain);
-# Accessibility font enhance
- my $addstyle='';
- if ($env{'browser.fontenhance'} eq 'on') {
- $addstyle=' font-size: x-large;';
- }
+ my $img = &designparm($function.'.img',$domain);
+ my $tabbg = &designparm($function.'.tabbg',$domain);
+ my $font = &designparm($function.'.font',$domain);
+ my $sidebg = &designparm($function.'.sidebg',$domain);
+ my $pgbg = $bgcolor || &designparm($function.'.pgbg',$domain);
+
+ my %design = ( 'style' => 'margin-top: 0px',
+ 'bgcolor' => $pgbg,
+ 'text' => $font,
+ 'alink' => &designparm($function.'.alink',$domain),
+ 'vlink' => &designparm($function.'.vlink',$domain),
+ 'link' => &designparm($function.'.link',$domain),);
+ @$addentries{keys(%design)} = @design{keys(%design)};
+
# role and realm
- my ($role,$realm)
- =&Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]);
+ my ($role,$realm) =
+ &Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]);
# realm
if ($env{'request.course.id'}) {
- $realm=
- $env{'course.'.$env{'request.course.id'}.'.description'};
+ $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
}
- unless ($realm) { $realm=' '; }
+ if (!$realm) { $realm=' '; }
# Set messages
my $messages=&domainlogo($domain);
# Port for miniserver
@@ -2798,96 +2821,106 @@ sub bodytag {
my $extra_body_attr = &make_attr_string($forcereg,$addentries);
# construct main body tag
- my $bodytag = <
-h1, h2, h3, th { font-family: Arial, Helvetica, sans-serif }
-a:focus { color: red; background: yellow }
-table.thinborder { border-collapse: collapse; }
-table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px}
-form, .inline { display: inline; }
-.center { text-align: center; }
-.filename {font-family: monospace;}
-
-
-END
+ my $bodytag = "".
+ &Apache::lontexconvert::init_math_support();
- $bodytag .= &Apache::lontexconvert::init_math_support();
-
- my $upperleft='';
- if ($bodyonly) {
+ if ($bodyonly
+ || ($env{'request.state'} eq 'construct'
+ && $env{'environment.remote'} ne 'off' )) {
return $bodytag;
} elsif ($env{'browser.interface'} eq 'textual') {
# Accessibility
- return $bodytag.&Apache::lonmenu::menubuttons($forcereg,'web',
- $forcereg).
- 'LON-CAPA: '.$title.'
';
- } elsif ($env{'environment.remote'} eq 'off') {
-# No Remote
- my $roleinfo=(<
-
+ $bodytag.=&Apache::lonmenu::menubuttons($forcereg,$forcereg);
+ if (!$notitle) {
+ $bodytag.='LON-CAPA: '.$title.'
';
+ }
+ return $bodytag;
+ }
+
+
+
+ my $roleinfo=(<
+
$env{'environment.firstname'}
$env{'environment.middlename'}
$env{'environment.lastname'}
$env{'environment.generation'}
-
-
-$role
-
-$realm
+
+
+$role
+
+
+$realm
+
ENDROLE
- my $titleinfo = ''.$title.'';
- if ($customtitle) {
- $titleinfo = $customtitle;
- }
+ my $titleinfo = ''.$title.'';
+ if ($customtitle) {
+ $titleinfo = $customtitle;
+ }
+ #
+ # Extra info if you are the DC
+ my $dc_info = '';
+ if ($env{'user.adv'} && exists($env{'user.role.dc./'.
+ $env{'course.'.$env{'request.course.id'}.
+ '.domain'}.'/'})) {
+ my $cid = $env{'request.course.id'};
+ $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
+ $dc_info = '('.$dc_info.')';
+ }
+
+ if ($env{'environment.remote'} eq 'off') {
+ # No Remote
if ($env{'request.state'} eq 'construct') {
+ $forcereg=1;
+ }
+
+ if (!$customtitle && $env{'request.state'} eq 'construct') {
+ # this is for resources; directories have customtitle, and crumbs
+ # and select recent are created in lonpubdir.pm
my ($uname,$thisdisfn)=
($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);
my $formaction='/priv/'.$uname.'/'.$thisdisfn;
$formaction=~s/\/+/\//g;
- unless ($customtitle) { #this is for resources; directories have customtitle, and crumbs and select recent are created in lonpubdir.pm
- my $parentpath = '';
- my $lastitem = '';
- if ($thisdisfn =~ m-(.+/)([^/]*)$-) {
- $parentpath = $1;
- $lastitem = $2;
- } else {
- $lastitem = $thisdisfn;
- }
- $titleinfo = &Apache::loncommon::help_open_menu('','','','',3,'Authoring').
- 'Construction Space: '.
- ''
- .&Apache::lonmenu::constspaceform();
- }
- $forcereg=1;
- }
- my $titletable = ''.
- ''.
- $titleinfo.' | '.$roleinfo.'
';
- if ($env{'request.state'} eq 'construct') {
- if ($notopbar) {
- $bodytag .= $titletable;
- } else {
- $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable);
- }
+ my $parentpath = '';
+ my $lastitem = '';
+ if ($thisdisfn =~ m-(.+/)([^/]*)$-) {
+ $parentpath = $1;
+ $lastitem = $2;
+ } else {
+ $lastitem = $thisdisfn;
+ }
+ $titleinfo =
+ &Apache::loncommon::help_open_menu('','','','',3,'Authoring').
+ 'Construction Space: '.
+ ''
+ .&Apache::lonmenu::constspaceform();
+ }
+
+ my $titletable;
+ if (!$notitle) {
+ $titletable =
+ ''.
+ " $titleinfo $dc_info | ".$roleinfo.
+ '
';
+ }
+ if ($notopbar) {
+ $bodytag .= $titletable;
} else {
- if ($notopbar) {
- $bodytag .= $titletable;
+ if ($env{'request.state'} eq 'construct') {
+ $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg,
+ $titletable);
} else {
- $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg).
- $titletable;
+ $bodytag .= &Apache::lonmenu::menubuttons($forcereg,$forcereg).
+ $titletable;
}
}
return $bodytag;
@@ -2896,48 +2929,25 @@ ENDROLE
#
# Top frame rendering, Remote is up
#
- my $titleinfo = ' '.$title.'';
- if ($customtitle) {
- $titleinfo = $customtitle;
- }
- #
- # Extra info if you are the DC
- my $dc_info = '';
- if ($env{'user.adv'} && exists($env{'user.role.dc./'.
- $env{'course.'.$env{'request.course.id'}.
- '.domain'}.'/'})) {
- my $cid = $env{'request.course.id'};
- $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
- $dc_info = '('.$dc_info.')';
- }
+
+ my $upperleft='';
+
# Explicit link to get inline menu
- my $menu='
'.&mt('Switch to Inline Menu Mode').'';
+ my $menu='
'.&mt('Switch to Inline Menu Mode').'';
#
+ if ($notitle) {
+ return $bodytag;
+ }
return(<
-
-$upperleft |
-$messages |
-
-
-
-$titleinfo $dc_info $menu
- |
-
- $env{'environment.firstname'}
- $env{'environment.middlename'}
- $env{'environment.lastname'}
- $env{'environment.generation'}
-
- |
+
+$upperleft |
+ $messages |
-
-$role
- |
-
-$realm |
-
+
$titleinfo $dc_info $menu |
+$roleinfo
+
ENDBODY
}
@@ -2951,11 +2961,44 @@ sub make_attr_string {
}
if ($register) {
- $attr_ref->{'onload'} = &Apache::lonmenu::loadevents().
- $attr_ref->{'onload'};
- $attr_ref->{'onunload'} = &Apache::lonmenu::unloadevents().
- $attr_ref->{'onunload'};
+ my ($on_load,$on_unload);
+ foreach my $key (keys(%{$attr_ref})) {
+ if (lc($key) eq 'onload') {
+ $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;
foreach my $attr (keys(%$attr_ref)) {
$attr_string .= " $attr=\"".$attr_ref->{$attr}.'" ';
@@ -3001,6 +3044,227 @@ sub endbodytag {
=over 4
+=item * &standard_css()
+
+Returns a style sheet
+
+Inputs: (all optional)
+ domain -> force to color decorate a page for a specific
+ domain
+ function -> force usage of a specific rolish color scheme
+ bgcolor -> override the default page bgcolor
+
+=back
+
+=cut
+
+sub standard_css {
+ my ($function,$domain,$bgcolor) = @_;
+ $function = &get_users_function() if (!$function);
+ my $img = &designparm($function.'.img', $domain);
+ my $tabbg = &designparm($function.'.tabbg', $domain);
+ my $font = &designparm($function.'.font', $domain);
+ my $sidebg = &designparm($function.'.sidebg',$domain);
+ my $pgbg = $bgcolor ||
+ &designparm($function.'.pgbg', $domain);
+ my $alink = &designparm($function.'.alink', $domain);
+ my $vlink = &designparm($function.'.vlink', $domain);
+ my $link = &designparm($function.'.link', $domain);
+
+ my $sans = 'Arial,Helvetica,sans-serif';
+ my $data_table_head = $tabbg;
+ my $data_table_light = '#EEEEEE';
+ my $data_table_dark = '#DDD';
+ my $data_table_highlight = '#FFFF00';
+ my $mail_new = '#FFBB77';
+ my $mail_new_hover = '#DD9955';
+ my $mail_read = '#BBBB77';
+ my $mail_read_hover = '#999944';
+ my $mail_replied = '#AAAA88';
+ my $mail_replied_hover = '#888855';
+ my $mail_other = '#99BBBB';
+ my $mail_other_hover = '#669999';
+
+ return <
+h1, h2, h3, th { font-family: $sans }
+a:focus { color: red; background: yellow }
+table.thinborder { border-collapse: collapse; }
+table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px}
+form, .inline { display: inline; }
+.center { text-align: center; }
+.filename {font-family: monospace;}
+.LC_error {
+ color: red;
+ font-size: larger;
+}
+.LC_success {
+ color: green;
+}
+
+table#LC_top_nav, table#LC_menubuttons, table#LC_nav_location, table#LC_breadcrumbs {
+ width: 100%;
+ background: $pgbg;
+ border: 0px;
+ border-spacing: 1px;
+ padding: 0px;
+ margin: 0px;
+ border-collapse: separate;
+}
+table#LC_title_bar {
+ width: 100%;
+ border: 0;
+ border-spacing: 3px;
+ background: $pgbg;
+ font-family: $sans;
+}
+table#LC_title_bar.LC_with_remote {
+ width: 100%;
+ border: 0;
+ border-spacing: 0;
+ background: $pgbg;
+ font-family: $sans;
+ border-collapse: collapse;
+}
+table#LC_title_bar td {
+ padding: 3px;
+ background: $tabbg;
+}
+table#LC_title_bar td.LC_title_bar_who {
+ background: $tabbg;
+ color: $font;
+ font: medium $sans;
+ text-align: right;
+}
+span.LC_title_bar_title {
+ font: bold xx-large $sans;
+}
+table#LC_title_bar td.LC_title_bar_domain_logo {
+ background: $sidebg;
+ text-align: right;
+}
+
+table#LC_menubuttons_mainmenu {
+ background: $pgbg;
+ border: 0px;
+ border-spacing: 1px;
+ padding: 0px;
+ margin: 0px;
+ border-collapse: separate;
+}
+table#LC_menubuttons img, table#LC_menubuttons_mainmenu img {
+ border: 0px;
+}
+table#LC_top_nav td {
+ background: $tabbg;
+}
+table#LC_top_nav td a, div#LC_top_nav a {
+ color: $font;
+ font-family: $sans;
+}
+table#LC_breadcrumbs td {
+ background: $tabbg;
+ color: $font;
+ font-family: $sans;
+ font-size: smaller;
+}
+table#LC_breadcrumbs td.LC_breadcrumb_component {
+ background: $tabbg;
+ color: $font;
+ font-family: $sans;
+ font-size: larger;
+ text-align: right;
+}
+.LC_menubuttons_inline_text {
+ color: $font;
+ font-family: $sans;
+ font-size: smaller;
+}
+
+td.LC_menubuttons_text {
+ color: $font;
+ font-family: $sans;
+}
+td.LC_menubuttons_img {
+ background: $tabbg;
+}
+.LC_current_location {
+ font-family: $sans;
+ background: $tabbg;
+}
+.LC_new_mail {
+ font-family: $sans;
+ font-weight: bold;
+}
+
+table.LC_data_table, table.LC_mail_list {
+ border: 1px solid #000000;
+ border-collapse: seperate;
+}
+table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th {
+ font-weight: bold;
+ background-color: $data_table_head;
+}
+table.LC_data_table tr td {
+ background-color: $data_table_light;
+}
+table.LC_data_table tr.LC_even_row td {
+ background-color: $data_table_dark;
+}
+table.LC_data_table tr.LC_empty td {
+ background-color: #FFFFFF;
+}
+
+table.LC_calendar {
+ border: 1px solid #000000;
+ border-collapse: collapse;
+}
+table.LC_calendar_pickdate {
+ font-size: xx-small;
+}
+table.LC_calendar tr td {
+ border: 1px solid #000000;
+ vertical-align: top;
+}
+table.LC_calendar tr td.LC_calendar_day_empty {
+ background-color: $data_table_dark;
+}
+table.LC_calendar tr td.LC_calendar_day_current {
+ background-color: $data_table_highlight;
+}
+
+table.LC_mail_list tr.LC_mail_new {
+ background-color: $mail_new;
+}
+table.LC_mail_list tr.LC_mail_new:hover {
+ background-color: $mail_new_hover;
+}
+table.LC_mail_list tr.LC_mail_read {
+ background-color: $mail_read;
+}
+table.LC_mail_list tr.LC_mail_read:hover {
+ background-color: $mail_read_hover;
+}
+table.LC_mail_list tr.LC_mail_replied {
+ background-color: $mail_replied;
+}
+table.LC_mail_list tr.LC_mail_replied:hover {
+ background-color: $mail_replied_hover;
+}
+table.LC_mail_list tr.LC_mail_other {
+ background-color: $mail_other;
+}
+table.LC_mail_list tr.LC_mail_other:hover {
+ background-color: $mail_other_hover;
+}
+
+END
+}
+
+=pod
+
+=over 4
+
=item * &headtag()
Returns a uniform footer for LON-CAPA web pages.
@@ -3010,12 +3274,16 @@ Inputs: $title - optional title for the
$args - optional arguments
force_register - if is true call registerurl so the remote is
informed
-
- redirect - array ref of seconds before redirect occurs
+ redirect -> array ref of seconds before redirect occurs
url to redirect to
(side effect of setting
$env{'internal.head.redirect'} to the url
redirected too)
+ domain -> force to color decorate a page for a specific
+ domain
+ function -> force usage of a specific rolish color scheme
+ bgcolor -> override the default page bgcolor
+
=back
=cut
@@ -3025,7 +3293,9 @@ sub headtag {
my $result =
''.
- &Apache::lonxml::fontsettings().
+ &standard_css($args->{'function'},$args->{'domain'},
+ $args->{'bgcolor'}).
+ &font_settings().
&Apache::lonhtmlcommon::htmlareaheaders();
if ($args->{'force_register'}) {
@@ -3038,7 +3308,7 @@ sub headtag {
$env{'internal.head.redirect'} = $url;
$result.=<
-
+
ADDMETA
}
if (!defined($title)) {
@@ -3053,6 +3323,66 @@ ADDMETA
=over 4
+=item * &font_settings()
+
+Returns neccessary to set the proper encoding
+
+Inputs: none
+
+=back
+
+=cut
+
+sub font_settings {
+ my $headerstring='';
+ if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) {
+ $headerstring.=
+ '';
+ } elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) {
+ $headerstring.=
+ '';
+ }
+ return $headerstring;
+}
+
+=pod
+
+=over 4
+
+=item * &xml_begin()
+
+Returns the needed doctype and
+
+Inputs: none
+
+=back
+
+=cut
+
+sub xml_begin {
+ my $output='';
+
+ &Apache::lonhtmlcommon::init_htmlareafields();
+
+ if ($env{'browser.mathml'}) {
+ $output=''
+ #.''."\n"
+# .'] >'
+ .''
+ .'';
+ } else {
+ $output='';
+ }
+ return $output;
+}
+
+=pod
+
+=over 4
+
=item * &endheadtag()
Returns a uniform for LON-CAPA web pages.
@@ -3118,6 +3448,11 @@ Inputs: $title - optional title for the
is not auto translated like the $title is
frameset -> if true will start with a