version 1.660, 2008/06/09 22:34:55
|
version 1.702, 2008/12/03 00:09:56
|
Line 61 use POSIX qw(strftime mktime);
|
Line 61 use POSIX qw(strftime mktime);
|
use Apache::lonmenu(); |
use Apache::lonmenu(); |
use Apache::lonenc(); |
use Apache::lonenc(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use Apache::lonnet(); |
use HTML::Entities; |
use HTML::Entities; |
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
Line 68 use Apache::lontexconvert();
|
Line 69 use Apache::lontexconvert();
|
use Apache::lonclonecourse(); |
use Apache::lonclonecourse(); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
use DateTime::TimeZone; |
use DateTime::TimeZone; |
|
use DateTime::Locale::Catalog; |
|
|
# ---------------------------------------------- Designs |
# ---------------------------------------------- Designs |
use vars qw(%defaultdesign); |
use vars qw(%defaultdesign); |
Line 657 sub select_timezone {
|
Line 659 sub select_timezone {
|
return $output; |
return $output; |
} |
} |
|
|
|
sub select_datelocale { |
|
my ($name,$selected,$onchange,$includeempty)=@_; |
|
my $output='<select name="'.$name.'" '.$onchange.'>'."\n"; |
|
if ($includeempty) { |
|
$output .= '<option value=""'; |
|
if ($selected eq '') { |
|
$output .= ' selected="selected" '; |
|
} |
|
$output .= '> </option>'; |
|
} |
|
my (@possibles,%locale_names); |
|
my @locales = DateTime::Locale::Catalog::Locales; |
|
foreach my $locale (@locales) { |
|
if (ref($locale) eq 'HASH') { |
|
my $id = $locale->{'id'}; |
|
if ($id ne '') { |
|
my $en_terr = $locale->{'en_territory'}; |
|
my $native_terr = $locale->{'native_territory'}; |
|
my @languages = &Apache::lonlocal::preferred_languages(); |
|
if (grep(/^en$/,@languages) || !@languages) { |
|
if ($en_terr ne '') { |
|
$locale_names{$id} = '('.$en_terr.')'; |
|
} elsif ($native_terr ne '') { |
|
$locale_names{$id} = $native_terr; |
|
} |
|
} else { |
|
if ($native_terr ne '') { |
|
$locale_names{$id} = $native_terr.' '; |
|
} elsif ($en_terr ne '') { |
|
$locale_names{$id} = '('.$en_terr.')'; |
|
} |
|
} |
|
push (@possibles,$id); |
|
} |
|
} |
|
} |
|
foreach my $item (sort(@possibles)) { |
|
$output.= '<option value="'.$item.'"'; |
|
if ($item eq $selected) { |
|
$output.=' selected="selected"'; |
|
} |
|
$output.=">$item"; |
|
if ($locale_names{$item} ne '') { |
|
$output.=" $locale_names{$item}</option>\n"; |
|
} |
|
$output.="</option>\n"; |
|
} |
|
$output.="</select>"; |
|
return $output; |
|
} |
|
|
=pod |
=pod |
|
|
=item * &linked_select_forms(...) |
=item * &linked_select_forms(...) |
Line 873 sub help_open_topic {
|
Line 926 sub help_open_topic {
|
if ($text ne "") { |
if ($text ne "") { |
$template .= |
$template .= |
"<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<table bgcolor='#3333AA' cellspacing='1' cellpadding='1' border='0'><tr>". |
"<td bgcolor='#5555FF'><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
"<td bgcolor='#5555FF'><span class=\"LC_nobreak\"><a target=\"_top\" href=\"$link\"><font color='#FFFFFF' size='2'>$text</font></a>"; |
} |
} |
|
|
# Add the graphic |
# Add the graphic |
my $title = &mt('Online Help'); |
my $title = &mt('Online Help'); |
my $helpicon=&lonhttpdurl("/res/adm/pages/help.png"); |
my $helpicon=&lonhttpdurl("/adm/help/help.png"); |
$template .= <<"ENDTEMPLATE"; |
$template .= <<"ENDTEMPLATE"; |
<a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a> |
<a target="_top" href="$link" title="$title"><img src="$helpicon" border="0" alt="(Help: $topic)" /></a> |
ENDTEMPLATE |
ENDTEMPLATE |
if ($text ne '') { $template.='</td></tr></table>' }; |
if ($text ne '') { $template.='</span></td></tr></table>' }; |
return $template; |
return $template; |
|
|
} |
} |
Line 904 sub helpLatexCheatsheet {
|
Line 957 sub helpLatexCheatsheet {
|
.'</td><td>'. |
.'</td><td>'. |
&Apache::loncommon::help_open_topic("Other_Symbols",&mt('Other Symbols'), |
&Apache::loncommon::help_open_topic("Other_Symbols",&mt('Other Symbols'), |
undef,undef,600) |
undef,undef,600) |
|
.'</td><td>'. |
|
&Apache::loncommon::help_open_topic("Authoring_Output_Tags",&mt('Output Tags'), |
|
undef,undef,600) |
.'</td></tr></table>'; |
.'</td></tr></table>'; |
} |
} |
|
|
Line 913 sub general_help {
|
Line 969 sub general_help {
|
$helptopic='Authoring_Intro'; |
$helptopic='Authoring_Intro'; |
} elsif ($env{'request.role'}=~/^cc/) { |
} elsif ($env{'request.role'}=~/^cc/) { |
$helptopic='Course_Coordination_Intro'; |
$helptopic='Course_Coordination_Intro'; |
|
} elsif ($env{'request.role'}=~/^dc/) { |
|
$helptopic='Domain_Coordination_Intro'; |
} |
} |
return $helptopic; |
return $helptopic; |
} |
} |
Line 1502 sub create_text_file {
|
Line 1560 sub create_text_file {
|
$fh = Apache::File->new('>/home/httpd'.$filename); |
$fh = Apache::File->new('>/home/httpd'.$filename); |
if (! defined($fh)) { |
if (! defined($fh)) { |
$r->log_error("Couldn't open $filename for output $!"); |
$r->log_error("Couldn't open $filename for output $!"); |
$r->print("Problems occured in creating the output file. ". |
$r->print(&mt('Problems occurred in creating the output file. ' |
"This error has been logged. ". |
.'This error has been logged. ' |
"Please alert your LON-CAPA administrator."); |
.'Please alert your LON-CAPA administrator.')); |
} |
} |
return ($fh,$filename) |
return ($fh,$filename) |
} |
} |
Line 2940 sub fileextensions {
|
Line 2998 sub fileextensions {
|
|
|
sub display_languages { |
sub display_languages { |
my %languages=(); |
my %languages=(); |
foreach my $lang (&preferred_languages()) { |
foreach my $lang (&Apache::lonlocal::preferred_languages()) { |
$languages{$lang}=1; |
$languages{$lang}=1; |
} |
} |
&get_unprocessed_cgi($ENV{'QUERY_STRING'},['displaylanguage']); |
&get_unprocessed_cgi($ENV{'QUERY_STRING'},['displaylanguage']); |
Line 2952 sub display_languages {
|
Line 3010 sub display_languages {
|
return %languages; |
return %languages; |
} |
} |
|
|
sub preferred_languages { |
|
my @languages=(); |
|
if (($env{'request.role.adv'}) && ($env{'form.languages'})) { |
|
@languages=(@languages,split(/\s*(\,|\;|\:)\s*/,$env{'form.languages'})); |
|
} |
|
if ($env{'course.'.$env{'request.course.id'}.'.languages'}) { |
|
@languages=(@languages,split(/\s*(\,|\;|\:)\s*/, |
|
$env{'course.'.$env{'request.course.id'}.'.languages'})); |
|
} |
|
|
|
if ($env{'environment.languages'}) { |
|
@languages=(@languages, |
|
split(/\s*(\,|\;|\:)\s*/,$env{'environment.languages'})); |
|
} |
|
my $browser=$ENV{'HTTP_ACCEPT_LANGUAGE'}; |
|
if ($browser) { |
|
my @browser = |
|
map { (split(/\s*;\s*/,$_))[0] } (split(/\s*,\s*/,$browser)); |
|
push(@languages,@browser); |
|
} |
|
|
|
foreach my $domtype ($env{'user.domain'},$env{'request.role.domain'}, |
|
$Apache::lonnet::perlvar{'lonDefDomain'}) { |
|
if ($domtype ne '') { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($domtype); |
|
if ($domdefs{'lang_def'} ne '') { |
|
push(@languages,$domdefs{'lang_def'}); |
|
} |
|
} |
|
} |
|
# turn "en-ca" into "en-ca,en" |
|
my @genlanguages; |
|
foreach my $lang (@languages) { |
|
unless ($lang=~/\w/) { next; } |
|
push(@genlanguages,$lang); |
|
if ($lang=~/(\-|\_)/) { |
|
push(@genlanguages,(split(/(\-|\_)/,$lang))[0]); |
|
} |
|
} |
|
#uniqueify the languages list |
|
my %count; |
|
@genlanguages = map { $count{$_}++ == 0 ? $_ : () } @genlanguages; |
|
return @genlanguages; |
|
} |
|
|
|
sub languages { |
sub languages { |
my ($possible_langs) = @_; |
my ($possible_langs) = @_; |
my @preferred_langs = &preferred_languages(); |
my @preferred_langs = &Apache::lonlocal::preferred_languages(); |
if (!ref($possible_langs)) { |
if (!ref($possible_langs)) { |
if( wantarray ) { |
if( wantarray ) { |
return @preferred_langs; |
return @preferred_langs; |
Line 3343 sub pprmlink {
|
Line 3356 sub pprmlink {
|
|
|
|
|
sub timehash { |
sub timehash { |
my @ltime=localtime(shift); |
my ($thistime) = @_; |
return ( 'seconds' => $ltime[0], |
my $timezone = &Apache::lonlocal::gettimezone(); |
'minutes' => $ltime[1], |
my $dt = DateTime->from_epoch(epoch => $thistime) |
'hours' => $ltime[2], |
->set_time_zone($timezone); |
'day' => $ltime[3], |
my $wday = $dt->day_of_week(); |
'month' => $ltime[4]+1, |
if ($wday == 7) { $wday = 0; } |
'year' => $ltime[5]+1900, |
return ( 'second' => $dt->second(), |
'weekday' => $ltime[6], |
'minute' => $dt->minute(), |
'dayyear' => $ltime[7]+1, |
'hour' => $dt->hour(), |
'dlsav' => $ltime[8] ); |
'day' => $dt->day_of_month(), |
|
'month' => $dt->month(), |
|
'year' => $dt->year(), |
|
'weekday' => $wday, |
|
'dayyear' => $dt->day_of_year(), |
|
'dlsav' => $dt->is_dst() ); |
} |
} |
|
|
sub utc_string { |
sub utc_string { |
Line 3362 sub utc_string {
|
Line 3380 sub utc_string {
|
|
|
sub maketime { |
sub maketime { |
my %th=@_; |
my %th=@_; |
|
my ($epoch_time,$timezone,$dt); |
|
$timezone = &Apache::lonlocal::gettimezone(); |
|
eval { |
|
$dt = DateTime->new( year => $th{'year'}, |
|
month => $th{'month'}, |
|
day => $th{'day'}, |
|
hour => $th{'hour'}, |
|
minute => $th{'minute'}, |
|
second => $th{'second'}, |
|
time_zone => $timezone, |
|
); |
|
}; |
|
if (!$@) { |
|
$epoch_time = $dt->epoch; |
|
if ($epoch_time) { |
|
return $epoch_time; |
|
} |
|
} |
return POSIX::mktime( |
return POSIX::mktime( |
($th{'seconds'},$th{'minutes'},$th{'hours'}, |
($th{'seconds'},$th{'minutes'},$th{'hours'}, |
$th{'day'},$th{'month'}-1,$th{'year'}-1900,0,0,-1)); |
$th{'day'},$th{'month'}-1,$th{'year'}-1900,0,0,-1)); |
Line 3742 sub blocking_status {
|
Line 3778 sub blocking_status {
|
|
|
############################################### |
############################################### |
|
|
|
sub check_ip_acc { |
|
my ($acc)=@_; |
|
&Apache::lonxml::debug("acc is $acc"); |
|
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
|
return 1; |
|
} |
|
my $allowed=0; |
|
my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'}; |
|
|
|
my $name; |
|
foreach my $pattern (split(',',$acc)) { |
|
$pattern =~ s/^\s*//; |
|
$pattern =~ s/\s*$//; |
|
if ($pattern =~ /\*$/) { |
|
#35.8.* |
|
$pattern=~s/\*//; |
|
if ($ip =~ /^\Q$pattern\E/) { $allowed=1; } |
|
} elsif ($pattern =~ /(\d+\.\d+\.\d+)\.\[(\d+)-(\d+)\]$/) { |
|
#35.8.3.[34-56] |
|
my $low=$2; |
|
my $high=$3; |
|
$pattern=$1; |
|
if ($ip =~ /^\Q$pattern\E/) { |
|
my $last=(split(/\./,$ip))[3]; |
|
if ($last <=$high && $last >=$low) { $allowed=1; } |
|
} |
|
} elsif ($pattern =~ /^\*/) { |
|
#*.msu.edu |
|
$pattern=~s/\*//; |
|
if (!defined($name)) { |
|
use Socket; |
|
my $netaddr=inet_aton($ip); |
|
($name)=gethostbyaddr($netaddr,AF_INET); |
|
} |
|
if ($name =~ /\Q$pattern\E$/i) { $allowed=1; } |
|
} elsif ($pattern =~ /\d+\.\d+\.\d+\.\d+/) { |
|
#127.0.0.1 |
|
if ($ip =~ /^\Q$pattern\E/) { $allowed=1; } |
|
} else { |
|
#some.name.com |
|
if (!defined($name)) { |
|
use Socket; |
|
my $netaddr=inet_aton($ip); |
|
($name)=gethostbyaddr($netaddr,AF_INET); |
|
} |
|
if ($name =~ /\Q$pattern\E$/i) { $allowed=1; } |
|
} |
|
if ($allowed) { last; } |
|
} |
|
return $allowed; |
|
} |
|
|
|
############################################### |
|
|
=pod |
=pod |
|
|
=head1 Domain Template Functions |
=head1 Domain Template Functions |
Line 3790 sub get_domainconf {
|
Line 3880 sub get_domainconf {
|
if (ref($domconfig{'login'}) eq 'HASH') { |
if (ref($domconfig{'login'}) eq 'HASH') { |
if (keys(%{$domconfig{'login'}})) { |
if (keys(%{$domconfig{'login'}})) { |
foreach my $key (keys(%{$domconfig{'login'}})) { |
foreach my $key (keys(%{$domconfig{'login'}})) { |
$designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; |
if (ref($domconfig{'login'}{$key}) eq 'HASH') { |
|
foreach my $img (keys(%{$domconfig{'login'}{$key}})) { |
|
$designhash{$udom.'.login.'.$key.'_'.$img} = |
|
$domconfig{'login'}{$key}{$img}; |
|
} |
|
} else { |
|
$designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key}; |
|
} |
} |
} |
} else { |
} else { |
$legacy{'login'} = 1; |
$legacy{'login'} = 1; |
Line 4314 sub standard_css {
|
Line 4411 sub standard_css {
|
my $mail_other_hover = '#669999'; |
my $mail_other_hover = '#669999'; |
my $table_header = '#DDDDDD'; |
my $table_header = '#DDDDDD'; |
my $feedback_link_bg = '#BBBBBB'; |
my $feedback_link_bg = '#BBBBBB'; |
|
my $lg_border_color = '#C8C8C8'; |
|
|
my $border = ($env{'browser.type'} eq 'explorer' || |
my $border = ($env{'browser.type'} eq 'explorer' || |
$env{'browser.type'} eq 'safari' ) ? '0px 2px 0px 2px' |
$env{'browser.type'} eq 'safari' ) ? '0px 2px 0px 2px' |
Line 4321 sub standard_css {
|
Line 4419 sub standard_css {
|
|
|
|
|
return <<END; |
return <<END; |
h1, h2, h3, th { font-family: $sans } |
body{ |
|
font-family: $sans; |
|
line-height:130%; |
|
font-size:0.83em; |
|
color:$font; |
|
} |
|
a:link, a:visited { font-size:100%; } |
|
|
a:focus { color: red; background: yellow } |
a:focus { color: red; background: yellow } |
table.thinborder, |
table.thinborder, |
|
|
table.thinborder tr th { |
table.thinborder tr th { |
border-style: solid; |
border-style: solid; |
border-width: 1px; |
border-width: 1px; |
|
border-color: $lg_border_color; |
background: $tabbg; |
background: $tabbg; |
} |
} |
table.thinborder tr td { |
table.thinborder tr td { |
border-style: solid; |
border-style: solid; |
border-width: 1px |
border-width: 1px; |
|
border-color: $lg_border_color; |
} |
} |
|
|
form, .inline { display: inline; } |
form, .inline { display: inline; } |
.center { text-align: center; } |
.center { text-align: center; } |
|
.left { text-align:left; } |
|
.right {text-align:right;} |
|
.middle {vertical-align:middle;} |
|
.top {vertical-align:top;} |
|
.bottom {vertical-align:bottom;} |
.LC_filename {font-family: $mono; white-space:pre;} |
.LC_filename {font-family: $mono; white-space:pre;} |
.LC_error { |
.LC_error { |
color: red; |
color: red; |
Line 4398 table#LC_title_bar.LC_with_remote {
|
Line 4509 table#LC_title_bar.LC_with_remote {
|
border-collapse: collapse; |
border-collapse: collapse; |
padding: 0px; |
padding: 0px; |
} |
} |
|
|
table.LC_docs_path { |
table.LC_docs_path { |
width: 100%; |
width: 100%; |
border: 0; |
border: 0; |
Line 4488 table.LC_docs_path td.LC_docs_path_compo
|
Line 4598 table.LC_docs_path td.LC_docs_path_compo
|
td.LC_table_cell_checkbox { |
td.LC_table_cell_checkbox { |
text-align: center; |
text-align: center; |
} |
} |
|
|
table#LC_mainmenu td.LC_mainmenu_column { |
table#LC_mainmenu td.LC_mainmenu_column { |
vertical-align: top; |
vertical-align: top; |
} |
} |
Line 4496 table#LC_mainmenu td.LC_mainmenu_column
|
Line 4605 table#LC_mainmenu td.LC_mainmenu_column
|
.LC_menubuttons_inline_text { |
.LC_menubuttons_inline_text { |
color: $font; |
color: $font; |
font-family: $sans; |
font-family: $sans; |
font-size: smaller; |
font-size: 90%; |
|
padding-left:3px; |
} |
} |
|
|
.LC_menubuttons_link { |
.LC_menubuttons_link { |
text-decoration: none; |
text-decoration: none; |
} |
} |
|
/*2008--9-5: new menu style sheet.Changed category*/ |
.LC_menubuttons_category { |
.LC_menubuttons_category { |
color: $font; |
color: $font; |
background: $pgbg; |
background: $pgbg; |
Line 4512 table#LC_mainmenu td.LC_mainmenu_column
|
Line 4622 table#LC_mainmenu td.LC_mainmenu_column
|
} |
} |
|
|
td.LC_menubuttons_text { |
td.LC_menubuttons_text { |
width: 90%; |
color: $font; |
color: $font; |
|
font-family: $sans; |
|
} |
} |
|
|
td.LC_menubuttons_img { |
td.LC_menubuttons_img { |
} |
} |
|
|
Line 4569 td.LC_menubuttons_img {
|
Line 4676 td.LC_menubuttons_img {
|
text-align: right; |
text-align: right; |
} |
} |
|
|
|
.LC_roleslog_note { |
|
font-size: small; |
|
} |
|
|
table.LC_aboutme_port { |
table.LC_aboutme_port { |
border: 0px; |
border: 0px; |
border-collapse: collapse; |
border-collapse: collapse; |
Line 4599 table.LC_data_table tr th, table.LC_cale
|
Line 4710 table.LC_data_table tr th, table.LC_cale
|
table.LC_prior_tries tr th { |
table.LC_prior_tries tr th { |
font-weight: bold; |
font-weight: bold; |
background-color: $data_table_head; |
background-color: $data_table_head; |
font-size: smaller; |
font-size:90%; |
} |
} |
table.LC_data_table tr.LC_odd_row > td, |
table.LC_data_table tr.LC_odd_row > td, |
table.LC_aboutme_port tr td { |
table.LC_aboutme_port tr td { |
Line 4631 table.LC_nested tr.LC_empty_row td {
|
Line 4742 table.LC_nested tr.LC_empty_row td {
|
table.LC_nested_outer tr th { |
table.LC_nested_outer tr th { |
font-weight: bold; |
font-weight: bold; |
background-color: $data_table_head; |
background-color: $data_table_head; |
font-size: smaller; |
font-size: small; |
border-bottom: 1px solid #000000; |
border-bottom: 1px solid #000000; |
} |
} |
table.LC_nested_outer tr td.LC_subheader { |
table.LC_nested_outer tr td.LC_subheader { |
Line 4670 table.LC_createuser {
|
Line 4781 table.LC_createuser {
|
} |
} |
|
|
table.LC_createuser tr.LC_section_row td { |
table.LC_createuser tr.LC_section_row td { |
font-size: smaller; |
font-size: small; |
} |
} |
|
|
table.LC_createuser tr.LC_info_row td { |
table.LC_createuser tr.LC_info_row td { |
Line 4726 table.LC_mail_list tr.LC_mail_even {
|
Line 4837 table.LC_mail_list tr.LC_mail_even {
|
table.LC_mail_list tr.LC_mail_odd { |
table.LC_mail_list tr.LC_mail_odd { |
} |
} |
|
|
|
|
table#LC_portfolio_actions { |
|
width: auto; |
|
background: $pgbg; |
|
border: 0px; |
|
border-spacing: 2px 2px; |
|
padding: 0px; |
|
margin: 0px; |
|
border-collapse: separate; |
|
} |
|
table#LC_portfolio_actions td.LC_label { |
|
background: $tabbg; |
|
text-align: right; |
|
} |
|
table#LC_portfolio_actions td.LC_value { |
|
background: $tabbg; |
|
} |
|
|
|
table#LC_cstr_controls { |
table#LC_cstr_controls { |
width: 100%; |
width: 100%; |
border-collapse: collapse; |
border-collapse: collapse; |
Line 4762 table#LC_cstr_controls tr th {
|
Line 4855 table#LC_cstr_controls tr th {
|
font-size: smaller; |
font-size: smaller; |
} |
} |
|
|
table#LC_browser { |
table.LC_data_table tr > td.LC_browser_file, |
|
table.LC_data_table tr > td.LC_browser_file_published { |
} |
|
table#LC_browser tr th { |
|
background: $table_header; |
|
} |
|
table#LC_browser tr td { |
|
padding: 2px; |
|
} |
|
table#LC_browser tr.LC_browser_file, |
|
table#LC_browser tr.LC_browser_file_published { |
|
background: #CCFF88; |
background: #CCFF88; |
} |
} |
table#LC_browser tr.LC_browser_file_locked, |
table.LC_data_table tr > td.LC_browser_file_locked, |
table#LC_browser tr.LC_browser_file_unpublished { |
table.LC_data_table tr > td.LC_browser_file_unpublished { |
background: #FFAA99; |
background: #FFAA99; |
} |
} |
table#LC_browser tr.LC_browser_file_obsolete { |
table.LC_data_table tr > td.LC_browser_file_obsolete { |
background: #AAAAAA; |
background: #AAAAAA; |
} |
} |
table#LC_browser tr.LC_browser_file_modified, |
table.LC_data_table tr > td.LC_browser_file_modified, |
table#LC_browser tr.LC_browser_file_metamodified { |
table.LC_data_table tr > td.LC_browser_file_metamodified { |
background: #FFFF77; |
background: #FFFF77; |
} |
} |
table#LC_browser tr.LC_browser_folder { |
table.LC_data_table tr.LC_browser_folder > td { |
background: #CCCCFF; |
background: #CCCCFF; |
} |
} |
|
|
span.LC_current_location { |
span.LC_current_location { |
font-size: x-large; |
font-size:larger; |
background: $pgbg; |
background: $pgbg; |
} |
} |
|
|
Line 5298 table.LC_scantron_action {
|
Line 5383 table.LC_scantron_action {
|
width: 100%; |
width: 100%; |
} |
} |
table.LC_scantron_action tr th { |
table.LC_scantron_action tr th { |
font: normal bold $sans; |
font-weight:bold; |
|
font-style:normal; |
} |
} |
|
.LC_edit_problem_header, |
div.LC_edit_problem_header, |
|
div.LC_edit_problem_footer { |
div.LC_edit_problem_footer { |
font: normal medium $sans; |
font: normal medium $sans; |
margin: 2px; |
margin: 2px; |
Line 5351 hr.LC_edit_problem_divide {
|
Line 5436 hr.LC_edit_problem_divide {
|
height: 3px; |
height: 3px; |
border: 0px; |
border: 0px; |
} |
} |
|
img.stift{ |
|
border-width:0; |
|
vertical-align:middle; |
|
} |
|
|
|
table#LC_mainmenu{ |
|
margin-top:10px; |
|
width:80%; |
|
|
|
} |
|
|
|
table#LC_mainmenu td.LC_mainmenu_col_fieldset{ |
|
vertical-align: top; |
|
width: 45%; |
|
} |
|
.LC_mainmenu_fieldset_category { |
|
color: $font; |
|
background: $pgbg; |
|
font-family: $sans; |
|
font-size: small; |
|
font-weight: bold; |
|
} |
|
fieldset#LC_mainmenu_fieldset { |
|
margin:0px 10px 10px 0px; |
|
|
|
} |
|
/* ---- Remove when done ---- |
|
# The following styles is part of the redesign of LON-CAPA and are |
|
# subject to change during this project. |
|
# Don't rely on their current functionality as they might be |
|
# changed or removed. |
|
# --------------------------*/ |
|
|
|
a:hover, |
|
ol.smallMenu a:hover, |
|
ol#MenuBreadcrumbs a:hover, |
|
ul#TabMainMenuContent a:hover, |
|
.FormSectionClearButton input:hover{ |
|
color:#BF2317; |
|
text-decoration:none; |
|
} |
|
|
|
h1 { |
|
padding:5px 10px 5px 0px; |
|
line-height:130%; |
|
} |
|
|
|
h2,h3,h4,h5,h6 |
|
{ |
|
margin:5px 0px 5px 0px; |
|
line-height:130%; |
|
} |
|
.hcell{ |
|
padding:3px 15px 3px 15px; |
|
margin:0px; |
|
background-color:$pgbg; |
|
background-color:$ border-bottom:solid 1px $lg_border_color; |
|
} |
|
.noBorder { |
|
border:0px; |
|
} |
|
/* |
|
.bgLightGrey { background:URL(images/TabMenuBG.png) repeat-x left top; } |
|
.bgLightGreyYellow {background-color:#EFECE0;} |
|
*/ |
|
|
|
|
|
/* Main Header with discription of Person, Course, etc. */ |
|
.HeadRight { |
|
text-align: right; |
|
float: right; |
|
margin: 0px; |
|
padding: 0px; |
|
right:0; |
|
position:absolute; |
|
overflow:hidden; |
|
} |
|
|
|
p { |
|
padding: 10px; |
|
|
|
} |
|
.FormSectionClearButton input { |
|
background-color:transparent; |
|
border:0px; |
|
cursor:pointer; |
|
text-decoration:underline; |
|
} |
|
|
|
|
|
dl,ul,div,fieldset { |
|
margin: 10px 10px 10px 0px; |
|
overflow:hidden; |
|
} |
|
ol.smallMenu { |
|
margin: 0px; |
|
} |
|
|
|
ol.smallMenu li { |
|
display: inline; |
|
padding: 5px 5px 0px 10px; |
|
vertical-align: top; |
|
} |
|
|
|
ol.smallMenu li img { |
|
vertical-align: bottom; |
|
} |
|
|
|
ol.smallMenu a { |
|
font-size: 90%; |
|
color: RGB(80, 80, 80); |
|
text-decoration: none; |
|
} |
|
|
|
ol#TabMainMenuContent { |
|
|
|
margin: 0px 0px 10px 0px; |
|
padding: 0px; |
|
} |
|
|
|
ol#TabMainMenuContent li { |
|
display: inline; |
|
vertical-align: bottom; |
|
border-bottom: solid 1px RGB(175, 175, 175); |
|
border-right: solid 1px RGB(175, 175, 175); |
|
padding: 5px 15px 5px 15px; |
|
margin-right:4px; |
|
line-height: 140%; |
|
font-weight: bold; |
|
overflow:hidden; |
|
/* background: RGB(211, 206, 205) URL(images/TabMenuBG.png) repeat-x left top;*/ |
|
} |
|
|
|
ol#TabMainMenuContent li a{ |
|
color: RGB(47, 47, 47); |
|
text-decoration: none; |
|
} |
|
|
|
ol#TabMainMenuContent div.columnSection { |
|
margin-bottom: 0px; |
|
} |
|
|
|
ol#MenuBreadcrumbs, ol#PathBreadcrumbs { |
|
border-top: solid 1px RGB(255, 255, 255); |
|
height: 20px; |
|
line-height: 20px; |
|
vertical-align: bottom; |
|
margin: 0px 0px 30px 0px; |
|
padding-left: 10px; |
|
list-style-position: inside; |
|
/* background: RGB(211, 206, 205) URL(images/TabMenuBG.png) repeat-x left |
|
top;*/ |
|
} |
|
|
|
ol#MenuBreadcrumbs li, ol#PathBreadcrumbs li { |
|
/* background: url(images/pfeil_white.png) no-repeat left center;*/ |
|
display: inline; |
|
padding: 0px 0px 0px 10px; |
|
vertical-align: bottom; |
|
overflow:hidden; |
|
} |
|
|
|
ol#MenuBreadcrumbs li a { |
|
text-decoration: none; |
|
font-size:90%; |
|
} |
|
ol#PathBreadcrumbs li a{ |
|
text-decoration:none; |
|
font-size:100%; |
|
font-weight:bold; |
|
} |
|
|
|
.ContentBoxSpecial |
|
{ |
|
border: solid 1px $lg_border_color; |
|
} |
|
.ContentBox { |
|
padding:10px; |
|
} |
|
.PopUp |
|
{ |
|
padding:10px; |
|
border-left:solid 1px $lg_border_color; |
|
border-top:solid 1px $lg_border_color; |
|
border-bottom:outset 1px $lg_border_color; |
|
border-right:outset 1px $lg_border_color; |
|
display:none; |
|
position:absolute; |
|
right:0; |
|
background-color:white; |
|
z-index:5; |
|
} |
|
|
|
dl.ListStyleClean dt { |
|
padding-right: 5px; |
|
display: table-header-group; |
|
} |
|
|
|
dl.ListStyleClean dd { |
|
display: table-row; |
|
} |
|
|
|
.ListStyleClean, |
|
.ListStyleSimple, |
|
.ListStyleNormal, |
|
.ListStyleNormal_Border, |
|
.ListStyleSpecial |
|
{ |
|
/*display:block; */ |
|
list-style-position: inside; |
|
list-style-type: none; |
|
overflow: hidden; |
|
padding: 0px; |
|
} |
|
|
|
.ListStyleSimple li, |
|
.ListStyleSimple dd, |
|
.ListStyleNormal li, |
|
.ListStyleNormal dd, |
|
.ListStyleSpecial li, |
|
.ListStyleSpecial dd |
|
{ |
|
margin: 0px; |
|
padding: 5px 5px 5px 10px; |
|
clear: both; |
|
} |
|
|
|
.ListStyleClean li, |
|
.ListStyleClean dd { |
|
padding-top: 0px; |
|
padding-bottom: 0px; |
|
} |
|
|
|
.ListStyleSimple dd, |
|
.ListStyleSimple li{ |
|
border-bottom: solid 1px $lg_border_color; |
|
} |
|
|
|
.ListStyleSpecial li, |
|
.ListStyleSpecial dd { |
|
list-style-type: none; |
|
background-color: RGB(220, 220, 220); |
|
margin-bottom: 4px; |
|
} |
|
|
|
table.SimpleTable { |
|
margin:5px; |
|
border:solid 1px $lg_border_color; |
|
} |
|
|
|
table.SimpleTable tr { |
|
padding:0px; |
|
border:solid 1px $lg_border_color; |
|
} |
|
table.SimpleTable thead{ |
|
background:rgb(220,220,220); |
|
} |
|
|
|
div.columnSection { |
|
display: block; |
|
clear: both; |
|
overflow: hidden; |
|
margin:0px; |
|
} |
|
|
|
div.columnSection>* { |
|
float: left; |
|
margin: 10px 20px 10px 0px; |
|
overflow:hidden; |
|
} |
|
div.columnSection > .ContentBox, |
|
div.columnSection > .ContentBoxSpecial |
|
{ |
|
width: 400px; |
|
|
|
} |
|
|
|
.LC_loginpage_container { |
|
text-align:left; |
|
margin : 0 auto; |
|
width:65%; |
|
padding: 10px; |
|
height: auto; |
|
background-color:#FFFFFF; |
|
border:1px solid #CCCCCC; |
|
} |
|
|
|
|
|
.LC_loginpage_loginContainer { |
|
float:left; |
|
width:60%; |
|
} |
|
|
|
.LC_loginpage_loginInfo { |
|
margin-top:20px; |
|
margin-left:20px; |
|
float:left; |
|
width:30%; |
|
border:1px solid #CCCCCC; |
|
padding:10px; |
|
} |
|
|
|
.LC_loginpage_space { |
|
clear:both; |
|
margin-bottom:20px; |
|
border-bottom: 1px solid #CCCCCC; |
|
} |
|
|
|
.LC_loginpage_fieldset{ |
|
border: 1px solid #CCCCCC; |
|
margin: 0 auto; |
|
} |
|
|
|
.LC_loginpage_legend{ |
|
padding: 2px; |
|
margin: 0px; |
|
font-size:14px; |
|
font-weight:bold; |
|
} |
|
|
|
|
|
|
END |
END |
} |
} |
|
|
Line 6799 sub instrule_disallow_msg {
|
Line 7206 sub instrule_disallow_msg {
|
$text{'action'} = 'IDs'; |
$text{'action'} = 'IDs'; |
} |
} |
} |
} |
$response = &mt("The $text{'item'} you chose $text{'match'} the format of $text{'items'} defined for <span class=\"LC_cusr_emph\">[_1]</span>, but the $text{'item'} $text{'do'} not exist in the institutional directory.",$domdesc).'<br />'; |
$response = &mt("The $text{'item'} you chose $text{'match'} the format of $text{'items'} defined for [_1], but the $text{'item'} $text{'do'} not exist in the institutional directory.",'<span class="LC_cusr_emph">'.$domdesc.'</span>').'<br />'; |
if ($mode eq 'upload') { |
if ($mode eq 'upload') { |
if ($checkitem eq 'username') { |
if ($checkitem eq 'username') { |
$response .= &mt("You will need to modify your upload file so it will include $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}."); |
$response .= &mt("You will need to modify your upload file so it will include $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}."); |
} elsif ($checkitem eq 'id') { |
} elsif ($checkitem eq 'id') { |
$response .= &mt("Either upload a file which includes $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or when associating fields with data columns, omit an association for the ID/Student Number field."); |
$response .= &mt("Either upload a file which includes $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or when associating fields with data columns, omit an association for the Student/Employee ID field."); |
|
} |
|
} elsif ($mode eq 'selfcreate') { |
|
if ($checkitem eq 'id') { |
|
$response .= &mt("You must either choose $text{'action'} with a different format -- $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or leave the ID field blank."); |
} |
} |
} else { |
} else { |
if ($checkitem eq 'username') { |
if ($checkitem eq 'username') { |
Line 6834 sub sorted_inst_types {
|
Line 7245 sub sorted_inst_types {
|
my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); |
my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); |
my $othertitle = &mt('All users'); |
my $othertitle = &mt('All users'); |
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
$othertitle = 'any'; |
$othertitle = &mt('Any users'); |
} |
} |
my @types; |
my @types; |
if (ref($order) eq 'ARRAY') { |
if (ref($order) eq 'ARRAY') { |
Line 6847 sub sorted_inst_types {
|
Line 7258 sub sorted_inst_types {
|
} |
} |
if (keys(%{$usertypes}) > 0) { |
if (keys(%{$usertypes}) > 0) { |
$othertitle = &mt('Other users'); |
$othertitle = &mt('Other users'); |
if ($env{'request.course.id'}) { |
|
$othertitle = 'other'; |
|
} |
|
} |
} |
return ($othertitle,$usertypes,\@types); |
return ($othertitle,$usertypes,\@types); |
} |
} |
Line 7041 sub ask_for_embedded_content {
|
Line 7449 sub ask_for_embedded_content {
|
<form name="upload_embedded" action="'.$actionurl.'" |
<form name="upload_embedded" action="'.$actionurl.'" |
method="post" enctype="multipart/form-data">'; |
method="post" enctype="multipart/form-data">'; |
$upload_output .= $state; |
$upload_output .= $state; |
$upload_output .= '<b>Upload embedded files</b>:<br />'.start_data_table(); |
$upload_output .= '<b>Upload embedded files</b>:<br />'.&start_data_table(); |
|
|
my $num = 0; |
my $num = 0; |
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) { |
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) { |
Line 7056 sub ask_for_embedded_content {
|
Line 7464 sub ask_for_embedded_content {
|
$upload_output.='<span class="LC_warning">'.&mt("Invalid characters").'</span>'; |
$upload_output.='<span class="LC_warning">'.&mt("Invalid characters").'</span>'; |
|
|
} else { |
} else { |
|
|
$upload_output .=' |
$upload_output .=' |
<input name="embedded_item_'.$num.'" type="file" value="bob" /> |
<input name="embedded_item_'.$num.'" type="file" value="" /> |
<input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />'; |
<input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />'; |
my $attrib = join(':',@{$$allfiles{$embed_file}}); |
my $attrib = join(':',@{$$allfiles{$embed_file}}); |
$upload_output .= |
$upload_output .= |
Line 7083 sub ask_for_embedded_content {
|
Line 7490 sub ask_for_embedded_content {
|
return $upload_output; |
return $upload_output; |
} |
} |
|
|
|
sub upload_embedded { |
|
my ($context,$dirpath,$uname,$udom,$dir_root,$url_root,$group,$disk_quota, |
|
$current_disk_usage) = @_; |
|
my $output; |
|
for (my $i=0; $i<$env{'form.number_embedded_items'}; $i++) { |
|
next if (!exists($env{'form.embedded_item_'.$i.'.filename'})); |
|
my $orig_uploaded_filename = |
|
$env{'form.embedded_item_'.$i.'.filename'}; |
|
|
|
$env{'form.embedded_orig_'.$i} = |
|
&unescape($env{'form.embedded_orig_'.$i}); |
|
my ($path,$fname) = |
|
($env{'form.embedded_orig_'.$i} =~ m{(.*/)([^/]*)}); |
|
# no path, whole string is fname |
|
if (!$fname) { $fname = $env{'form.embedded_orig_'.$i} }; |
|
|
|
$path = $env{'form.currentpath'}.$path; |
|
$fname = &Apache::lonnet::clean_filename($fname); |
|
# See if there is anything left |
|
next if ($fname eq ''); |
|
|
|
# Check if file already exists as a file or directory. |
|
my ($state,$msg); |
|
if ($context eq 'portfolio') { |
|
my $port_path = $dirpath; |
|
if ($group ne '') { |
|
$port_path = "groups/$group/$port_path"; |
|
} |
|
($state,$msg) = &check_for_upload($path,$fname,$group,'embedded_item_'.$i, |
|
$dir_root,$port_path,$disk_quota, |
|
$current_disk_usage,$uname,$udom); |
|
if ($state eq 'will_exceed_quota' |
|
|| $state eq 'file_locked' |
|
|| $state eq 'file_exists' ) { |
|
$output .= $msg; |
|
next; |
|
} |
|
} elsif (($context eq 'author') || ($context eq 'testbank')) { |
|
($state,$msg) = &check_for_existing($path,$fname,'embedded_item_'.$i); |
|
if ($state eq 'exists') { |
|
$output .= $msg; |
|
next; |
|
} |
|
} |
|
# Check if extension is valid |
|
if (($fname =~ /\.(\w+)$/) && |
|
(&Apache::loncommon::fileembstyle($1) eq 'hdn')) { |
|
$output .= &mt('Invalid file extension ([_1]) - reserved for LONCAPA use - rename the file with a different extension and re-upload. ',$1); |
|
next; |
|
} elsif (($fname =~ /\.(\w+)$/) && |
|
(!defined(&Apache::loncommon::fileembstyle($1)))) { |
|
$output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1); |
|
next; |
|
} elsif ($fname=~/\.(\d+)\.(\w+)$/) { |
|
$output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2); |
|
next; |
|
} |
|
|
|
$env{'form.embedded_item_'.$i.'.filename'}=$fname; |
|
if ($context eq 'portfolio') { |
|
my $result= |
|
&Apache::lonnet::userfileupload('embedded_item_'.$i,'', |
|
$dirpath.$path); |
|
if ($result !~ m|^/uploaded/|) { |
|
$output .= '<span class="LC_error">' |
|
.&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' |
|
,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}) |
|
.'</span><br />'; |
|
next; |
|
} else { |
|
$output .= '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'. |
|
$path.$fname.'</span>').'</p>'; |
|
} |
|
} else { |
|
# Save the file |
|
my $target = $env{'form.embedded_item_'.$i}; |
|
my $fullpath = $dir_root.$dirpath.'/'.$path; |
|
my $dest = $fullpath.$fname; |
|
my $url = $url_root.$dirpath.'/'.$path.$fname; |
|
my @parts=split(/\//,$fullpath); |
|
my $count; |
|
my $filepath = $dir_root; |
|
for ($count=4;$count<=$#parts;$count++) { |
|
$filepath .= "/$parts[$count]"; |
|
if ((-e $filepath)!=1) { |
|
mkdir($filepath,0770); |
|
} |
|
} |
|
my $fh; |
|
if (!open($fh,'>'.$dest)) { |
|
&Apache::lonnet::logthis('Failed to create '.$dest); |
|
$output .= '<span class="LC_error">'. |
|
&mt('An error occurred while trying to upload [_1] for embedded element [_2].',$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}). |
|
'</span><br />'; |
|
} else { |
|
if (!print $fh $env{'form.embedded_item_'.$i}) { |
|
&Apache::lonnet::logthis('Failed to write to '.$dest); |
|
$output .= '<span class="LC_error">'. |
|
&mt('An error occurred while writing the file [_1] for embedded element [_2].',$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}). |
|
'</span><br />'; |
|
} else { |
|
if ($context eq 'testbank') { |
|
$output .= &mt('Embedded file uploaded successfully:'). |
|
' <a href="'.$url.'">'. |
|
$orig_uploaded_filename.'</a><br />'; |
|
} else { |
|
$output .= '<font size="+2">'. |
|
&mt('View embedded file: [_1]','<a href="'.$url.'">'. |
|
$orig_uploaded_filename.'</a>').'</font><br />'; |
|
} |
|
} |
|
close($fh); |
|
} |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
sub check_for_existing { |
|
my ($path,$fname,$element) = @_; |
|
my ($state,$msg); |
|
if (-d $path.'/'.$fname) { |
|
$state = 'exists'; |
|
$msg = &mt('Unable to upload [_1]. A directory by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$path); |
|
} elsif (-e $path.'/'.$fname) { |
|
$state = 'exists'; |
|
$msg = &mt('Unable to upload [_1]. A file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$path); |
|
} |
|
if ($state eq 'exists') { |
|
$msg = '<span class="LC_error">'.$msg.'</span><br />'; |
|
} |
|
return ($state,$msg); |
|
} |
|
|
|
sub check_for_upload { |
|
my ($path,$fname,$group,$element,$portfolio_root,$port_path, |
|
$disk_quota,$current_disk_usage,$uname,$udom) = @_; |
|
my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?) |
|
my $getpropath = 1; |
|
my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname, |
|
$getpropath); |
|
my $found_file = 0; |
|
my $locked_file = 0; |
|
foreach my $line (@dir_list) { |
|
my ($file_name)=split(/\&/,$line,2); |
|
if ($file_name eq $fname){ |
|
$file_name = $path.$file_name; |
|
if ($group ne '') { |
|
$file_name = $group.$file_name; |
|
} |
|
$found_file = 1; |
|
if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { |
|
$locked_file = 1; |
|
} |
|
} |
|
} |
|
if (($current_disk_usage + $filesize) > $disk_quota){ |
|
my $msg = '<span class="LC_error">'. |
|
&mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.','<span class="LC_filename">'.$fname.'</span>',$filesize).'</span>'. |
|
'<br />'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.',$disk_quota,$current_disk_usage); |
|
return ('will_exceed_quota',$msg); |
|
} elsif ($found_file) { |
|
if ($locked_file) { |
|
my $msg = '<span class="LC_error">'; |
|
$msg .= &mt('Unable to upload [_1]. A locked file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>','<span class="LC_filename">'.$port_path.$env{'form.currentpath'}.'</span>'); |
|
$msg .= '</span><br />'; |
|
$msg .= &mt('You will be able to rename or delete existing [_1] after a grade has been assigned.','<span class="LC_filename">'.$fname.'</span>'); |
|
return ('file_locked',$msg); |
|
} else { |
|
my $msg = '<span class="LC_error">'; |
|
$msg .= &mt('Unable to upload [_1]. A file by that name was found in [_2].','<span class="LC_filename">'.$fname.'</span>',$port_path.$env{'form.currentpath'}); |
|
$msg .= '</span>'; |
|
$msg .= '<br />'; |
|
$msg .= &mt('To upload, rename or delete existing [_1] in [_2].','<span class="LC_filename">'.$fname.'</span>', $port_path.$env{'form.currentpath'}); |
|
return ('file_exists',$msg); |
|
} |
|
} |
|
} |
|
|
|
|
=pod |
=pod |
|
|
Line 7312 Apache Request ref, $records is an array
|
Line 7898 Apache Request ref, $records is an array
|
###################################################### |
###################################################### |
sub csv_print_samples { |
sub csv_print_samples { |
my ($r,$records) = @_; |
my ($r,$records) = @_; |
my $samples = &get_samples($records,3); |
my $samples = &get_samples($records,5); |
|
|
$r->print(&mt('Samples').'<br />'.&start_data_table(). |
$r->print(&mt('Samples').'<br />'.&start_data_table(). |
&start_data_table_header_row()); |
&start_data_table_header_row()); |
Line 7359 sub csv_print_select_table {
|
Line 7945 sub csv_print_select_table {
|
&end_data_table_header_row()."\n"); |
&end_data_table_header_row()."\n"); |
foreach my $array_ref (@$d) { |
foreach my $array_ref (@$d) { |
my ($value,$display,$defaultcol)=@{ $array_ref }; |
my ($value,$display,$defaultcol)=@{ $array_ref }; |
$r->print(&start_data_table_row().'<tr><td>'.$display.'</td>'); |
$r->print(&start_data_table_row().'<td>'.$display.'</td>'); |
|
|
$r->print('<td><select name=f'.$i. |
$r->print('<td><select name=f'.$i. |
' onchange="javascript:flip(this.form,'.$i.');">'); |
' onchange="javascript:flip(this.form,'.$i.');">'); |
Line 7367 sub csv_print_select_table {
|
Line 7953 sub csv_print_select_table {
|
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) { |
$r->print('<option value="'.$sample.'"'. |
$r->print('<option value="'.$sample.'"'. |
($sample eq $defaultcol ? ' selected="selected" ' : ''). |
($sample eq $defaultcol ? ' selected="selected" ' : ''). |
'>Column '.($sample+1).'</option>'); |
'>'.&mt('Column [_1]',($sample+1)).'</option>'); |
} |
} |
$r->print('</select></td>'.&end_data_table_row()."\n"); |
$r->print('</select></td>'.&end_data_table_row()."\n"); |
$i++; |
$i++; |
Line 7398 sub csv_samples_select_table {
|
Line 7984 sub csv_samples_select_table {
|
my ($r,$records,$d) = @_; |
my ($r,$records,$d) = @_; |
my $i=0; |
my $i=0; |
# |
# |
my $samples = &get_samples($records,3); |
my $max_samples = 5; |
|
my $samples = &get_samples($records,$max_samples); |
$r->print(&start_data_table(). |
$r->print(&start_data_table(). |
&start_data_table_header_row().'<th>'. |
&start_data_table_header_row().'<th>'. |
&mt('Field').'</th><th>'.&mt('Samples').'</th>'. |
&mt('Field').'</th><th>'.&mt('Samples').'</th>'. |
Line 7414 sub csv_samples_select_table {
|
Line 8001 sub csv_samples_select_table {
|
$display.'</option>'); |
$display.'</option>'); |
} |
} |
$r->print('</select></td><td>'); |
$r->print('</select></td><td>'); |
foreach my $line (0..2) { |
foreach my $line (0..($max_samples-1)) { |
if (defined($samples->[$line]{$key})) { |
if (defined($samples->[$line]{$key})) { |
$r->print($samples->[$line]{$key}."<br />\n"); |
$r->print($samples->[$line]{$key}."<br />\n"); |
} |
} |
Line 8055 sub build_recipient_list {
|
Line 8642 sub build_recipient_list {
|
} elsif ($origmail ne '') { |
} elsif ($origmail ne '') { |
push(@recipients,$origmail); |
push(@recipients,$origmail); |
} |
} |
if ($defmail ne '') { |
if (defined($defmail)) { |
push(@recipients,$defmail); |
if ($defmail ne '') { |
|
push(@recipients,$defmail); |
|
} |
} |
} |
if ($otheremails) { |
if ($otheremails) { |
my @others; |
my @others; |
Line 8092 domain - to an array. Also generates ja
|
Line 8681 domain - to an array. Also generates ja
|
generate Domain Coordinator interface for editing Course Categories. |
generate Domain Coordinator interface for editing Course Categories. |
|
|
Inputs: |
Inputs: |
|
|
categories (reference to hash of category definitions). |
categories (reference to hash of category definitions). |
|
|
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
categories and subcategories). |
categories and subcategories). |
|
|
idx (reference to hash of counters used in Domain Coordinator interface for |
idx (reference to hash of counters used in Domain Coordinator interface for |
editing Course Categories). |
editing Course Categories). |
|
|
jsarray (reference to array of categories used to create Javascript arrays for |
jsarray (reference to array of categories used to create Javascript arrays for |
Domain Coordinator interface for editing Course Categories). |
Domain Coordinator interface for editing Course Categories). |
|
|
Line 8139 sub gather_categories {
|
Line 8732 sub gather_categories {
|
Used to generate breadcrumb trails for course categories. |
Used to generate breadcrumb trails for course categories. |
|
|
Inputs: |
Inputs: |
|
|
categories (reference to hash of category definitions). |
categories (reference to hash of category definitions). |
|
|
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
categories and subcategories). |
categories and subcategories). |
|
|
trails (reference to array of breacrumb trails for each category). |
trails (reference to array of breacrumb trails for each category). |
|
|
allitems (reference to hash - key is category key |
allitems (reference to hash - key is category key |
(format: escaped(name):escaped(parent category):depth in hierarchy). |
(format: escaped(name):escaped(parent category):depth in hierarchy). |
|
|
idx (reference to hash of counters used in Domain Coordinator interface for |
idx (reference to hash of counters used in Domain Coordinator interface for |
editing Course Categories). |
editing Course Categories). |
|
|
jsarray (reference to array of categories used to create Javascript arrays for |
jsarray (reference to array of categories used to create Javascript arrays for |
Domain Coordinator interface for editing Course Categories). |
Domain Coordinator interface for editing Course Categories). |
|
|
|
subcats (reference to hash of arrays containing all subcategories within each |
|
category, -recursive) |
|
|
Returns: nothing |
Returns: nothing |
|
|
Side effects: populates trails and allitems hash references. |
Side effects: populates trails and allitems hash references. |
Line 8157 Side effects: populates trails and allit
|
Line 8759 Side effects: populates trails and allit
|
=cut |
=cut |
|
|
sub extract_categories { |
sub extract_categories { |
my ($categories,$cats,$trails,$allitems,$idx,$jsarray) = @_; |
my ($categories,$cats,$trails,$allitems,$idx,$jsarray,$subcats) = @_; |
if (ref($categories) eq 'HASH') { |
if (ref($categories) eq 'HASH') { |
&gather_categories($categories,$cats,$idx,$jsarray); |
&gather_categories($categories,$cats,$idx,$jsarray); |
if (ref($cats->[0]) eq 'ARRAY') { |
if (ref($cats->[0]) eq 'ARRAY') { |
Line 8178 sub extract_categories {
|
Line 8780 sub extract_categories {
|
if (ref($cats->[1]{$name}) eq 'ARRAY') { |
if (ref($cats->[1]{$name}) eq 'ARRAY') { |
for (my $j=0; $j<@{$cats->[1]{$name}}; $j++) { |
for (my $j=0; $j<@{$cats->[1]{$name}}; $j++) { |
my $category = $cats->[1]{$name}[$j]; |
my $category = $cats->[1]{$name}[$j]; |
&recurse_categories($cats,2,$category,$trails,$allitems,\@parents); |
if (ref($subcats) eq 'HASH') { |
|
push(@{$subcats->{$item}},&escape($category).':'.&escape($name).':1'); |
|
} |
|
&recurse_categories($cats,2,$category,$trails,$allitems,\@parents,$subcats); |
|
} |
|
} else { |
|
if (ref($subcats) eq 'HASH') { |
|
$subcats->{$item} = []; |
} |
} |
} |
} |
} |
} |
Line 8194 sub extract_categories {
|
Line 8803 sub extract_categories {
|
Recursively used to generate breadcrumb trails for course categories. |
Recursively used to generate breadcrumb trails for course categories. |
|
|
Inputs: |
Inputs: |
|
|
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
cats (reference to array of arrays/hashes which encapsulates hierarchy of |
categories and subcategories). |
categories and subcategories). |
|
|
depth (current depth in hierarchy of categories and sub-categories - 0 indexed). |
depth (current depth in hierarchy of categories and sub-categories - 0 indexed). |
category (current course category, for which breadcrumb trail is being generated). |
|
trails (reference to array of breacrumb trails for each category). |
category (current course category, for which breadcrumb trail is being generated). |
|
|
|
trails (reference to array of breadcrumb trails for each category). |
|
|
allitems (reference to hash - key is category key |
allitems (reference to hash - key is category key |
(format: escaped(name):escaped(parent category):depth in hierarchy). |
(format: escaped(name):escaped(parent category):depth in hierarchy). |
|
|
parents (array containing containers directories for current category, |
parents (array containing containers directories for current category, |
back to top level). |
back to top level). |
|
|
Line 8208 Returns: nothing
|
Line 8823 Returns: nothing
|
|
|
Side effects: populates trails and allitems hash references |
Side effects: populates trails and allitems hash references |
|
|
=back |
|
|
|
=cut |
=cut |
|
|
sub recurse_categories { |
sub recurse_categories { |
my ($cats,$depth,$category,$trails,$allitems,$parents) = @_; |
my ($cats,$depth,$category,$trails,$allitems,$parents,$subcats) = @_; |
my $shallower = $depth - 1; |
my $shallower = $depth - 1; |
if (ref($cats->[$depth]{$category}) eq 'ARRAY') { |
if (ref($cats->[$depth]{$category}) eq 'ARRAY') { |
for (my $k=0; $k<@{$cats->[$depth]{$category}}; $k++) { |
for (my $k=0; $k<@{$cats->[$depth]{$category}}; $k++) { |
Line 8226 sub recurse_categories {
|
Line 8839 sub recurse_categories {
|
} |
} |
my $deeper = $depth+1; |
my $deeper = $depth+1; |
push(@{$parents},$category); |
push(@{$parents},$category); |
&recurse_categories($cats,$deeper,$name,$trails,$allitems,$parents); |
if (ref($subcats) eq 'HASH') { |
|
my $subcat = &escape($name).':'.$category.':'.$depth; |
|
for (my $j=@{$parents}; $j>=0; $j--) { |
|
my $higher; |
|
if ($j > 0) { |
|
$higher = &escape($parents->[$j]).':'. |
|
&escape($parents->[$j-1]).':'.$j; |
|
} else { |
|
$higher = &escape($parents->[$j]).'::'.$j; |
|
} |
|
push(@{$subcats->{$higher}},$subcat); |
|
} |
|
} |
|
&recurse_categories($cats,$deeper,$name,$trails,$allitems,$parents, |
|
$subcats); |
pop(@{$parents}); |
pop(@{$parents}); |
} |
} |
} else { |
} else { |
Line 8240 sub recurse_categories {
|
Line 8867 sub recurse_categories {
|
return; |
return; |
} |
} |
|
|
|
=pod |
|
|
|
=item *&assign_categories_table() |
|
|
|
Create a datatable for display of hierarchical categories in a domain, |
|
with checkboxes to allow a course to be categorized. |
|
|
|
Inputs: |
|
|
|
cathash - reference to hash of categories defined for the domain (from |
|
configuration.db) |
|
|
|
currcat - scalar with an & separated list of categories assigned to a course. |
|
|
|
Returns: $output (markup to be displayed) |
|
|
|
=cut |
|
|
|
sub assign_categories_table { |
|
my ($cathash,$currcat) = @_; |
|
my $output; |
|
if (ref($cathash) eq 'HASH') { |
|
my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth); |
|
&extract_categories($cathash,\@cats,\@trails,\%allitems,\%idx,\@jsarray); |
|
$maxdepth = scalar(@cats); |
|
if (@cats > 0) { |
|
my $itemcount = 0; |
|
if (ref($cats[0]) eq 'ARRAY') { |
|
$output = &Apache::loncommon::start_data_table(); |
|
my @currcategories; |
|
if ($currcat ne '') { |
|
@currcategories = split('&',$currcat); |
|
} |
|
for (my $i=0; $i<@{$cats[0]}; $i++) { |
|
my $parent = $cats[0][$i]; |
|
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
next if ($parent eq 'instcode'); |
|
my $item = &escape($parent).'::0'; |
|
my $checked = ''; |
|
if (@currcategories > 0) { |
|
if (grep(/^\Q$item\E$/,@currcategories)) { |
|
$checked = ' checked="checked" '; |
|
} |
|
} |
|
$output .= '<tr '.$css_class.'><td><span class="LC_nobreak">'. |
|
'<input type="checkbox" name="usecategory" value="'. |
|
$item.'"'.$checked.' />'.$parent.'</span>'. |
|
'<input type="hidden" name="catname" value="'.$parent.'" /></td>'; |
|
my $depth = 1; |
|
push(@path,$parent); |
|
$output .= &assign_category_rows($itemcount,\@cats,$depth,$parent,\@path,\@currcategories); |
|
pop(@path); |
|
$output .= '</tr><tr><td colspan="'.$maxdepth.'" class="LC_row_separator"></td></tr>'; |
|
$itemcount ++; |
|
} |
|
$output .= &Apache::loncommon::end_data_table(); |
|
} |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
=pod |
|
|
|
=item *&assign_category_rows() |
|
|
|
Create a datatable row for display of nested categories in a domain, |
|
with checkboxes to allow a course to be categorized,called recursively. |
|
|
|
Inputs: |
|
|
|
itemcount - track row number for alternating colors |
|
|
|
cats - reference to array of arrays/hashes which encapsulates hierarchy of |
|
categories and subcategories. |
|
|
|
depth - current depth in hierarchy of categories and sub-categories - 0 indexed. |
|
|
|
parent - parent of current category item |
|
|
|
path - Array containing all categories back up through the hierarchy from the |
|
current category to the top level. |
|
|
|
currcategories - reference to array of current categories assigned to the course |
|
|
|
Returns: $output (markup to be displayed). |
|
|
|
=cut |
|
|
|
sub assign_category_rows { |
|
my ($itemcount,$cats,$depth,$parent,$path,$currcategories) = @_; |
|
my ($text,$name,$item,$chgstr); |
|
if (ref($cats) eq 'ARRAY') { |
|
my $maxdepth = scalar(@{$cats}); |
|
if (ref($cats->[$depth]) eq 'HASH') { |
|
if (ref($cats->[$depth]{$parent}) eq 'ARRAY') { |
|
my $numchildren = @{$cats->[$depth]{$parent}}; |
|
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
|
$text .= '<td><table class="LC_datatable">'; |
|
for (my $j=0; $j<$numchildren; $j++) { |
|
$name = $cats->[$depth]{$parent}[$j]; |
|
$item = &escape($name).':'.&escape($parent).':'.$depth; |
|
my $deeper = $depth+1; |
|
my $checked = ''; |
|
if (ref($currcategories) eq 'ARRAY') { |
|
if (@{$currcategories} > 0) { |
|
if (grep(/^\Q$item\E$/,@{$currcategories})) { |
|
$checked = ' checked="checked" '; |
|
} |
|
} |
|
} |
|
$text .= '<tr><td><span class="LC_nobreak"><label>'. |
|
'<input type="checkbox" name="usecategory" value="'. |
|
$item.'"'.$checked.' />'.$name.'</label></span>'. |
|
'<input type="hidden" name="catname" value="'.$name.'" />'. |
|
'</td><td>'; |
|
if (ref($path) eq 'ARRAY') { |
|
push(@{$path},$name); |
|
$text .= &assign_category_rows($itemcount,$cats,$deeper,$name,$path,$currcategories); |
|
pop(@{$path}); |
|
} |
|
$text .= '</td></tr>'; |
|
} |
|
$text .= '</table></td>'; |
|
} |
|
} |
|
} |
|
return $text; |
|
} |
|
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
|
|
|
sub commit_customrole { |
sub commit_customrole { |
my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_; |
my ($udom,$uname,$url,$three,$four,$five,$start,$end,$context) = @_; |
my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.':'.$three.' in '.$url. |
my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.':'.$three.' in '.$url. |
($start?', '.&mt('starting').' '.localtime($start):''). |
($start?', '.&mt('starting').' '.localtime($start):''). |
($end?', ending '.localtime($end):'').': <b>'. |
($end?', ending '.localtime($end):'').': <b>'. |
&Apache::lonnet::assigncustomrole( |
&Apache::lonnet::assigncustomrole( |
$udom,$uname,$url,$three,$four,$five,$end,$start). |
$udom,$uname,$url,$three,$four,$five,$end,$start,undef,undef,$context). |
'</b><br />'; |
'</b><br />'; |
return $output; |
return $output; |
} |
} |
Line 8752 sub construct_course {
|
Line 9509 sub construct_course {
|
$outcome .= ($fatal?$errtext:'read ok').' - '; |
$outcome .= ($fatal?$errtext:'read ok').' - '; |
my $title; my $url; |
my $title; my $url; |
if ($args->{'firstres'} eq 'syl') { |
if ($args->{'firstres'} eq 'syl') { |
$title='Syllabus'; |
$title=&mt('Syllabus'); |
$url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; |
$url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; |
} else { |
} else { |
$title='Navigate Contents'; |
$title=&mt('Navigate Contents'); |
$url='/adm/navmaps'; |
$url='/adm/navmaps'; |
} |
} |
|
|
Line 8809 sub icon {
|
Line 9566 sub icon {
|
return &lonhttpdurl($iconname); |
return &lonhttpdurl($iconname); |
} |
} |
|
|
sub lonhttpd_port { |
|
my $lonhttpd_port=$Apache::lonnet::perlvar{'lonhttpdPort'}; |
|
if (!defined($lonhttpd_port)) { $lonhttpd_port='8080'; } |
|
# IE doesn't like a secure page getting images from a non-secure |
|
# port (when logging we haven't parsed the browser type so default |
|
# back to secure |
|
if ((!exists($env{'browser.type'}) || $env{'browser.type'} eq 'explorer') |
|
&& $ENV{'SERVER_PORT'} == 443) { |
|
return 443; |
|
} |
|
return $lonhttpd_port; |
|
|
|
} |
|
|
|
sub lonhttpdurl { |
sub lonhttpdurl { |
|
# |
|
# Had been used for "small fry" static images on separate port 8080. |
|
# Modify here if lightweight http functionality desired again. |
|
# Currently eliminated due to increasing firewall issues. |
|
# |
my ($url)=@_; |
my ($url)=@_; |
|
return $url; |
my $lonhttpd_port = &lonhttpd_port(); |
|
if ($lonhttpd_port == 443) { |
|
return 'https://'.$ENV{'SERVER_NAME'}.$url; |
|
} |
|
return 'http://'.$ENV{'SERVER_NAME'}.':'.$lonhttpd_port.$url; |
|
} |
} |
|
|
sub connection_aborted { |
sub connection_aborted { |
Line 8908 sub init_user_environment {
|
Line 9651 sub init_user_environment {
|
} |
} |
# Give them a new cookie |
# Give them a new cookie |
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'} |
my $id = ($args->{'robot'} ? 'robot'.$args->{'robot'} |
: $now); |
: $now.$$.int(rand(10000))); |
$cookie="$username\_$id\_$domain\_$authhost"; |
$cookie="$username\_$id\_$domain\_$authhost"; |
|
|
# Initialize roles |
# Initialize roles |
Line 9023 sub init_user_environment {
|
Line 9766 sub init_user_environment {
|
|
|
sub _add_to_env { |
sub _add_to_env { |
my ($idf,$env_data,$prefix) = @_; |
my ($idf,$env_data,$prefix) = @_; |
while (my ($key,$value) = each(%$env_data)) { |
if (ref($env_data) eq 'HASH') { |
$idf->{$prefix.$key} = $value; |
while (my ($key,$value) = each(%$env_data)) { |
$env{$prefix.$key} = $value; |
$idf->{$prefix.$key} = $value; |
|
$env{$prefix.$key} = $value; |
|
} |
} |
} |
} |
} |
|
|
|
# --- Get the symbolic name of a problem and the url |
|
sub get_symb { |
|
my ($request,$silent) = @_; |
|
(my $url=$env{'form.url'}) =~ s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--; |
|
my $symb=($env{'form.symb'} ne '' ? $env{'form.symb'} : (&Apache::lonnet::symbread($url))); |
|
if ($symb eq '') { |
|
if (!$silent) { |
|
$request->print("Unable to handle ambiguous references:$url:."); |
|
return (); |
|
} |
|
} |
|
&Apache::lonenc::check_decrypt(\$symb); |
|
return ($symb); |
|
} |
|
|
|
# --------------------------------------------------------------Get annotation |
|
|
|
sub get_annotation { |
|
my ($symb,$enc) = @_; |
|
|
|
my $key = $symb; |
|
if (!$enc) { |
|
$key = |
|
&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]); |
|
} |
|
my %annotation=&Apache::lonnet::get('nohist_annotations',[$key]); |
|
return $annotation{$key}; |
|
} |
|
|
|
sub clean_symb { |
|
my ($symb) = @_; |
|
|
|
&Apache::lonenc::check_decrypt(\$symb); |
|
my $enc = $env{'request.enc'}; |
|
delete($env{'request.enc'}); |
|
|
|
return ($symb,$enc); |
|
} |
|
|
=pod |
=pod |
|
|