--- loncom/interface/lonhtmlcommon.pm 2009/08/23 04:02:47 1.234 +++ loncom/interface/lonhtmlcommon.pm 2011/12/11 13:23:24 1.296 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.234 2009/08/23 04:02:47 raeburn Exp $ +# $Id: lonhtmlcommon.pm,v 1.296 2011/12/11 13:23:24 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -60,13 +60,49 @@ 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.''; + } else { + return ''; + } +} + +sub raw_href_to_link { + my ($message)=@_; + $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 @@ -76,7 +112,7 @@ Successful completion of an operation me sub confirm_success { my ($message,$failure)=@_; if ($failure) { - return ''."\n" + return ''."\n" .''.&mt('Error').' '."\n" .$message."\n" .''."\n"; @@ -107,11 +143,11 @@ 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 <$help_text + $help_text ENDDRAGMATH } @@ -123,7 +159,6 @@ ENDDRAGMATH Javascript used to open pop-up window containing dragmath applet which can be used to paste LaTeX into a textarea. - =cut sub dragmath_js { @@ -222,6 +257,9 @@ sub select_recent { unless ($value =~/^error\:/) { my $escaped = &Apache::loncommon::escape_url($value); &Apache::loncommon::inhibit_menu_check(\$escaped); + if ($area eq 'residx') { + next if ((!&Apache::lonnet::allowed('bre',$value)) && (!&Apache::lonnet::allowed('bro',$value))); + } $return.="\n'; @@ -364,7 +402,8 @@ dname_hour, dname_min, and dname_sec. The current setting for this time parameter. A unix format time (time in seconds since the beginning of Jan 1st, 1970, GMT. -An undefined value is taken to indicate the value is the current time. +An undefined value is taken to indicate the value is the current time +unless it is requested to leave it empty. See $includeempty. Also, to be explicit, a value of 'now' also indicates the current time. =item $special @@ -374,6 +413,9 @@ the date_setter. See lonparmset for exa =item $includeempty +If it is set (true) and no date/time value is provided, +the date/time fields are left empty. + =item $state Specifies the initial state of the form elements. Either 'disabled' or empty. @@ -393,7 +435,11 @@ sub date_setter { my ($formname,$dname,$currentvalue,$special,$includeempty,$state, $no_hh_mm_ss,$defhour,$defmin,$defsec,$nolink) = @_; my $now = time; - my $wasdefined=1; + + my $tzname; + my ($sec,$min,$hour,$mday,$month,$year) = ('', '', undef,''.''.''); + #other potentially useful values: wkday,yrday,is_daylight_savings + if (! defined($state) || $state ne 'disabled') { $state = ''; } @@ -401,33 +447,24 @@ sub date_setter { $no_hh_mm_ss = 0; } if ($currentvalue eq 'now') { - $currentvalue = $now; + $currentvalue = $now; } - if ((!defined($currentvalue)) || ($currentvalue eq '')) { - $wasdefined=0; - if ($includeempty) { - $currentvalue = 0; - } else { - $currentvalue = $now; - } + + # Default value: Set empty date field to current time + # unless empty inclusion is requested + if ((!$includeempty) && (!$currentvalue)) { + $currentvalue = $now; } - # other potentially useful values: wkday,yrday,is_daylight_savings - my $tzname; - my ($sec,$min,$hour,$mday,$month,$year)=('','',undef,'','',''); + # Do we have a date? Split it! if ($currentvalue) { - ($tzname,$sec,$min,$hour,$mday,$month,$year) = &get_timedates($currentvalue); - } - unless ($wasdefined) { - ($tzname,$sec,$min,$hour,$mday,$month,$year) = &get_timedates($now); - if (($defhour) || ($defmin) || ($defsec)) { - $sec=($defsec?$defsec:0); - $min=($defmin?$defmin:0); - $hour=($defhour?$defhour:0); - } elsif (!$includeempty) { - $sec=0; - $min=0; - $hour=0; - } + ($tzname,$sec,$min,$hour,$mday,$month,$year) = &get_timedates($currentvalue); + + #No values provided for hour, min, sec? Use default 0 + if (($defhour) || ($defmin) || ($defsec)) { + $sec = ($defsec ? $defsec : 0); + $min = ($defmin ? $defmin : 0); + $hour = ($defhour ? $defhour : 0); + } } my $result = "\n\n"; $result .= < 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); @@ -1066,27 +1099,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(); } @@ -1117,47 +1147,45 @@ sub r_print { # ------------------------------------------------------- Puts directory header sub crumbs { - my ($uri,$target,$prefix,$form,$size,$noformat,$skiplast)=@_; - if (! defined($size)) { - $size = '+2'; - } + my ($uri,$target,$prefix,$form,$skiplast)=@_; if ($target) { $target = ' target="'. &Apache::loncommon::escape_single($target).'"'; } - my $output=''; - unless ($noformat) { $output.='
'; } - $output.=''.$prefix.'/'; - if ($env{'user.adv'}) { - my $path=$prefix.'/'; - foreach my $dir (split('/',$uri)) { + my $output=''; + $output.=$prefix.'/'; + if (($env{'user.adv'}) || ($env{'user.author'})) { + my $path=$prefix.'/'; + foreach my $dir (split('/',$uri)) { if (! $dir) { next; } $path .= $dir; - if ($path eq $uri) { - if ($skiplast) { - $output.=$dir; + if ($path eq $uri) { + if ($skiplast) { + $output.=$dir; last; - } - } else { - $path.='/'; - } + } + } else { + $path.='/'; + } my $href_path = &HTML::Entities::encode($path,'<>&"'); - &Apache::loncommon::inhibit_menu_check(\$href_path); - if ($form) { - my $href = 'javascript:'.$form.".action='".$href_path."';".$form.'.submit();'; - $output.=qq{$dir/}; - } else { - $output.=qq{$dir/}; - } - } + &Apache::loncommon::inhibit_menu_check(\$href_path); + if ($form) { + my $href = 'javascript:'.$form.".action='".$href_path."';".$form.'.submit();'; + $output.=qq{$dir/}; + } else { + $output.=qq{$dir/}; + } + } } else { - foreach my $dir (split('/',$uri)) { + foreach my $dir (split('/',$uri)) { if (! $dir) { next; } - $output.=$dir.'/'; - } + $output.=$dir.'/'; + } } if ($uri !~ m|/$|) { $output=~s|/$||; } - return $output.''.($noformat?'':'
'); + $output.='
'; + + return $output; } # --------------------- A function that generates a window for the spellchecker @@ -1205,50 +1233,25 @@ 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 { - return if (&htmlareablocked()); - return if (!&htmlareabrowser()); - return (< -ENDHEADERS + my $s=""; + if (&htmlareabrowser()) { + $s.=(< +ENDEDITOR + } + $s.=(< + + +ENDJQUERY + return $s; } # ----------------------------------------------------------------- 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'; @@ -1261,27 +1264,149 @@ 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; } @@ -1298,6 +1423,34 @@ sub htmlareabrowser { return 1; } +# +# Should the "return to content" link be shown? +# + +sub show_return_link { + + unless ($env{'request.course.id'}) { return 0; } + if ($env{'request.noversionuri'}=~m{^/priv/} || + $env{'request.uri'}=~m{^/~}) { return 1; } + + 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)($|\?)}) + )); +} + + ############################################################ ############################################################ @@ -1342,6 +1495,7 @@ returns: nothing ############################################################ { my @Crumbs; + my %tools = (); sub breadcrumbs { my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, $CourseBreadcrumbs) = @_; @@ -1362,8 +1516,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; @@ -1381,29 +1536,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'})); @@ -1425,21 +1590,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; } - $links = htmltag('div', $links, + &render_tools(\$links); + $links = &htmltag('div', $links, { id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ; + &render_advtools(\$links); # Return the @Crumbs stack to what we started with push(@Crumbs,$last); @@ -1450,11 +1617,111 @@ returns: nothing sub clear_breadcrumbs { undef(@Crumbs); + undef(%tools); } sub add_breadcrumb { 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 + + sub add_breadcrumb_tool { + my ($category, @html) = @_; + return unless @html; + if (!keys(%tools)) { + %tools = ( navigation => [], tools => [], advtools => []); + } + + #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); + } + +=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'}) ); + } } # End of scope for @Crumbs @@ -1547,7 +1814,7 @@ END } sub row_title { - my ($title,$css_title_class,$css_value_class) = @_; + my ($title,$css_title_class,$css_value_class, $css_value_furtherAttributes) = @_; $row_count[0]++; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; $css_title_class ||= 'LC_pick_box_title'; @@ -1559,7 +1826,7 @@ sub row_title { $title .= ':'; } my $output = <<"ENDONE"; - + $title @@ -1587,9 +1854,12 @@ 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'; + if ($cdom ne '' && $cnum ne '') { + $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum); + } my $output; if (defined($title)) { $output = &row_title($title,$css_class); @@ -1614,7 +1884,7 @@ sub role_select_row { $plrole = &mt('Custom Role'); } } else { - $plrole=&Apache::lonnet::plaintext($role); + $plrole=&Apache::lonnet::plaintext($role,$crstype); } if (($role ne 'cr') || (!$show_separate_custom)) { $output .= ' '; @@ -1629,15 +1899,15 @@ sub role_select_row { sub course_select_row { my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles, - $css_class) = @_; + $css_class,$crstype,$standardnames) = @_; my $output = &row_title($title,$css_class); - $output .= &course_selection($formname,$totcodes,$codetitles,$idlist,$idlist_titles); + $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) = @_; + my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles,$crstype,$standardnames) = @_; my $output = qq| |; + + my ($allcrs,$pickspec); + if ($crstype eq 'Community') { + $allcrs = &mt('All communities'); + $pickspec = &mt('Pick specific communities:'); + } else { + $allcrs = &mt('All courses'); + $pickspec = &mt('Pick specific course(s):'); + } + my $courseform=''.&Apache::loncommon::selectcourse_link - ($formname,'pickcourse','pickdomain','coursedesc','',1).''; - $output .= ''.&mt('All courses').'
'; + ($formname,'pickcourse','pickdomain','coursedesc','',1,$crstype).''; + $output .= ''.$allcrs.'
'; if ($totcodes > 0) { my $numtitles = @$codetitles; if ($numtitles > 0) { $output .= ''.&mt('Pick courses by category:').'
'; $output .= ''; for (my $i=1; $i<$numtitles; $i++) { $output .= '
'.$$codetitles[0].'
'."\n". - '
'.$$codetitles[$i].'
'."\n". - ''."\n". @@ -1713,7 +1993,7 @@ sub course_selection { $output .= '

'; } } - $output .= ''.&mt('Pick specific course(s):').' '.$courseform.'  selected.
'."\n"; + $output .= ''.$pickspec.' '.$courseform.'  selected.
'."\n"; return $output; } @@ -1796,26 +2076,53 @@ sub course_custom_roles { } +sub resource_info_box { + my ($symb,$onlyfolderflag)=@_; + my $return=''; + if ($symb) { + $return=&Apache::loncommon::start_data_table(); + my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symb); + my $folder=&Apache::lonnet::gettitle($map); + $return.=&Apache::loncommon::start_data_table_row(). + ''.&mt('Folder:').''.$folder.''. + &Apache::loncommon::end_data_table_row(); + unless ($onlyfolderflag) { + $return.=&Apache::loncommon::start_data_table_row(). + ''.&mt('Resource:').''.&Apache::lonnet::gettitle($symb).''. + &Apache::loncommon::end_data_table_row(); + } + $return.=&Apache::loncommon::end_data_table(); + } else { + $return='

'.&mt('No context provided.').'

'; + } + return $return; + +} + ############################################## ############################################## # topic_bar # -# Generates a div containing a numbered (static image) followed by a title -# with a background color defined in the corresponding CSS: LC_topic_bar -# +# Generates a div containing an (optional) number with a white background followed by a +# title with a background color defined in the corresponding CSS: LC_topic_bar +# Inputs: +# 1. number to display. +# If input for number is empty only the title will be displayed. +# 2. title text to display. +# Outputs - a scalar containing html mark-up for the div. + sub topic_bar { - my ($imgnum,$title) = @_; - return '
' - .''.&mt('Step [_1]',$imgnum).'' - .' '.$title - .'
'; + my ($num,$title) = @_; + my $number = ''; + if ($num ne '') { + $number = ''.$num.''; + } + return '
'.$number.$title.'
'; } ############################################## ############################################## - # echo_form_input # # Generates html markup to add form elements from the referrer page @@ -1848,30 +2155,30 @@ sub echo_form_input { if ($key =~ /^form\.(.+)$/) { my $name = $1; my $match = 0; - if ((!@{$excluded}) || (!grep/^$name$/,@{$excluded})) { - if (defined($regexps)) { - if (@{$regexps} > 0) { - foreach my $regexp (@{$regexps}) { - if ($name =~ /\Q$regexp\E/) { - $match = 1; - last; - } + if (ref($excluded) eq 'ARRAY') { + next if (grep(/^\Q$name\E$/,@{$excluded})); + } + if (ref($regexps) eq 'ARRAY') { + if (@{$regexps} > 0) { + foreach my $regexp (@{$regexps}) { + if ($name =~ /$regexp/) { + $match = 1; + last; } } } - if (!$match) { - if (ref($env{$key})) { - foreach my $value (@{$env{$key}}) { - $value = &HTML::Entities::encode($value,'<>&"'); - $output .= ''."\n"; - } - } else { - my $value = &HTML::Entities::encode($env{$key},'<>&"'); - $output .= ''."\n"; - } + } + next if ($match); + if (ref($env{$key}) eq 'ARRAY') { + foreach my $value (@{$env{$key}}) { + $value = &HTML::Entities::encode($value,'<>&"'); + $output .= ''."\n"; } + } else { + my $value = &HTML::Entities::encode($env{$key},'<>&"'); + $output .= ''."\n"; } } } @@ -1880,7 +2187,6 @@ sub echo_form_input { ############################################## ############################################## - # set_form_elements # # Generates javascript to set form elements to values based on @@ -2023,6 +2329,7 @@ sub set_form_elements { } } $output .= " + return; }\n"; return $output; } @@ -2030,6 +2337,251 @@ sub set_form_elements { ############################################## ############################################## +sub file_submissionchk_js { + my ($turninpaths,$multiples) = @_; + my $overwritewarn = &mt('File(s) you uploaded for your submission will overwrite existing file(s) submitted for this item').'\\n'. + &mt('Continue submission and overwrite the file(s)?'); + my $delfilewarn = &mt('You have indicated you wish to remove some files previously included in your submission.').'\\n'. + &mt('Continue submission with these files removed?'); + my ($turninpathtext,$multtext,$arrayindexofjs); + if (ref($turninpaths) eq 'HASH') { + foreach my $key (sort(keys(%{$turninpaths}))) { + $turninpathtext .= " if (prefix == '$key') {\n". + " return '$turninpaths->{$key}';\n". + " }\n"; + } + } + $turninpathtext .= " return '';\n"; + if (ref($multiples) eq 'HASH') { + foreach my $key (sort(keys(%{$multiples}))) { + $multtext .= " if (prefix == '$key') {\n". + " return '$multiples->{$key}';\n". + " }\n"; + } + } + $multtext .= " return '';\n"; + + $arrayindexofjs = &Apache::loncommon::javascript_array_indexof(); + return <<"ENDSCRIPT"; + + +$arrayindexofjs + +ENDSCRIPT +} + +############################################## +############################################## + # javascript_valid_email # # Generates javascript to validate an e-mail address. @@ -2097,7 +2649,7 @@ sub htmltag{ # USAGE: inittags(@tags); # # EXAMPLES: -# - my ($h1, $h2, $h3) = initTags( qw( h1 h2 h3 ) ) +# - my ($h1, $h2, $h3) = inittags( qw( h1 h2 h3 ) ) # $h1->("This is a headline") #Returns:

This is a headline

# # NOTES: See sub htmltag for further information. @@ -2146,6 +2698,40 @@ sub scripttag { }; +=item list_from_array( \@array, { listattr =>{}, itemattr =>{} } ) + +Constructs a XHTML list from \@array. + +input: + +=over + +=item \@array + +A reference to the array containing text that will be wrapped in
  • tags. + +=item { listattr => {}, itemattr =>{} } + +Attributes for
      and
    • passed in as hash references. +See htmltag() for more details. + +=back + +returns: XHTML list as String. + +=cut + +# \@items, {listattr => { class => 'abc', id => 'xyx' }, itemattr => {class => 'abc', id => 'xyx'}} +sub list_from_array { + my ($items, $args) = @_; + return unless (ref($items) eq 'ARRAY'); + return unless scalar @$items; + my ($ul, $li) = inittags( qw(ul li) ); + my $listitems = join '', map { $li->($_, $args->{itemattr}) } @$items; + return $ul->( $listitems, $args->{listattr} ); +} + + ############################################## ############################################## @@ -2175,12 +2761,6 @@ sub scripttag { # # Outputs: A scalar containing the html markup for the menu. -# ---- Remove when done ---- -# This routine is part of the redesign of LON-CAPA and it's -# subject to change during this project. -# Don't rely on its current functionality as it might be -# changed or removed. -# -------------------------- sub generate_menu { my @menu = @_; # subs for specific html elements @@ -2196,11 +2776,15 @@ sub generate_menu { # create the markup for the current $link and push it into @links. # each entry consists of an image and a text optionally followed # by a help link. + my $src; + if ($$link{icon} ne '') { + $src = '/res/adm/pages/'.$$link{icon}; + } push(@links,$li->( $a->( $img->("", { class => "LC_noBorder LC_middle", - src => "/res/adm/pages/$$link{icon}", + src => $src, alt => mt(defined($$link{alttext}) ? $$link{alttext} : $$link{linktext}) }), { @@ -2270,8 +2854,7 @@ Returns: HTML code with function list st sub start_funclist { my($legendtext)=@_; $legendtext=&mt('Functions') if !$legendtext; - return "
      \n$legendtext\n" - .'
        '."\n"; + return '
        • '.$legendtext.'
        • '."\n"; } @@ -2304,9 +2887,6 @@ sub add_item_funclist { return '
        • '.$content.'
        • '."\n"; } -############################################## -############################################## - =pod =item &end_funclist @@ -2322,17 +2902,47 @@ add_item_funclist Inputs: ./. Returns: HTML code with function list end - =cut -############################################## -############################################## - sub end_funclist { - my($r)=@_; - return "
        \n
      \n"; + return "
    \n"; } +=pod + +=item funclist_from_array( \@array, {legend => 'text for legend'} ) + +Constructs a XHTML list from \@array with the first item being visually +highlighted and set to the value of legend or 'Functions' if legend is +empty. + +=over + +=item \@array + +A reference to the array containing text that will be wrapped in
  • tags. + +=item { legend => 'text' } + +A string that's used as visually highlighted first item. 'Functions' is used if +it's value evaluates to false. + +=back + +returns: XHTML list as string. + +=back + +=cut + +sub funclist_from_array { + my ($items, $args) = @_; + return unless(ref($items) eq 'ARRAY'); + $args->{legend} ||= mt('Functions'); + return list_from_array( [$args->{legend}, @$items], + { listattr => {class => 'LC_funclist'} }); +} + 1; __END__ 500 Internal Server Error

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

    More information about this error may be available in the server error log.