--- loncom/interface/lonhtmlcommon.pm 2009/07/02 17:22:33 1.226 +++ loncom/interface/lonhtmlcommon.pm 2009/11/23 14:04:37 1.248 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.226 2009/07/02 17:22:33 bisitz Exp $ +# $Id: lonhtmlcommon.pm,v 1.248 2009/11/23 14:04:37 wenzelju Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,6 +62,16 @@ use Apache::lonlocal; use Apache::lonnet; use LONCAPA; + +sub coursepreflink { + my ($text,$category)=@_; + if (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) { + return '<a href="/adm/courseprefs?phase=display&actions='.$category.'">'.$text.'</a>'; + } else { + return ''; + } +} + ############################################## ############################################## @@ -82,7 +92,7 @@ sub confirm_success { .'</span>'."\n"; } else { return '<span class="LC_success">'."\n" - .'<img src="/adm/lonIcons/navmap.correct.gif" alt="'.&mt('Ok').'" /> '."\n" + .'<img src="/adm/lonIcons/navmap.correct.gif" alt="'.&mt('OK').'" /> '."\n" .$message."\n" .'</span>'."\n"; } @@ -111,7 +121,7 @@ sub dragmath_button { } my $buttontext=&mt('Edit Math'); return <<ENDDRAGMATH; - <input type="button" value="$buttontext", onclick="javascript:mathedit('$textarea',document)" />$help_text + <input type="button" value="$buttontext" onclick="javascript:mathedit('$textarea',document)" />$help_text ENDDRAGMATH } @@ -160,8 +170,8 @@ sub authorbombs { $url=&Apache::lonnet::declutter($url); my ($udom,$uname)=($url=~m{^($LONCAPA::domain_re)/($LONCAPA::username_re)/}); my %bombs=&Apache::lonmsg::all_url_author_res_msg($uname,$udom); - foreach (keys %bombs) { - if ($_=~/^$udom\/$uname\//) { + foreach my $bomb (keys(%bombs)) { + if ($bomb =~ /^$udom\/$uname\//) { return '<a href="/adm/bombs/'.$url. '"><img src="'.&Apache::loncommon::lonhttpdurl('/adm/lonMisc/bomb.gif').'" alt="'.&mt('Bomb').'" border="0" /></a>'. &Apache::loncommon::help_open_topic('About_Bombs'); @@ -239,7 +249,7 @@ sub get_recent { # Begin filling return_hash with any 'always_include' option my %time_hash = (); my %return_hash = (); - foreach my $item (keys %recent) { + foreach my $item (keys(%recent)) { my ($thistime,$thisvalue)=(split(/\&/,$recent{$item})); if ($thistime eq 'always_include') { $return_hash{$item} = &unescape($thisvalue); @@ -505,9 +515,9 @@ ENDJS unshift(@Months,'If you can read this an error occurred'); if ($includeempty) { $monthselector.="<option value=''></option>"; } for(my $m = 1;$m <=$#Months;$m++) { - $monthselector .= qq{ <option value="$m" }; - $monthselector .= "selected " if ($m-1 eq $month); - $monthselector .= '> '.&mt($Months[$m]).' </option>'; + $monthselector .= qq{ <option value="$m"}; + $monthselector .= ' selected="selected"' if ($m-1 eq $month); + $monthselector .= '> '.&mt($Months[$m]).' </option>'."\n"; } $monthselector.= ' </select>'; # Day @@ -520,8 +530,8 @@ ENDJS $hourselector.=qq{<option value=''></option>}; } for (my $h = 0;$h<24;$h++) { - $hourselector .= qq{<option value="$h" }; - $hourselector .= "selected " if (defined($hour) && $hour == $h); + $hourselector .= qq{<option value="$h"}; + $hourselector .= ' selected="selected"' if (defined($hour) && $hour == $h); $hourselector .= ">"; my $timest=''; if ($h == 0) { @@ -978,8 +988,7 @@ sub Create_PrgWin { #the whole function called through timeout is due to issues #in mozilla Read BUG #2665 if you want to know the whole story - &r_print($r,'<script type="text/javascript">'. - '// <![CDATA['. + &r_print($r,&Apache::lonhtmlcommon::scripttag( "var popwin; function openpopwin () { popwin=open(\'\',\'popwin\',\'width=400,height=100\');". @@ -990,9 +999,8 @@ sub Create_PrgWin { &mt('Starting').'" /><\\/form>'.$end_page. "\');". "popwin.document.close();}". - "\nwindow.setTimeout(openpopwin,0)". - '// ]]>'. - '</script>'); + "\nwindow.setTimeout(openpopwin,0)" + )); $prog_state{'formname'}='popremain'; $prog_state{'inputname'}="remaining"; } elsif ($type eq 'inline') { @@ -1025,14 +1033,12 @@ sub Create_PrgWin { # update progress sub Update_PrgWin { my ($r,$prog_state,$displayString)=@_; - &r_print($r,'<script type="text/javascript">'. - '// <![CDATA['. + &r_print($r,&Apache::lonhtmlcommon::scripttag( $$prog_state{'window'}.'.document.'. - $$prog_state{'formname'}.'.'. - $$prog_state{'inputname'}.'.value="'. - $displayString.'";'. - '// ]]>'. - '</script>'); + $$prog_state{'formname'}.'.'. + $$prog_state{'inputname'}.'.value="'. + $displayString.'";' + )); $$prog_state{'laststart'}=&Time::HiRes::time(); } @@ -1085,15 +1091,13 @@ sub Increment_PrgWin { if ($user_browser eq 'explorer' && $user_os =~ 'mac') { $lasttime = ''; } - &r_print($r,'<script>'. - '// <![CDATA['. + &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.'";'. - '// ]]>'. - '</script>'); + $$prog_state{'formname'}.'.'. + $$prog_state{'inputname'}.'.value="'. + $$prog_state{'done'}.'/'.$$prog_state{'max'}. + ': '.$time_est.' '.&mt('remaining').' '.$lasttime.'";' + )); $$prog_state{'laststart'}=&Time::HiRes::time(); } @@ -1101,11 +1105,9 @@ sub Increment_PrgWin { sub Close_PrgWin { my ($r,$prog_state)=@_; if ($$prog_state{'type'} eq 'popup') { - &r_print($r,'<script>'. - '// <![CDATA['. - 'popwin.close()'. - '// ]]>'. - '</script>'."\n"); + &r_print($r,&Apache::lonhtmlcommon::scripttag( + 'popwin.close()' + )); } elsif ($$prog_state{'type'} eq 'inline') { &Update_PrgWin($r,$prog_state,&mt('Done')); } @@ -1136,7 +1138,7 @@ sub crumbs { my $output=''; unless ($noformat) { $output.='<br /><tt><b>'; } $output.='<font size="'.$size.'">'.$prefix.'/'; - if ($env{'user.adv'}) { + if (($env{'user.adv'}) | ($env{'user.author'})) { my $path=$prefix.'/'; foreach my $dir (split('/',$uri)) { if (! $dir) { next; } @@ -1272,8 +1274,8 @@ sub htmlareaselectactive { my @fields=@_; unless (&htmlareabrowser()) { return ''; } if (&htmlareablocked()) { return '<br />'.&enablelink(@fields); } - my $output='<script type="text/javascript" defer="1">' - .'// <![CDATA['; + my $output='<script type="text/javascript" defer="1">'."\n" + .'// <![CDATA['."\n"; my $lang = &htmlarea_lang(); foreach my $field (@fields) { $output.=" @@ -1287,7 +1289,7 @@ sub htmlareaselectactive { }"; } $output.="\nwindow.status='Activated Editfields';\n" - .'// ]]>' + .'// ]]>'."\n" .'</script><br />'. &disablelink(@fields); return $output; @@ -1350,6 +1352,7 @@ returns: nothing ############################################################ { my @Crumbs; + my %tools = (); sub breadcrumbs { my ($component,$component_help,$menulink,$helplink,$css_class,$no_mt, $CourseBreadcrumbs) = @_; @@ -1435,7 +1438,7 @@ returns: nothing unless ($CourseBreadcrumbs) { $links = htmltag('ol', $links, { id => "LC_MenuBreadcrumbs" }); } else { - $links = htmltag('ul', $links, { id => "LC_CourseBreadcrumbs" }); + $links = htmltag('ul', $links, { class => "LC_CourseBreadcrumbs" }); } if ($component) { @@ -1446,8 +1449,12 @@ returns: nothing .$links; } + #SD START (work in progress!) + add_tools(\$links); + #SD END $links = htmltag('div', $links, { id => "LC_breadcrumbs" }) unless ($CourseBreadcrumbs) ; + add_advtools(\$links); # Return the @Crumbs stack to what we started with push(@Crumbs,$last); @@ -1458,12 +1465,63 @@ returns: nothing sub clear_breadcrumbs { undef(@Crumbs); + undef(%tools); } sub add_breadcrumb { - push (@Crumbs,@_); + push(@Crumbs,@_); + } + + + #SD START (work in progress!) + sub add_breadcrumb_tool { + my ($category, $html) = @_; + return unless $html; + if (!defined(%tools)) { + my %tools = ( A => [], B => [], C => []); + } + push @{$tools{$category}}, $html; + } + + sub clear_breadcrumb_tools { + undef(%tools); + } + + sub add_tools { + my ($links) = @_; + return unless defined %tools; + my $html = '<ul class="LC_bct">'; + for my $category ('A','B') { + $html .= '<li class="LC_breadcrumb_tools">' + . '<ul class="LC_breadcrumb_tools' + . " LC_breadcrumb_tools_$category\">"; + for my $item (@{$tools{$category}}){ + #SD ugly! I'll fix that later on + $item =~ s/align="(right|left)"//; + $item =~ s/<span(.*?)\/span>//; + $html .= "<li>$item</li>"; + } + $html .= '</li></ul>'; + if ($category eq 'A') { $html .= "<li>$$links</li>"; } + } + $$links = $html.'</ul>'; } + 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; + } + #SD END + } # End of scope for @Crumbs ############################################################ @@ -1555,7 +1613,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'; @@ -1567,7 +1625,7 @@ sub row_title { $title .= ':'; } my $output = <<"ENDONE"; - <tr class="LC_pick_box_row"> + <tr class="LC_pick_box_row" $css_value_furtherAttributes> <td $css_title_class> $title </td> @@ -1598,6 +1656,10 @@ ENDTWO 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); @@ -1622,7 +1684,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 .= ' <option value="'.$role.'">'.$plrole.'</option>'; @@ -1637,15 +1699,15 @@ sub role_select_row { sub course_select_row { my ($title,$formname,$totcodes,$codetitles,$idlist,$idlist_titles, - $css_class) = @_; + $css_class,$crstype) = @_; 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); $output .= &row_closure(); return $output; } sub course_selection { - my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles) = @_; + my ($formname,$totcodes,$codetitles,$idlist,$idlist_titles,$crstype) = @_; my $output = qq| <script type="text/javascript"> // <![CDATA[ @@ -1674,9 +1736,19 @@ sub course_selection { // ]]> </script> |; + + 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='<b>'.&Apache::loncommon::selectcourse_link - ($formname,'pickcourse','pickdomain','coursedesc','',1).'</b>'; - $output .= '<input type="radio" name="coursepick" value="all" onclick="coursePick(this.form)" />'.&mt('All courses').'<br />'; + ($formname,'pickcourse','pickdomain','coursedesc','',1,$crstype).'</b>'; + $output .= '<input type="radio" name="coursepick" value="all" onclick="coursePick(this.form)" />'.$allcrs.'<br />'; if ($totcodes > 0) { my $numtitles = @$codetitles; if ($numtitles > 0) { @@ -1721,7 +1793,7 @@ sub course_selection { $output .= '</tr></table><br />'; } } - $output .= '<input type="radio" name="coursepick" value="specific" onclick="coursePick(this.form);opencrsbrowser('."'".$formname."','dccourse','dcdomain','coursedesc','','1'".')" />'.&mt('Pick specific course(s):').' '.$courseform.' <input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br />'."\n"; + $output .= '<input type="radio" name="coursepick" value="specific" onclick="coursePick(this.form);opencrsbrowser('."'".$formname."','dccourse','dcdomain','coursedesc','','1','$crstype'".')" />'.$pickspec.' '.$courseform.' <input type="text" value="0" size="4" name="coursetotal" /><input type="hidden" name="courselist" value="" />selected.<br />'."\n"; return $output; } @@ -1809,16 +1881,21 @@ sub course_custom_roles { # 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 '<div class="LC_topic_bar">' - .'<img src="/res/adm/pages/bl_step'.$imgnum.'.gif"' - .' alt="'.&mt('Step [_1]',$imgnum).'" />' - .' '.$title - .'</div>'; + my ($num,$title) = @_; + my $number = ''; + if ($num ne '') { + $number = '<span>'.$num.'</span>'; + } + return '<div class="LC_topic_bar">'.$number.$title.'</div>'; } ############################################## @@ -1953,7 +2030,7 @@ sub set_form_elements { $values{$name}[$i] =~ s/([\r\n\f]+)/\\n/g; $values{$name}[$i] =~ s/"/\\"/g; } - if ($$elements{$name} eq 'text') { + if (($$elements{$name} eq 'text') || ($$elements{$name} eq 'hidden')) { my $numvalues = @{$values{$name}}; if ($numvalues > 1) { my $valuestring = join('","',@{$values{$name}}); @@ -1988,6 +2065,8 @@ sub set_form_elements { $output .= qq| if (courseForm.elements['$name'].value == "$value") { courseForm.elements['$name'].checked = true; + } else { + courseForm.elements['$name'].checked = false; }|; } } @@ -2029,6 +2108,7 @@ sub set_form_elements { } } $output .= " + return; }\n"; return $output; } @@ -2117,6 +2197,41 @@ sub inittags { } +# USAGE: scripttag(scriptcode, [start|end|both]); +# +# EXAMPLES: +# - scripttag("alert('Hello World!')", 'both') +# returns: +# <script type="text/javascript"> +# // BEGIN LON-CAPA Internal +# alert(Hello World!') +# // END LON-CAPA Internal +# </script> +# +# NOTES: +# - works currently only for javascripts +# +# OUTPUT: +# Scriptcode properly enclosed in <script> and CDATA tags (and LC +# Internal markers if 2nd argument is given) +sub scripttag { + my ( $content, $marker ) = @_; + return unless defined $content; + + my $begin = "\n// BEGIN LON-CAPA Internal\n"; + my $end = "\n// END LON-CAPA Internal\n"; + + if ($marker) { + $content = $begin . $content if $marker eq 'start' or $marker eq 'both'; + $content .= $end if $marker eq 'end' or $marker eq 'both'; + } + + $content = "\n// <![CDATA[\n$content\n// ]]>\n"; + + return htmltag('script', $content, {type => 'text/javascript'}); +}; + + ############################################## ############################################## @@ -2167,7 +2282,7 @@ 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. - push @links, $li->( + push(@links,$li->( $a->( $img->("", { class => "LC_noBorder LC_middle", @@ -2185,7 +2300,7 @@ sub generate_menu { }). (defined($$link{help}) ? Apache::loncommon::help_open_topic($$link{help}) : ''), - {class => "LC_menubuttons_inline_text"}); + {class => "LC_menubuttons_inline_text"})); } # wrap categorytitle in <h3>, concatenate with @@ -2195,10 +2310,10 @@ sub generate_menu { # such that each element looks like: # <div><h3>title</h3><ul><li>...</li>...</ul></div> # the category won't be added if there aren't any links - push @categories, + push(@categories, $div->($h3->(mt($$category{categorytitle}), {class=>"LC_hcell"}). $ul->(join('' ,@links), {class =>"LC_ListStyleNormal" }), - {class=>"LC_Box LC_400Box"}) if scalar(@links); + {class=>"LC_Box LC_400Box"})) if scalar(@links); } # wrap the joined @categories in another <div> (column layout) @@ -2241,8 +2356,7 @@ Returns: HTML code with function list st sub start_funclist { my($legendtext)=@_; $legendtext=&mt('Functions') if !$legendtext; - return "<fieldset>\n<legend>$legendtext</legend>\n" - .'<ul class="LC_funclist">'."\n"; + return '<ul class="LC_funclist"><li style="font-weight:bold; margin-left:0.8em;">'.$legendtext.'</li>'."\n"; } @@ -2300,8 +2414,7 @@ Returns: HTML code with function list en ############################################## sub end_funclist { - my($r)=@_; - return "</ul>\n</fieldset>\n"; + return "</ul>\n"; } 1;