--- loncom/interface/lonhtmlcommon.pm 2010/01/07 16:15:59 1.259
+++ loncom/interface/lonhtmlcommon.pm 2011/01/16 22:45:05 1.287
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common html routines
#
-# $Id: lonhtmlcommon.pm,v 1.259 2010/01/07 16:15:59 faziophi Exp $
+# $Id: lonhtmlcommon.pm,v 1.287 2011/01/16 22:45:05 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -60,13 +60,19 @@ use Time::Local;
use Time::HiRes;
use Apache::lonlocal;
use Apache::lonnet;
+use HTML::Entities();
use LONCAPA;
+sub java_not_enabled {
+ return "\n".''.
+ &mt('The required Java applet could not be started. Please make sure to have Java installed and active in your browser.').
+ "\n";
+}
sub coursepreflink {
my ($text,$category)=@_;
if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) {
- return ''.$text.'';
+ return '&"').'">'.$text.'';
} else {
return '';
}
@@ -74,15 +80,29 @@ sub coursepreflink {
sub raw_href_to_link {
my ($message)=@_;
- $message=~s/(https?\:\/\/[^\s\'\"]+)(\s|$)/$1<\/tt><\/a>$2/gi;
+ $message=~s/(https?\:\/\/[^\s\'\"\<]+)([\s\<]|$)/$1<\/tt><\/a>$2/gi;
return $message;
}
+sub entity_encode {
+ my ($text)=@_;
+ return &HTML::Entities::encode($text, '<>&"');
+}
+
+sub direct_parm_link {
+ my ($linktext,$symb,$filter,$part,$target)=@_;
+ $symb=&entity_encode($symb);
+ $filter=&entity_encode($filter);
+ $part=&entity_encode($part);
+ if (($symb) && (&Apache::lonnet::allowed('opa')) && ($target ne 'tex')) {
+ return "$linktext";
+ } else {
+ return $linktext;
+ }
+}
##############################################
##############################################
-=pod
-
=item confirm_success
Successful completion of an operation message
@@ -92,7 +112,7 @@ Successful completion of an operation me
sub confirm_success {
my ($message,$failure)=@_;
if ($failure) {
- return ''."\n"
+ return ''."\n"
.' '."\n"
.$message."\n"
.''."\n";
@@ -123,7 +143,7 @@ sub dragmath_button {
my ($textarea,$helpicon) = @_;
my $help_text;
if ($helpicon) {
- $help_text = &Apache::loncommon::help_open_topic('Authoring_Math_Editor');
+ $help_text = &Apache::loncommon::help_open_topic('Authoring_Math_Editor',undef,undef,undef,undef,'mathhelpicon_'.$textarea);
}
my $buttontext=&mt('Edit Math');
return < 0 ? $step : 1;
+ $$prog_state{'done'} += $step;
+
+ # Catch (max modulo step) <> 0
+ my $current = $$prog_state{'done'};
+ my $last = ($$prog_state{'max'} - $current);
+ if ($last <= 0) {
+ $last = 1;
+ $current = $$prog_state{'max'};
+ }
+
my $time_est= (&Time::HiRes::time() - $$prog_state{'firststart'})/
- $$prog_state{'done'} *
- ($$prog_state{'max'}-$$prog_state{'done'});
+ $current * $last;
$time_est = int($time_est);
#
my $min = int($time_est/60);
my $sec = $time_est % 60;
- #
- my $str;
- if ($min == 0 && $sec > 1) {
- $str = '[_2] seconds';
- } elsif ($min == 1 && $sec > 1) {
- $str = '1 minute [_2] seconds';
- } elsif ($min == 1 && $sec < 2) {
- $str = '1 minute';
- } elsif ($min < 10 && $sec > 1) {
- $str = '[_1] minutes, [_2] seconds';
- } elsif ($min >= 10 || $sec < 2) {
- $str = '[_1] minutes';
- }
- $time_est = &mt($str,$min,$sec);
- #
+
my $lasttime = &Time::HiRes::time()-$$prog_state{'laststart'};
if ($lasttime > 9) {
$lasttime = int($lasttime);
@@ -1084,27 +1100,24 @@ sub Increment_PrgWin {
} else {
$lasttime = sprintf("%3.2f",$lasttime);
}
- if ($lasttime == 1) {
- $lasttime = '('.$lasttime.' '.&mt('second for').' '.$extraInfo.')';
- } else {
- $lasttime = '('.$lasttime.' '.&mt('seconds for').' '.$extraInfo.')';
- }
- #
- my $user_browser = $env{'browser.type'} if (exists($env{'browser.type'}));
- my $user_os = $env{'browser.os'} if (exists($env{'browser.os'}));
- if (! defined($user_browser) || ! defined($user_os)) {
- (undef,$user_browser,undef,undef,undef,$user_os) =
- &Apache::loncommon::decode_user_agent();
- }
- if ($user_browser eq 'explorer' && $user_os =~ 'mac') {
- $lasttime = '';
- }
+
+ $sec = 0 if ($min >= 10); # Don't show seconds if remaining time >= 10 min.
+ $sec = 1 if ( ($min == 0) && ($sec == 0) ); # Little cheating: pretend to have 1 second remaining instead of 0 to have something to display
+
+ my $timeinfo =
+ &mt('[_1]/[_2]:'
+ .' [quant,_3,minute,minutes,] [quant,_4,second ,seconds ,]remaining'
+ .' ([quant,_5,second] for '.$extraInfo.')',
+ $current,
+ $$prog_state{'max'},
+ $min,
+ $sec,
+ $lasttime);
+
&r_print($r,&Apache::lonhtmlcommon::scripttag(
$$prog_state{'window'}.'.document.'.
$$prog_state{'formname'}.'.'.
- $$prog_state{'inputname'}.'.value="'.
- $$prog_state{'done'}.'/'.$$prog_state{'max'}.
- ': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";'
+ $$prog_state{'inputname'}.'.value="'.$timeinfo.'";'
));
$$prog_state{'laststart'}=&Time::HiRes::time();
}
@@ -1221,29 +1234,12 @@ sub spelllink {
ENDLINK
}
-# ------------------------------------------------- Output headers for HTMLArea
-
-{
- my @htmlareafields;
- sub init_htmlareafields {
- undef(@htmlareafields);
- }
-
- sub add_htmlareafields {
- my (@newfields) = @_;
- push(@htmlareafields,@newfields);
- }
-
- sub get_htmlareafields {
- return @htmlareafields;
- }
-}
+# ------------------------------------------------- Output headers for CKEditor
sub htmlareaheaders {
my $s="";
- if (!&htmlareablocked() && &htmlareabrowser()) {
+ if (&htmlareabrowser()) {
$s.=(<
ENDEDITOR
}
@@ -1257,22 +1253,6 @@ ENDJQUERY
# ----------------------------------------------------------------- Preferences
-sub disablelink {
- my @fields=@_;
- if (defined($#fields)) {
- unless ($#fields>=0) { return ''; }
- }
- return ''.&mt('Disable WYSIWYG Editor').'';
-}
-
-sub enablelink {
- my @fields=@_;
- if (defined($#fields)) {
- unless ($#fields>=0) { return ''; }
- }
- return ''.&mt('Enable WYSIWYG Editor').'';
-}
-
# ------------------------------------------------- lang to use in html editor
sub htmlarea_lang {
my $lang='en';
@@ -1285,23 +1265,45 @@ sub htmlarea_lang {
# ----------------------------------------- Script to activate only some fields
sub htmlareaselectactive {
- my @fields=@_;
+ my ($args) = @_;
unless (&htmlareabrowser()) { return ''; }
- if (&htmlareablocked()) { return '
'.&enablelink(@fields); }
- my $output='
'.
- &disablelink(@fields);
+ .'';
return $output;
}
@@ -1404,6 +1424,29 @@ sub htmlareabrowser {
return 1;
}
+#
+# Should the "return to content" link be shown?
+#
+
+sub show_return_link {
+ if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
+ || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
+
+ return if ($env{'form.register'});
+ }
+ return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
+ $env{'request.symb'} eq '')
+ ||
+ ($env{'request.noversionuri'}=~ m{^/cgi-bin/printout.pl})
+ ||
+ (($env{'request.noversionuri'}=~/^\/adm\//) &&
+ ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
+ ($env{'request.noversionuri'}!~
+ m{^/adm/.*/(smppg|bulletinboard)($|\?)})
+ ));
+}
+
+
############################################################
############################################################
@@ -1469,8 +1512,9 @@ returns: nothing
if ($menulink) {
my $description = 'Menu';
my $no_mt_descr = 0;
- if (exists($env{'request.course.id'}) &&
- $env{'request.course.id'} ne '') {
+ if ((exists($env{'request.course.id'})) &&
+ ($env{'request.course.id'} ne '') &&
+ ($env{'course.'.$env{'request.course.id'}.'.description'} ne '')) {
$description =
$env{'course.'.$env{'request.course.id'}.'.description'};
$no_mt_descr = 1;
@@ -1488,29 +1532,39 @@ returns: nothing
$last = $menulink;
}
}
- my $links = join "",
- map {
- $faq = $_->{'faq'} if (exists($_->{'faq'}));
- $bug = $_->{'bug'} if (exists($_->{'bug'}));
- $help = $_->{'help'} if (exists($_->{'help'}));
-
- my $result = htmltag( 'a',
- $_->{no_mt} ?
- $_->{text} : mt($_->{text}),
- {
- href => $_->{href},
- title => $_->{no_mt} ?
- $_->{title} : mt($_->{title}),
- target => $_->{target},
- });
- $result = htmltag( 'li', "$result $crumbsymbol");
- } @Crumbs;
+ my $links;
+ if ((&show_return_link) && (!$CourseBreadcrumbs)) {
+ $links=&htmltag( 'a',"",
+ { href => '/adm/flip?postdata=return:',
+ title => &mt("Back to most recent content resource") });
+ }
+ $links.= join "",
+ map {
+ $faq = $_->{'faq'} if (exists($_->{'faq'}));
+ $bug = $_->{'bug'} if (exists($_->{'bug'}));
+ $help = $_->{'help'} if (exists($_->{'help'}));
+
+ my $result = $_->{no_mt} ? $_->{text} : &mt($_->{text});
+
+ if ($_->{href}){
+ $result = &htmltag( 'a', $result,
+ { href => $_->{href},
+ title => $_->{no_mt} ? $_->{title} : &mt($_->{title}),
+ target => $_->{target}, });
+ }
+
+ $result = &htmltag( 'li', "$result $crumbsymbol");
+ } @Crumbs;
#should the last Element be translated?
- $links .= htmltag( 'li',
- htmltag( 'b',
- $last->{'no_mt'} ?
- $last->{'text'} : mt($last->{'text'}) ));
+
+ my $lasttext = $last->{'no_mt'} ? $last->{'text'}
+ : mt( $last->{'text'} );
+
+ # last breadcrumb is the first order heading of a page
+ # for course breadcrumbs it's just bold
+ $links .= &htmltag( 'li', htmltag($CourseBreadcrumbs ? 'b' : 'h1',
+ $lasttext), {title => $lasttext});
my $icons = '';
$faq = $last->{'faq'} if (exists($last->{'faq'}));
@@ -1532,25 +1586,23 @@ returns: nothing
unless ($CourseBreadcrumbs) {
- $links = htmltag('ol', $links, { id => "LC_MenuBreadcrumbs" });
+ $links = &htmltag('ol', $links, { id => "LC_MenuBreadcrumbs" });
} else {
- $links = htmltag('ul', $links, { class => "LC_CourseBreadcrumbs" });
+ $links = &htmltag('ul', $links, { class => "LC_CourseBreadcrumbs" });
}
if ($component) {
- $links = htmltag('span',
+ $links = &htmltag('span',
( $no_mt ? $component : mt($component) ).
( $icons ? $icons : '' ),
{ class => 'LC_breadcrumbs_component' } )
.$links;
}
- #SD START (work in progress!)
- add_tools(\$links);
- #SD END
- $links = htmltag('div', $links,
+ &render_tools(\$links);
+ $links = &htmltag('div', $links,
{ id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ;
- add_advtools(\$links);
+ &render_advtools(\$links);
# Return the @Crumbs stack to what we started with
push(@Crumbs,$last);
@@ -1568,55 +1620,104 @@ returns: nothing
push(@Crumbs,@_);
}
+=item add_breadcrumb_tool($category, $html)
+
+Adds $html to $category of the breadcrumb toolbar container.
+
+$html is usually a link to a page that invokes a function on the currently
+displayed data (e.g. print when viewing a problem)
+
+Currently there are 3 possible values for $category:
+
+=over
+
+=item navigation
+left of breadcrumbs line
+
+=item tools
+right of breadcrumbs line
+
+=item advtools
+advanced tools shown in a separate box below breadcrumbs line
+
+=back
+
+returns: nothing
+
+=cut
- #SD START (work in progress!)
sub add_breadcrumb_tool {
- my ($category, $html) = @_;
- return unless $html;
- if (!defined(%tools)) {
- my %tools = ( A => [], B => [], C => []);
+ my ($category, @html) = @_;
+ return unless @html;
+ if (!keys(%tools)) {
+ %tools = ( navigation => [], tools => [], advtools => []);
}
- push @{$tools{$category}}, $html;
+
+ #this cleans data received from lonmenu::innerregister
+ @html = grep {defined $_ && $_ ne ''} @html;
+ for (@html) {
+ s/align="(right|left)"//;
+ s/// if $category ne 'advtools';
+ }
+
+ push @{$tools{$category}}, @html;
}
+=item clear_breadcrumb_tools()
+
+Clears the breadcrumb toolbar container.
+
+returns: nothing
+
+=cut
+
sub clear_breadcrumb_tools {
undef(%tools);
}
- sub add_tools {
- my ($links) = @_;
- return unless defined %tools;
- my $html = '';
- for my $category ('A','B') {
- $html .= '- '
- . '
';
- if ($category eq 'A') { $html .= "- $$links
"; }
- }
- $$links = $html.'
';
- }
-
- sub add_advtools {
- my ($links) = @_;
- return unless (defined $tools{'C'}) and (scalar (@{$tools{'C'}}) > 0);
- my $html = start_funclist();
- for my $item (@{$tools{'C'}}){
- next unless $item;
- $item =~ s/align="(right|left)"//;
- $html .= add_item_funclist($item);
- }
- $html .= end_funclist();
- $html = Apache::loncommon::head_subbox($html);
- $$links .= $html;
+=item render_tools(\$breadcrumbs)
+
+Creates html for breadcrumb tools (categories navigation and tools) and inserts
+\$breadcrumbs at the correct position.
+
+input: \$breadcrumbs - a reference to the string containing prepared
+breadcrumbs.
+
+returns: nothing
+=cut
+
+#TODO might split this in separate functions for each category
+ sub render_tools {
+ my ($breadcrumbs) = @_;
+ return unless (keys(%tools));
+
+ my $navigation = list_from_array($tools{navigation},
+ { listattr => { class=>"LC_breadcrumb_tools_navigation" } });
+ my $tools = list_from_array($tools{tools},
+ { listattr => { class=>"LC_breadcrumb_tools_tools" } });
+ $$breadcrumbs = list_from_array([$navigation, $tools, $$breadcrumbs],
+ { listattr => { class=>'LC_breadcrumb_tools_outerlist' } });
+ }
+
+=item render_advtools(\$breadcrumbs)
+
+Creates html for advanced tools (category advtools) and inserts \$breadcrumbs
+at the correct position.
+
+input: \$breadcrumbs - a reference to the string containing prepared
+breadcrumbs (after render_tools call).
+
+returns: nothing
+=cut
+
+ sub render_advtools {
+ my ($breadcrumbs) = @_;
+ return unless (defined $tools{'advtools'})
+ and (scalar(@{$tools{'advtools'}}) > 0);
+
+ $$breadcrumbs .= Apache::loncommon::head_subbox(
+ funclist_from_array($tools{'advtools'}) );
}
- #SD END
} # End of scope for @Crumbs
@@ -1749,7 +1850,6 @@ ENDTWO
} # End: row_count block for pick_box
-
sub role_select_row {
my ($roles,$title,$css_class,$show_separate_custom,$cdom,$cnum) = @_;
my $crstype = 'Course';
@@ -1795,15 +1895,15 @@ sub role_select_row {
sub course_select_row {
my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles,
- $css_class,$crstype) = @_;
+ $css_class,$crstype,$standardnames) = @_;
my $output = &row_title($title,$css_class);
- $output .= &course_selection($formname,$totcodes,$codetitles,$idlist,$idlist_titles,$crstype);
+ $output .= &course_selection($formname,$totcodes,$codetitles,$idlist,$idlist_titles,$crstype,$standardnames);
$output .= &row_closure();
return $output;
}
sub course_selection {
- my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles,$crstype) = @_;
+ my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles,$crstype,$standardnames) = @_;
my $output = qq|