Diff for /loncom/interface/loncommon.pm between versions 1.1416 and 1.1477

version 1.1416, 2023/11/11 18:50:51 version 1.1477, 2025/03/31 13:55:07
Line 966  ENDSCRT Line 966  ENDSCRT
   
 sub select_timezone {  sub select_timezone {
    my ($name,$selected,$onchange,$includeempty,$id,$disabled)=@_;     my ($name,$selected,$onchange,$includeempty,$id,$disabled)=@_;
    my $output='<select name="'.$name.'" '.$id.$onchange.$disabled.'>'."\n";     my $labeltext = &HTML::Entities::encode(&mt('Select Time Zone'));
      my $output='<select name="'.$name.'" '.$id.$onchange.$disabled.
                 ' aria-label="'.$labeltext.'">'."\n";
    if ($includeempty) {     if ($includeempty) {
        $output .= '<option value=""';         $output .= '<option value=""';
        if (($selected eq '') || ($selected eq 'local')) {         if (($selected eq '') || ($selected eq 'local')) {
Line 1174  sub linked_select_forms { Line 1176  sub linked_select_forms {
         $menuorder,          $menuorder,
         $onchangefirst,          $onchangefirst,
         $onchangesecond,          $onchangesecond,
         $suffix          $suffix,
           $haslabel
         ) = @_;          ) = @_;
     my $second = "document.$formname.$secondselectname";      my $second = "document.$formname.$secondselectname";
     my $first = "document.$formname.$firstselectname";      my $first = "document.$formname.$firstselectname";
Line 1240  END Line 1243  END
         $result.=">".&mt($hashref->{$value}->{'text'})."</option>\n";          $result.=">".&mt($hashref->{$value}->{'text'})."</option>\n";
     }      }
     $result .= "</select>\n";      $result .= "</select>\n";
       if ($haslabel) {
           $result .= '</label>';
       }
     my %select2;      my %select2;
     if (ref($hashref->{$firstdefault}) eq 'HASH') {      if (ref($hashref->{$firstdefault}) eq 'HASH') {
         if (ref($hashref->{$firstdefault}->{'select2'}) eq 'HASH') {          if (ref($hashref->{$firstdefault}->{'select2'}) eq 'HASH') {
             %select2 = %{$hashref->{$firstdefault}->{'select2'}};              %select2 = %{$hashref->{$firstdefault}->{'select2'}};
         }          }
     }      }
     $result .= $middletext;      if ($middletext ne '') {
           $result .= '<label>'.$middletext;
       }
     $result .= "<select size=\"1\" name=\"$secondselectname\"";      $result .= "<select size=\"1\" name=\"$secondselectname\"";
     if ($onchangesecond) {      if ($onchangesecond) {
         $result .= ' onchange="'.$onchangesecond.'"';          $result .= ' onchange="'.$onchangesecond.'"';
Line 1264  END Line 1272  END
         $result.=">".&mt($select2{$value})."</option>\n";          $result.=">".&mt($select2{$value})."</option>\n";
     }      }
     $result .= "</select>\n";      $result .= "</select>\n";
       if ($middletext ne '') {
           $result .= '</label>';
       }
     #    return $debug;      #    return $debug;
     return $result;      return $result;
 }   #  end of sub linked_select_forms {  }   #  end of sub linked_select_forms {
Line 1342  sub help_open_topic { Line 1353  sub help_open_topic {
     }      }
     $template.=' <a'.$target.' href="'.$link.'" title="'.$title.'">'      $template.=' <a'.$target.' href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'                .'<img src="'.$helpicon.'" border="0"'
               .' alt="'.&mt('Help: [_1]',$topic).'"'                .' alt="'.&mt('Help icon').'"'
               .' title="'.$title.'" style="vertical-align:middle;"'.$imgid                 .' title="'.$title.'" style="vertical-align:middle;"'.$imgid 
               .' /></a>';                .' /></a>';
     if ($text ne "") {      if ($text ne "") {
Line 1372  sub helpLatexCheatsheet { Line 1383  sub helpLatexCheatsheet {
         $out .= '<span>'          $out .= '<span>'
                .&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600)                 .&help_open_topic('Authoring_Output_Tags',&mt('Output Tags'),$stayOnPage,undef,600)
                .'</span> <span>'                 .'</span> <span>'
                .&help_open_topic('Authoring_Multilingual_Problems',&mt('How to create problems in different languages'),$stayOnPage,undef,600)                 .&help_open_topic('Authoring_Multilingual_Problems',&mt('Languages'),$stayOnPage,undef,600)
        .'</span>';         .'</span>';
     }      }
     $out .= '</span>'; # End cheatsheet      $out .= '</span>'; # End cheatsheet
Line 1451  $banner_link Line 1462  $banner_link
 <a href="$link" title="$title" $linkattr>$text</a>  <a href="$link" title="$title" $linkattr>$text</a>
 END  END
     } else {      } else {
         return '&nbsp;'.$text.'&nbsp;';          return '&nbsp;<h1 class="LC_helpmenu">'.$text.'</h1>&nbsp;';
     }      }
 }  }
   
Line 1463  sub help_menu_js { Line 1474  sub help_menu_js {
     my $helptopic=&general_help();      my $helptopic=&general_help();
     my $details_link = $httphost.'/adm/help/'.$helptopic.'.hlp';      my $details_link = $httphost.'/adm/help/'.$helptopic.'.hlp';
     my $nothing=&Apache::lonhtmlcommon::javascript_nothing();      my $nothing=&Apache::lonhtmlcommon::javascript_nothing();
       my $bannertitle = &mt('Help Menu');
       &js_escape(\$bannertitle);
       my $bodytitle = &mt('Documentation');
       &js_escape(\$bodytitle);
     my $start_page =      my $start_page =
         &Apache::loncommon::start_page('Help Menu', undef,          &Apache::loncommon::start_page('Help Menu', undef,
        {'frameset'    => 1,         {'frameset'    => 1,
Line 1474  sub help_menu_js { Line 1489  sub help_menu_js {
     my $end_page =      my $end_page =
         &Apache::loncommon::end_page({'frameset' => 1,          &Apache::loncommon::end_page({'frameset' => 1,
       'js_ready' => 1,});        'js_ready' => 1,});
   
     my $template .= <<"ENDTEMPLATE";      my $template .= <<"ENDTEMPLATE";
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
Line 1499  function helpMenu(target) { Line 1513  function helpMenu(target) {
     return;      return;
 }  }
 function writeHelp(caller) {  function writeHelp(caller) {
     caller.document.writeln('$start_page\\n<frame name="bannerframe" src="'+banner_link+'" marginwidth="0" marginheight="0" frameborder="0">\\n');      caller.document.writeln('$start_page\\n<frame name="bannerframe" title="$bannertitle" src="'+banner_link+'" marginwidth="0" marginheight="0" frameborder="0">\\n');
     caller.document.writeln('<frame name="bodyframe" src="$details_link" marginwidth="0" marginheight="0" frameborder="0">\\n$end_page');      caller.document.writeln('<frame name="bodyframe" title="$bodytitle" src="$details_link" marginwidth="0" marginheight="0" frameborder="0">\\n$end_page');
     caller.document.close();      caller.document.close();
     caller.focus();      caller.focus();
 }  }
Line 1764  the id of the element to resize, second Line 1778  the id of the element to resize, second
 surrounds everything that comes after the textarea, this routine needs  surrounds everything that comes after the textarea, this routine needs
 to be attached to the <body> for the onload and onresize events.  to be attached to the <body> for the onload and onresize events.
   
 =back  
   
 =cut  =cut
   
 sub resize_textarea_js {  sub resize_textarea_js {
Line 2302  sub import_crsauthor_form { Line 2314  sub import_crsauthor_form {
         dire => 'Directory',          dire => 'Directory',
         se   => 'Select',          se   => 'Select',
     );      );
     $output = $lt{'dire'}.':&nbsp;'.      $output = '<label>'.$lt{'dire'}.':&nbsp;'.
               '<select id="'.$firstselectname.'" name="'.$firstselectname.'" '.                '<select id="'.$firstselectname.'" name="'.$firstselectname.'" '.
               'onchange="populateCrsSelects(this.form,'."'$firstselectname','$secondselectname',1,'$js_only',0,1,0,0,0".');">'.                'onchange="populateCrsSelects(this.form,'."'$firstselectname','$secondselectname',1,'$js_only',0,1,0,0,0".');">'.
               '<option value="" selected="selected">'.$lt{'se'}.'</option>';                '<option value="" selected="selected">'.$lt{'se'}.'</option>';
Line 2313  sub import_crsauthor_form { Line 2325  sub import_crsauthor_form {
         next if ($key eq '/');          next if ($key eq '/');
         $output .= '<option value="'.$key.'">'.$key.'</option>'."\n";          $output .= '<option value="'.$key.'">'.$key.'</option>'."\n";
     }      }
     $output .= '</select><br />'."\n".      $output .= '</select></label><br /><label>'."\n".
                $lt{'fnam'}.':&nbsp;<select id="'.$secondselectname.'" name="'.$secondselectname.'">'."\n".                 $lt{'fnam'}.':&nbsp;<select id="'.$secondselectname.'" name="'.$secondselectname.'">'."\n".
                '<option value="" selected="selected"></option>'."\n".                 '<option value="" selected="selected"></option>'."\n".
                '</select>'."\n".                 '</select></label>'."\n".
                '<input type="hidden" id="crsres_include_'.$suffix.'" value="'.$only.'" />';                 '<input type="hidden" id="crsres_include_'.$suffix.'" value="'.$only.'" />';
     return ($numdirs,$output);      return ($numdirs,$output);
 }  }
Line 2439  sub show_crsfiles_js { Line 2451  sub show_crsfiles_js {
 END  END
 }  }
   
   sub crsauthor_rights {
       my ($rightsfile,$path,$docroot,$cnum,$cdom) = @_;
       my $sourcerights = "$path/$rightsfile";
       my $now = time;
       if (!-e $sourcerights) {
           my $cid = $cdom.'_'.$cnum;
           if (!-e "$docroot/priv/$cdom") {
               mkdir("$docroot/priv/$cdom",0755);
           }
           if (!-e "$docroot/priv/$cdom/$cnum") {
               mkdir("$docroot/priv/$cdom/$cnum",0755);
           }
           if (open(my $fh,">$sourcerights")) {
               print $fh <<END;
   <accessrule effect="deny" realm="" type="course" role="" />
   <accessrule effect="allow" realm="$cid" type="course" role="" />
   END
               close($fh);
           }
       }
       if (!-e "$sourcerights.meta") {
           if (open(my $fh,">$sourcerights.meta")) {
               my $author=$env{'environment.firstname'}.' '.
                          $env{'environment.middlename'}.' '.
                          $env{'environment.lastname'}.' '.
                          $env{'environment.generation'};
               $author =~ s/\s+$//;
               print $fh <<"END";
   
   <abstract></abstract>
   <author>$author</author>
   <authorspace>$cnum:$cdom</authorspace>
   <copyright>private</copyright>
   <creationdate>$now</creationdate>
   <customdistributionfile></customdistributionfile>
   <dependencies></dependencies>
   <domain>$cdom</domain>
   <highestgradelevel>0</highestgradelevel>
   <keywords></keywords>
   <language>notset</language>
   <lastrevisiondate>$now</lastrevisiondate>
   <lowestgradelevel>0</lowestgradelevel>
   <mime>rights</mime>
   <modifyinguser>$env{'user.name'}:$env{'user.domain'}</modifyinguser>
   <notes></notes>
   <obsolete></obsolete>
   <obsoletereplacement></obsoletereplacement>
   <owner>$cnum:$cdom</owner>
   <rule>deny:::course,allow:$cid::course</rule>
   <sourceavail></sourceavail>
   <standards></standards>
   <subject></subject>
   <title>Course Authoring Rights</title>
   END
               close($fh);
           }
       }
       return;
   }
   
   =pod
   
   =item * &iframe_wrapper_headjs()
   
   emits javascript containing two global vars to facilitate handling of resizing
   by code in iframe_wrapper_resizejs() used when an iframe is present in a page
   with standard LON-CAPA menus.
   
   =cut
   
   #
   # Where iframe is in use, if window.onload() executes before the custom resize function
   # has been defined (jQuery), two global javascript vars (LCnotready and LCresizedef)
   # are used to ensure document.ready() triggers a call to resize, so the iframe contents
   # do not obscure the Functions menu.
   #
   
   sub iframe_wrapper_headjs {
       return <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   var LCnotready = 0;
   var LCresizedef = 0;
   // ]]>
   </script>
   
   ENDJS
   
   }
   
   =pod
   
   =item * &iframe_wrapper_resizejs()
   
   emits javascript used to handle resizing for a page containing
   an iframe, to ensure that the iframe does not obscure any
   standard LON-CAPA menu items.
   
   =back
   
   =cut
   
   #
   # jQuery to use when iframe is in use and a page resize occurs.
   # This script will ensure that the iframe does not obscure any
   # standard LON-CAPA inline menus (primary, secondary, and/or
   # breadcrumbs and Functions menus. Expects javascript from
   # &iframe_wrapper_headjs() to be in head portion of the web page,
   # e.g., by inclusion in second arg passed to &start_page().
   #
   
   sub iframe_wrapper_resizejs {
       my $offset = 5;
       &get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);
       if (($env{'form.inhibitmenu'} eq 'yes') || ($env{'form.only_body'})) {
           $offset = 0;
       }
       return &Apache::lonhtmlcommon::scripttag(<<SCRIPT);
       \$(document).ready( function() {
           \$(window).unbind('resize').resize(function(){
               var header = null;
               var offset = $offset;
               var height = 0;
               var hdrtop = 0;
               if (\$('div.LC_menus_content:first').length) {
                   if (\$('div.LC_menus_content:first').hasClass ("shown")) {
                       header = \$('div.LC_menus_content:first');
                       offset = 12;
                   }
               } else if (\$('div.LC_head_subbox:first').length) {
                   header = \$('div.LC_head_subbox:first');
                   offset = 9;
               } else {
                   if (\$('#LC_breadcrumbs').length) {
                       header = \$('#LC_breadcrumbs');
                   }
               }
               if (header != null && header.length) {
                   height = header.height();
                   hdrtop = header.position().top;
               }
               var pos = height + hdrtop + offset;
               \$('.LC_iframecontainer').css('top', pos);
           });
           LCresizedef = 1;
           if (LCnotready == 1) {
               LCnotready = 0;
               \$(window).trigger('resize');
           }
       });
       window.onload = function(){
            if (LCresizedef) {
                LCnotready = 0;
                \$(window).trigger('resize');
            } else {
                LCnotready = 1;
            }
       };
   SCRIPT
   
   }
   
 =pod  =pod
   
 =head1 Excel and CSV file utility routines  =head1 Excel and CSV file utility routines
Line 2626  sub create_text_file { Line 2800  sub create_text_file {
 # ------------------------------------------  # ------------------------------------------
   
 sub domain_select {  sub domain_select {
     my ($name,$value,$multiple,$incdoms,$excdoms)=@_;      my ($name,$value,$multiple,$incdoms,$excdoms,$id)=@_;
     my @possdoms;      my @possdoms;
     if (ref($incdoms) eq 'ARRAY') {      if (ref($incdoms) eq 'ARRAY') {
         @possdoms = @{$incdoms};          @possdoms = @{$incdoms};
Line 2647  sub domain_select { Line 2821  sub domain_select {
     if ($multiple) {      if ($multiple) {
  $domains{''}=&mt('Any domain');   $domains{''}=&mt('Any domain');
  $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];   $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
  return &multiple_select_form($name,$value,4,\%domains);   return &multiple_select_form($name,$value,4,\%domains,undef,$id);
     } else {      } else {
  $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];   $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
  return &select_form($name,$value,\%domains);   return &select_form($name,$value,\%domains,'','',$id);
     }      }
 }  }
   
Line 2662  sub domain_select { Line 2836  sub domain_select {
   
 =over 4  =over 4
   
 =item * &multiple_select_form($name,$value,$size,$hash,$order)  =item * &multiple_select_form($name,$value,$size,$hash,$order,$id)
   
 Returns a string containing a <select> element int multiple mode  Returns a string containing a <select> element int multiple mode
   
Line 2674  Args: Line 2848  Args:
   $hash - the elements should be 'option' => 'shown text'    $hash - the elements should be 'option' => 'shown text'
           (shown text should already have been &mt())            (shown text should already have been &mt())
   $order - (optional) array ref of the order to show the elements in    $order - (optional) array ref of the order to show the elements in
     $id = (optional) id for <select> element
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
 sub multiple_select_form {  sub multiple_select_form {
     my ($name,$value,$size,$hash,$order)=@_;      my ($name,$value,$size,$hash,$order,$id)=@_;
     my %selected = map { $_ => 1 } ref($value)?@{$value}:($value);      my %selected = map { $_ => 1 } ref($value)?@{$value}:($value);
     my $output='';      my $output='';
     if (! defined($size)) {      if (! defined($size)) {
Line 2688  sub multiple_select_form { Line 2863  sub multiple_select_form {
             $size = scalar(keys(%$hash));              $size = scalar(keys(%$hash));
         }          }
     }      }
     $output.="\n".'<select name="'.$name.'" size="'.$size.'" multiple="multiple">';      if ($id ne '') {
           $id = ' id="'.$id.'"'; 
       }
       $output.="\n".'<select name="'.$name.'" size="'.$size.'" multiple="multiple"'.$id.'>';
     my @order;      my @order;
     if (ref($order) eq 'ARRAY')  {      if (ref($order) eq 'ARRAY')  {
         @order = @{$order};          @order = @{$order};
Line 2712  sub multiple_select_form { Line 2890  sub multiple_select_form {
   
 =pod  =pod
   
 =item * &select_form($defdom,$name,$hashref,$onchange,$readonly)  =item * &select_form($defdom,$name,$hashref,$onchange,$readonly,$id,$aria_labelledby)
   
 Returns a string containing a <select name='$name' size='1'> form to   Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select options from a ref to a hash containing:  allow a user to select options from a ref to a hash containing:
Line 2720  option_name => displayed text. An option Line 2898  option_name => displayed text. An option
 a javascript onchange item, e.g., onchange="this.form.submit();".  a javascript onchange item, e.g., onchange="this.form.submit();".
 An optional arg -- $readonly -- if true will cause the select form  An optional arg -- $readonly -- if true will cause the select form
 to be disabled, e.g., for the case where an instructor has a section-  to be disabled, e.g., for the case where an instructor has a section-
 specific role, and is viewing/modifying parameters.   specific role, and is viewing/modifying parameters. An optional arg
   -- $id -- will be used as the id attribute of the select element. An
   optional arg -- $aria_labelledby -- will be included as the aria-labelledby
   attribute of the select element.
   
 See lonrights.pm for an example invocation and use.  See lonrights.pm for an example invocation and use.
   
Line 2728  See lonrights.pm for an example invocati Line 2909  See lonrights.pm for an example invocati
   
 #-------------------------------------------  #-------------------------------------------
 sub select_form {  sub select_form {
     my ($def,$name,$hashref,$onchange,$readonly) = @_;      my ($def,$name,$hashref,$onchange,$readonly,$id,$aria_labelledby) = @_;
     return unless (ref($hashref) eq 'HASH');      return unless (ref($hashref) eq 'HASH');
     if ($onchange) {      if ($onchange) {
         $onchange = ' onchange="'.$onchange.'"';          $onchange = ' onchange="'.$onchange.'"';
Line 2737  sub select_form { Line 2918  sub select_form {
     if ($readonly) {      if ($readonly) {
         $disabled = ' disabled="disabled"';          $disabled = ' disabled="disabled"';
     }      }
     my $selectform = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n";      if ($id ne '') {
           $id = ' id="'.$id.'"';
       }
       if ($aria_labelledby ne '') {
           $aria_labelledby = ' aria-labelledby="'.$aria_labelledby.'"';
       }
       my $selectform = "<select name=\"$name\" size=\"1\"$onchange$disabled$id$aria_labelledby>\n";
     my @keys;      my @keys;
     if (exists($hashref->{'select_form_order'})) {      if (exists($hashref->{'select_form_order'})) {
  @keys=@{$hashref->{'select_form_order'}};   @keys=@{$hashref->{'select_form_order'}};
Line 2788  sub display_filter { Line 2975  sub display_filter {
     my $onchange = "javascript:toggleHistoryOptions(this,'containingphrase','$context',      my $onchange = "javascript:toggleHistoryOptions(this,'containingphrase','$context',
                                                     '$secondid','$thirdid')";                                                      '$secondid','$thirdid')";
     return '<span class="LC_nobreak"><label>'.&mt('Records: [_1]',      return '<span class="LC_nobreak"><label>'.&mt('Records: [_1]',
        &Apache::lonmeta::selectbox('show',$env{'form.show'},'',undef,         &Apache::lonmeta::selectbox('show',$env{'form.show'},'','',undef,
    (&mt('all'),10,20,50,100,1000,10000))).     (&mt('all'),10,20,50,100,1000,10000))).
    '</label></span> <span class="LC_nobreak">'.     '</label></span> <span class="LC_nobreak">'.
            &mt('Filter: [_1]',             &mt('Filter: [_1]',
Line 2890  sub gradeleveldescription { Line 3077  sub gradeleveldescription {
 }  }
   
 sub select_level_form {  sub select_level_form {
     my ($deflevel,$name)=@_;      my ($deflevel,$name,$id)=@_;
       if ($id ne '') {
           $id = ' id="'.$id.'"';
       }
     unless ($deflevel) { $deflevel=0; }      unless ($deflevel) { $deflevel=0; }
     my $selectform = "<select name=\"$name\" size=\"1\">\n";      my $selectform = "<select name=\"$name\" size=\"1\"$id>\n";
     for (my $i=0; $i<=18; $i++) {      for (my $i=0; $i<=18; $i++) {
         $selectform.="<option value=\"$i\" ".          $selectform.="<option value=\"$i\" ".
             ($i==$deflevel ? 'selected="selected" ' : '').              ($i==$deflevel ? 'selected="selected" ' : '').
Line 2906  sub select_level_form { Line 3096  sub select_level_form {
   
 =pod  =pod
   
 =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms,$disabled)  =item * &select_dom_form($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms,$disabled,$id)
   
 Returns a string containing a <select name='$name' size='1'> form to   Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select the domain to preform an operation in.    allow a user to select the domain to preform an operation in.  
Line 2925  The optional $excdoms is a reference to Line 3115  The optional $excdoms is a reference to
   
 The optional $disabled argument, if true, adds the disabled attribute to the select tag.  The optional $disabled argument, if true, adds the disabled attribute to the select tag.
   
   The option $id argument is the value (if any) to set as the (unique) id attribute for the select tag.
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
 sub select_dom_form {  sub select_dom_form {
     my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms,$disabled) = @_;      my ($defdom,$name,$includeempty,$showdomdesc,$onchange,$incdoms,$excdoms,$disabled,$id) = @_;
     if ($onchange) {      if ($onchange) {
         $onchange = ' onchange="'.$onchange.'"';          $onchange = ' onchange="'.$onchange.'"';
     }      }
     if ($disabled) {      if ($disabled) {
         $disabled = ' disabled="disabled"';          $disabled = ' disabled="disabled"';
     }      }
       if ($id ne '') {
           $id = ' id="'.$id.'"';
       }
     my (@domains,%exclude);      my (@domains,%exclude);
     if (ref($incdoms) eq 'ARRAY') {      if (ref($incdoms) eq 'ARRAY') {
         @domains = sort {lc($a) cmp lc($b)} (@{$incdoms});          @domains = sort {lc($a) cmp lc($b)} (@{$incdoms});
Line 2946  sub select_dom_form { Line 3141  sub select_dom_form {
     if (ref($excdoms) eq 'ARRAY') {      if (ref($excdoms) eq 'ARRAY') {
         map { $exclude{$_} = 1; } @{$excdoms};           map { $exclude{$_} = 1; } @{$excdoms}; 
     }      }
     my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange$disabled>\n";      my $selectdomain = "<select name=\"$name\" size=\"1\"$onchange$disabled$id>\n";
     foreach my $dom (@domains) {      foreach my $dom (@domains) {
         next if ($exclude{$dom});          next if ($exclude{$dom});
         $selectdomain.="<option value=\"$dom\" ".          $selectdomain.="<option value=\"$dom\" ".
Line 3790  sub passwd_validation_js { Line 3985  sub passwd_validation_js {
         } else {          } else {
             $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';              $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';
         }          }
       } elsif ($context eq 'ltitools') {
           my %domconfig = &Apache::lonnet::get_dom('configuration',['toolsec'],$domain);
           if (ref($domconfig{'toolsec'}) eq 'HASH') {
               if (ref($domconfig{'toolsec'}{'rules'}) eq 'HASH') {
                   %passwdconf = %{$domconfig{'toolsec'}{'rules'}};
               }
           }
           if ($id eq 'add') {
               $alertmsg = &mt('Secret for added external tool did not satisfy requirement(s):').'\n\n';
           } elsif ($id =~ /^\d+$/) {
               my $pos = $id+1;
               $alertmsg = &mt('Secret for external tool [_1] did not satisfy requirement(s):','#'.$pos).'\n\n';
           } else {
               $alertmsg = &mt('A secret did not satisfy requirement(s):').'\n\n';
           }
     } else {      } else {
         %passwdconf = &Apache::lonnet::get_passwdconf($domain);          %passwdconf = &Apache::lonnet::get_passwdconf($domain);
         $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';          $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';
Line 4667  sub filemimetype { Line 4877  sub filemimetype {
   
   
 sub filecategoryselect {  sub filecategoryselect {
     my ($name,$value)=@_;      my ($name,$value,$id)=@_;
     return &select_form($value,$name,      return &select_form($value,$name,
                         {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))});                          {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))},
                           '','',$id);
 }  }
   
 =pod  =pod
Line 5153  sub get_student_view { Line 5364  sub get_student_view {
   $userview=~s/\<\/html\>//gi;    $userview=~s/\<\/html\>//gi;
   $userview=~s/\<head\>//gi;    $userview=~s/\<head\>//gi;
   $userview=~s/\<\/head\>//gi;    $userview=~s/\<\/head\>//gi;
     $userview=~s/\Q<div class="LC_landmark" role="main"\E/<div class="LC_landmark"/; 
   $userview=~s/action\s*\=/would_be_action\=/gi;    $userview=~s/action\s*\=/would_be_action\=/gi;
   $userview=&relative_to_absolute($feedurl,$userview);    $userview=&relative_to_absolute($feedurl,$userview);
   if (wantarray) {    if (wantarray) {
Line 5516  sub blockcheck { Line 5728  sub blockcheck {
             }              }
             unless ($has_evb) {              unless ($has_evb) {
                 if (($activity eq 'printout') || ($activity eq 'grades') || ($activity eq 'search') ||                  if (($activity eq 'printout') || ($activity eq 'grades') || ($activity eq 'search') ||
                     ($activity eq 'boards') || ($activity eq 'groups') || ($activity eq 'chat')) {                      ($activity eq 'index') || ($activity eq 'boards') || ($activity eq 'groups') || 
                       ($activity eq 'chat')) {
                     if ($udom eq $cdom) {                      if ($udom eq $cdom) {
                         $check_ipaccess = 1;                          $check_ipaccess = 1;
                     }                      }
Line 5607  sub blockcheck { Line 5820  sub blockcheck {
   
     if (($activity eq 'boards' || $activity eq 'chat' ||      if (($activity eq 'boards' || $activity eq 'chat' ||
          $activity eq 'groups' || $activity eq 'printout' ||           $activity eq 'groups' || $activity eq 'printout' ||
          $activity eq 'search' || $activity eq 'reinit' ||           $activity eq 'search' || $activity eq 'index' ||
          $activity eq 'alert') &&           $activity eq 'reinit' || $activity eq 'alert') &&
         ($env{'request.course.id'})) {          ($env{'request.course.id'})) {
         foreach my $key (keys(%live_courses)) {          foreach my $key (keys(%live_courses)) {
             if ($key ne $env{'request.course.id'}) {              if ($key ne $env{'request.course.id'}) {
Line 5943  END_MYBLOCK Line 6156  END_MYBLOCK
         $text = &mt('Gradebook Blocked');          $text = &mt('Gradebook Blocked');
     } elsif ($activity eq 'search') {      } elsif ($activity eq 'search') {
         $text = &mt('Search Blocked');          $text = &mt('Search Blocked');
       } elsif ($activity eq 'index') {
           $text = &mt('Content Index Blocked');
     } elsif ($activity eq 'alert') {      } elsif ($activity eq 'alert') {
         $text = &mt('Checking Critical Messages Blocked');          $text = &mt('Checking Critical Messages Blocked');
     } elsif ($activity eq 'reinit') {      } elsif ($activity eq 'reinit') {
Line 6376  Input: (optional) filename from which br Line 6591  Input: (optional) filename from which br
        If page header is being requested for use in a frameset, then         If page header is being requested for use in a frameset, then
        the second (option) argument -- frameset will be true, and         the second (option) argument -- frameset will be true, and
        the target attribute set for links should be target="_parent".         the target attribute set for links should be target="_parent".
        If $title is supplied as the thitd arg, that will be used to          If $title is supplied as the third arg, that will be used to 
        the left of the breadcrumbs tail for the current path.         the left of the breadcrumbs tail for the current path.
   
 Returns: HTML div with CSTR path and recent box  Returns: HTML div with CSTR path and recent box
Line 6461  sub CSTR_pageheader { Line 6676  sub CSTR_pageheader {
     return $output;      return $output;
 }  }
   
   ##############################################
   =pod
   
   =item * &nocodemirror()
   
   Input: None
   
   Returns: 1 if CodeMirror is deactivated based on
            user's preference, or domain default,
            if user indicated use of default.
   
   =cut
   
 sub nocodemirror {  sub nocodemirror {
     my $nocodem = $env{'environment.nocodemirror'};      my $nocodem = $env{'environment.nocodemirror'};
     unless ($nocodem) {      unless ($nocodem) {
Line 6469  sub nocodemirror { Line 6697  sub nocodemirror {
             $nocodem = 'yes';              $nocodem = 'yes';
         }          }
     }      }
     return $nocodem;      if ($nocodem eq 'yes') {
           return 1;
       }
       return;
   }
   
   ##############################################
   =pod
   
   =item * &permitted_editors()
   
   Input: $uri (optional)
   
   Returns: %editors hash in which keys are editors
            permitted in current Authoring Space,
            or in current course for web pages
            created in a course.
   
            Value for each key is 1. Possible keys
            are: edit, xml, and daxe.
   
            For a regular Authoring Space, if no specific
            set of editors has been set for the Author
            who owns the Authoring Space, then the
            domain default will be used.  If no domain
            default has been set, then the keys will be
            edit and xml.
   
            For a course author, or for web pages created
            in a course, if no specific set of editors has
            been set for the course, then the domain
            course default will be used. If no domain
            course default has been set, then the keys
            will be edit and xml.
   
   =cut
   
   sub permitted_editors {
       my ($uri) = @_;
       my ($is_author,$is_coauthor,$is_course,$auname,$audom,%editors);
       if ($env{'request.role'} =~ m{^au\./}) {
           $is_author = 1;
       } elsif ($env{'request.role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)}) {
           ($audom,$auname) = ($1,$2);
           if (($audom ne '') && ($auname ne '')) {
               if (($env{'user.domain'} eq $audom) &&
                   ($env{'user.name'} eq $auname)) {
                   $is_author = 1;
               } else {
                   $is_coauthor = 1;
               }
           }
       } elsif ($env{'request.course.id'}) {
           my ($cdom,$cnum);
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           if (($env{'request.editurl'} =~ m{^/priv/\Q$cdom/$cnum\E/}) ||
               ($env{'request.editurl'} =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}) ||
               ($uri =~ m{^/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/})) {
               $is_course = 1;
           } elsif ($env{'request.editurl'} =~ m{^/priv/($match_domain)/($match_username)/}) {
               ($audom,$auname) = ($1,$2);
           } elsif ($env{'request.uri'} =~ m{^/priv/($match_domain)/($match_username)/}) {
               ($audom,$auname) = ($1,$2);
           } elsif (($uri eq '/daxesave') &&
                    (($env{'form.path'} =~ m{^/daxeopen/priv/\Q$cdom/$cnum\E/}) ||
                     ($env{'form.path'} =~ m{^/daxeopen/uploaded/\Q$cdom/$cnum\E/(docs|supplemental)/}))) {
               $is_course = 1;
           } elsif (($uri eq '/daxesave') &&
                    ($env{'form.path'} =~ m{^/daxeopen/priv/($match_domain)/($match_username)/})) {
               ($audom,$auname) = ($1,$2);
           }
           unless ($is_course) {
               if (($audom ne '') && ($auname ne '')) {
                   if (($env{'user.domain'} eq $audom) &&
                       ($env{'user.name'} eq $auname)) {
                       $is_author = 1;
                   } else {
                       $is_coauthor = 1;
                   }
               }
           }
       }
       if ($is_author) {
           if (exists($env{'environment.editors'})) {
               map { $editors{$_} = 1; } split(/,/,$env{'environment.editors'});
           } else {
               %editors = ( edit => 1,
                            xml => 1,
                          );
           }
       } elsif ($is_coauthor) {
           if (exists($env{"environment.internal.editors./$audom/$auname"})) {
               map { $editors{$_} = 1; } split(/,/,$env{"environment.internal.editors./$audom/$auname"});
           } else {
               %editors = ( edit => 1,
                            xml => 1,
                          );
           }
       } elsif ($is_course) {
           if (exists($env{'course.'.$env{'request.course.id'}.'.internal.crseditors'})) {
               map { $editors{$_} = 1; } split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.crseditors'});
           } else {
               my %domdefaults = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
               if (exists($domdefaults{'crseditors'})) {
                   map { $editors{$_} = 1; } split(/,/,$domdefaults{'crseditors'});
               } else {
                   %editors = ( edit => 1,
                                xml => 1,
                              );
               }
           }
       } else {
           %editors = ( edit => 1,
                        xml => 1,
                      );
       }
       return %editors;
 }  }
   
 ###############################################  ###############################################
Line 6572  sub bodytag { Line 6917  sub bodytag {
     my $hostname = $args->{'hostname'};      my $hostname = $args->{'hostname'};
   
     $function = &get_users_function() if (!$function);      $function = &get_users_function() if (!$function);
     my $img =    &designparm($function.'.img',$domain);  
     my $font =   &designparm($function.'.font',$domain);      my $font =   &designparm($function.'.font',$domain);
     my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);      my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);
   
Line 6626  sub bodytag { Line 6970  sub bodytag {
         $role = &Apache::lonnet::plaintext($role);          $role = &Apache::lonnet::plaintext($role);
     }      }
   
     if (!$realm) { $realm='&nbsp;'; }  
   
     my $extra_body_attr = &make_attr_string($forcereg,\%design);      my $extra_body_attr = &make_attr_string($forcereg,\%design);
   
 # construct main body tag  # construct main body tag
Line 6651  sub bodytag { Line 6993  sub bodytag {
                 undef($role);                  undef($role);
             }              }
             unless ($ltimenu->{'coursetitle'}) {              unless ($ltimenu->{'coursetitle'}) {
                 $realm='&nbsp;';  
                 $showcrstitle = 0;                  $showcrstitle = 0;
             }              }
         }          }
Line 6661  sub bodytag { Line 7002  sub bodytag {
                 undef($role);                  undef($role);
             }              }
             unless ($menuref->{'crs'}) {              unless ($menuref->{'crs'}) {
                 $realm='&nbsp;';  
                 $showcrstitle = 0;                  $showcrstitle = 0;
             }              }
         }          }
Line 6695  sub bodytag { Line 7035  sub bodytag {
         #        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls          #        $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
         #    }          #    }
   
         $bodytag .= Apache::lonhtmlcommon::scripttag(          my $need_endlcint;
             Apache::lonmenu::utilityfunctions($httphost), 'start');          unless ($args->{'switchserver'}) {
               $bodytag .= Apache::lonhtmlcommon::scripttag(
                   Apache::lonmenu::utilityfunctions($httphost), 'start');
               $need_endlcint = 1;
           }
   
           my $collapsible;
           if ($args->{'collapsible_header'} ne '') {
               $collapsible = 1;
               my ($menustate,$tiptext,$divclass);
               if ($args->{'start_collapsed'}) {
                   $menustate = 'collapsed';
                   $tiptext = 'display';
                   $divclass = 'hidden';
               } else {
                   $menustate = 'expanded';
                   $tiptext = 'hide';
                   $divclass = 'shown';
               }
               my $alttext = &mt('menu state: '.$menustate);
               my $tooltip = &mt($tiptext.' standard menus');
               $bodytag .= <<"END";
   <div id="LC_expandingContainer" style="display:inline;" role="navigation">
   <div id="LC_collapsible" class="LC_collapse_trigger" style="position: absolute;top: -5px;left: 0px; z-index:101; display:inline;">
   <a href="#" style="text-decoration:none;"><img class="LC_collapsible_indicator" alt="$alttext" title="$tooltip" src="/res/adm/pages/$menustate.png" style="border:0;margin:0;padding:0;max-width:100%;height:auto" /></a></div>
   <div class="LC_menus_content $divclass">
   END
           }
         unless ($args->{'no_primary_menu'}) {          unless ($args->{'no_primary_menu'}) {
             my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu,$menucoll,$menuref,              my ($left,$right) = Apache::lonmenu::primary_menu($crstype,$ltimenu,$menucoll,$menuref,
                                                               $args->{'links_disabled'},                                                                $args->{'links_disabled'},
                                                               $args->{'links_target'});                                                                $args->{'links_target'},
                                                                 $collapsible);
               my $labeltext = &HTML::Entities::encode(&mt('Primary links'));
             if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {              if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
                 if ($dc_info) {                  if ($dc_info) {
                     $dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|;                      $dc_info = qq|<span class="LC_cusr_subheading">$dc_info</span>|;
                 }                  }
                 $bodytag .= qq|<div id="LC_nav_bar">$left $role<br />                  $bodytag .= qq|<div id="LC_nav_bar" role="navigation" aria-label="$labeltext">$left $role</div>|;
                                <em>$realm</em> $dc_info</div>|;                  unless (($realm eq '') && ($dc_info eq '')) {
                       $bodytag .= qq|<div id="LC_realm" role="complementary"><em>$realm</em> $dc_info</div>|;
                   }
                   if ($need_endlcint) {
                       $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
                   }
                 return $bodytag;                  return $bodytag;
             }              }
   
               $bodytag .= '<div class="LC_landmark" style="margin: 3px 0 0 0;" role="navigation" aria-label="'.$labeltext.'">';
             unless ($env{'request.symb'} =~ m/\.page___\d+___/) {              unless ($env{'request.symb'} =~ m/\.page___\d+___/) {
                 $bodytag .= qq|<div id="LC_nav_bar">$left $role</div>|;                  $bodytag .= qq|<div id="LC_nav_bar">$left $role</div>|;
             }              }
   
             $bodytag .= $right;              $bodytag .= $right.'</div>';
   
             if ($dc_info) {              if ($dc_info) {
                 $dc_info = &dc_courseid_toggle($dc_info);                  $dc_info = &dc_courseid_toggle($dc_info);
             }              }
             $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;              unless (($realm eq '') && ($dc_info eq '')) {
                   $bodytag .= qq|<div id="LC_realm" role="complementary">$realm $dc_info</div>|;
               }
               $bodytag .= qq|<div style="clear: both; margin: 5px 0 0 0;"></div>|;
         }          }
   
         #if directed to not display the secondary menu, don't.            #if directed to not display the secondary menu, don't.  
         if ($args->{'no_secondary_menu'}) {          if ($args->{'no_secondary_menu'}) {
               if ($need_endlcint) {
                   $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
               }
             return $bodytag;              return $bodytag;
         }          }
         #don't show menus for public users          #don't show menus for public users
         if (!$public){          if (!$public){
             unless ($args->{'no_inline_menu'}) {              unless ($args->{'no_inline_menu'}) {
                 $bodytag .= Apache::lonmenu::secondary_menu($httphost,$ltiscope,$ltimenu,                  $bodytag .= '<div class="LC_landmark" role="navigation" aria-label="Secondary Links">'.
                               Apache::lonmenu::secondary_menu($httphost,$ltiscope,$ltimenu,
                                                             $args->{'no_primary_menu'},                                                              $args->{'no_primary_menu'},
                                                             $menucoll,$menuref,                                                              $menucoll,$menuref,
                                                             $args->{'links_disabled'},                                                              $args->{'links_disabled'},
                                                             $args->{'links_target'});                                                              $args->{'links_target'}).
                               '</div>';
             }              }
             $bodytag .= Apache::lonmenu::serverform();              $bodytag .= Apache::lonmenu::serverform();
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');              if ($need_endlcint) {
                   $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
               }
             if ($env{'request.state'} eq 'construct') {              if ($env{'request.state'} eq 'construct') {
                 $bodytag .= &Apache::lonmenu::innerregister($forcereg,                  $bodytag .= &Apache::lonmenu::innerregister($forcereg,
                                 $args->{'bread_crumbs'},'','',$hostname,                                  $args->{'bread_crumbs'},'','',$hostname,
Line 6748  sub bodytag { Line 7131  sub bodytag {
                                 $args->{'group'},$args->{'hide_buttons'},                                  $args->{'group'},$args->{'hide_buttons'},
                                 $hostname,$ltiscope,$ltiuri,$showncrumbsref);                                  $hostname,$ltiscope,$ltiuri,$showncrumbsref);
             } else {              } else {
                 $bodytag .=                   $bodytag .=
                     &Apache::lonmenu::prepare_functions($env{'request.noversionuri'},                      &Apache::lonmenu::prepare_functions($env{'request.noversionuri'},
                                                         $forcereg,$args->{'group'},                                                          $forcereg,$args->{'group'},
                                                         $args->{'bread_crumbs'},                                                          $args->{'bread_crumbs'},
                                                         $advtoolsref,'',$hostname);                                                          $advtoolsref,'',$hostname);
             }              }
         }else{          } else {
             # this is to seperate menu from content when there's no secondary              # this is to separate menu from content when there's no secondary
             # menu. Especially needed for public accessible ressources.              # menu. Especially needed for publicly accessible resources.
             $bodytag .= '<hr style="clear:both" />';              $bodytag .= '<hr style="clear:both" role="complementary" />';
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');               if ($need_endlcint) {
                   $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');
               }
           }
           if ($args->{'collapsible_header'} ne '') {
               $bodytag .= $args->{'collapsible_header'}.
                           '<div id="LC_collapsible_separator"></div>'.
                           '</div></div>';
         }          }
   
         return $bodytag;          return $bodytag;
 }  }
   
Line 6889  Inputs: (all optional) Line 7278  Inputs: (all optional)
 sub standard_css {  sub standard_css {
     my ($function,$domain,$bgcolor) = @_;      my ($function,$domain,$bgcolor) = @_;
     $function  = &get_users_function() if (!$function);      $function  = &get_users_function() if (!$function);
     my $img    = &designparm($function.'.img',   $domain);  
     my $tabbg  = &designparm($function.'.tabbg', $domain);      my $tabbg  = &designparm($function.'.tabbg', $domain);
     my $font   = &designparm($function.'.font',  $domain);      my $font   = &designparm($function.'.font',  $domain);
     my $fontmenu = &designparm($function.'.fontmenu', $domain);      my $fontmenu = &designparm($function.'.fontmenu', $domain);
Line 6942  body { Line 7330  body {
   line-height:130%;    line-height:130%;
   font-size:0.83em;    font-size:0.83em;
   color:$font;    color:$font;
     background-color: $pgbg_or_bgcolor;
 }  }
   
 a:focus,  a:focus,
Line 6953  form, .inline { Line 7342  form, .inline {
   display: inline;    display: inline;
 }  }
   
   .LC_landmark {
     margin: 0;
     padding: 0;
     border: none;
   }
   
   .LC_visually_hidden:not(:focus):not(:active) {
       clip-path: inset(50%);
       height: 1px;
       overflow: hidden;
       position: absolute;
       white-space: nowrap;
       width: 1px;
       display: inline;
   }
   
   .LC_heading_2 {
     font-size: 1.17em;
   }
   
   .LC_heading_3 {
     font-size: 1.0em;
   }
   
   h1.LC_search_results {
     font-size: 1.0em;
     font-weight: normal;
   }
   
   .LC_menus_content.shown{
     display: block;
   }
   
   .LC_menus_content.hidden {
     display: none;
   }
   
 .LC_right {  .LC_right {
   text-align:right;    text-align:right;
 }  }
   
   .LC_left {
     text-align:left;
   }
   
   .LC_center {
     text-align:center;
   }
   
 .LC_middle {  .LC_middle {
   vertical-align:middle;    vertical-align:middle;
 }  }
   
   .LC_bottom {
     vertical-align:bottom;
   }
   
 .LC_floatleft {  .LC_floatleft {
   float: left;    float: left;
 }  }
Line 6973  form, .inline { Line 7411  form, .inline {
   width:400px;    width:400px;
 }  }
   
   #LC_collapsible_separator {
       border: 1px solid black;
       width: 99.9%;
       height: 0px;
   }
   
 .LC_iframecontainer {  .LC_iframecontainer {
     width: 98%;      width: 98%;
     margin: 0;      margin: 0;
Line 7040  div.LC_confirm_box .LC_success img { Line 7484  div.LC_confirm_box .LC_success img {
   height: auto;    height: auto;
 }  }
   
   div.LC_minheight {
     min-height: 24px;
     border: 0;
     margin: 4px 0 0 0;
     padding: 0;
     vertical-align: middle;
   }
   
 .LC_textsize_mobile {  .LC_textsize_mobile {
   \@media only screen and (max-device-width: 480px) {    \@media only screen and (max-device-width: 480px) {
       -webkit-text-size-adjust:100%; -moz-text-size-adjust:100%; -ms-text-size-adjust:100%;        -webkit-text-size-adjust:100%; -moz-text-size-adjust:100%; -ms-text-size-adjust:100%;
Line 7094  div.LC_confirm_box .LC_success img { Line 7546  div.LC_confirm_box .LC_success img {
   padding: 4px;    padding: 4px;
 }  }
   
 table.LC_pastsubmission {  .LC_pastsubmission {
   border: 1px solid black;    border: 1px solid black;
   margin: 2px;    margin: 2px;
     padding: 2px;
 }  }
   
 table#LC_menubuttons {  table#LC_menubuttons {
Line 7232  li.LC_menubuttons_inline_text img { Line 7685  li.LC_menubuttons_inline_text img {
   text-decoration: none;    text-decoration: none;
 }  }
   
   .LC_menubuttons_link img {
     vertical-align: middle;
   }
   
 .LC_menubuttons_category {  .LC_menubuttons_category {
   color: $font;    color: $font;
   background: $pgbg;    background: $pgbg;
Line 7239  li.LC_menubuttons_inline_text img { Line 7696  li.LC_menubuttons_inline_text img {
   font-weight: bold;    font-weight: bold;
 }  }
   
 td.LC_menubuttons_text {  .LC_menu_text {
     clear: left;
     text-align: left;
   color: $font;    color: $font;
 }  }
   
Line 7331  table.LC_data_table tr td.LC_leftcol_hea Line 7790  table.LC_data_table tr td.LC_leftcol_hea
 }  }
   
 table.LC_data_table tr.LC_empty_row td,  table.LC_data_table tr.LC_empty_row td,
 table.LC_nested tr.LC_empty_row td {  table.LC_nested tr.LC_empty_row td,
   table.LC_nested tr.LC_empty_row th {
   font-weight: bold;    font-weight: bold;
   font-style: italic;    font-style: italic;
   text-align: center;    text-align: center;
   padding: 8px;    padding: 8px;
     border: 0;
 }  }
   
 table.LC_data_table tr.LC_empty_row td,  table.LC_data_table tr.LC_empty_row td,
Line 7343  table.LC_data_table tr.LC_footer_row td Line 7804  table.LC_data_table tr.LC_footer_row td
   background-color: $sidebg;    background-color: $sidebg;
 }  }
   
   table.LC_nested tr.LC_empty_row th,
 table.LC_nested tr.LC_empty_row td {  table.LC_nested tr.LC_empty_row td {
     padding: 4ex;
   background-color: #FFFFFF;    background-color: #FFFFFF;
 }  }
   
 table.LC_caption {  table.LC_caption {
 }  }
   
 table.LC_nested tr.LC_empty_row td {  caption.LC_caption_prefs {
   padding: 4ex    font-weight: normal;
     text-align: left;
     padding-bottom: 0.8em;
 }  }
   
 table.LC_nested_outer tr th {  table.LC_nested_outer tr th {
Line 7370  table.LC_nested_outer tr td.LC_subheader Line 7835  table.LC_nested_outer tr td.LC_subheader
   text-align: right;    text-align: right;
 }  }
   
 table.LC_nested tr.LC_info_row td {  table.LC_nested tr.LC_info_row td,
   table.LC_nested tr.LC_info_row th {
   background-color: #CCCCCC;    background-color: #CCCCCC;
   font-weight: bold;    font-weight: bold;
   font-size: small;    font-size: small;
   text-align: center;    text-align: center;
     border: 0;
 }  }
   
 table.LC_nested tr.LC_info_row td.LC_left_item,  table.LC_nested tr.LC_info_row td.LC_left_item,
   table.LC_nested tr.LC_info_row th.LC_left_item,
 table.LC_nested_outer tr th.LC_left_item {  table.LC_nested_outer tr th.LC_left_item {
   text-align: left;    text-align: left;
 }  }
Line 7520  table.LC_data_table tr > td.LC_roles_sel Line 7988  table.LC_data_table tr > td.LC_roles_sel
   border-right: 8px solid #11CC55;    border-right: 8px solid #11CC55;
 }  }
   
   table.LC_data_table tr.LC_prefs_row {
      line-height: 250%;
   }
   
   table.LC_manage_reservations tr th {
     font-weight: normal;
     font-style: italic;
     text-align: left;
     background: transparent;
     font-size: 100%;
   }
   
 span.LC_current_location {  span.LC_current_location {
   font-size:larger;    font-size:larger;
   background: $pgbg;    background: $pgbg;
Line 7593  table.LC_parm_overview_restrictions th { Line 8073  table.LC_parm_overview_restrictions th {
   border-color: $pgbg;    border-color: $pgbg;
 }  }
   
 table#LC_helpmenu {  h1.LC_helpmenu {
   border: none;    display: inline;
   height: 55px;    font-size: 100%;
   border-spacing: 0;    font-weight: normal;
     line-height: 1em;
     margin: 0;
     padding: 0;
     border: 0;
 }  }
   
 table#LC_helpmenu fieldset legend {  .LC_helpdesk_headbox {
   font-size: larger;    border: 2px groove threedface;
     padding: 1em;
 }  }
   
 table#LC_helpmenu_links {  h1.LC_helpdesk_legend {
   width: 100%;    float: left;
   border: 1px solid black;    margin: -1.7em 0 0;
     padding: 0 .5em;
   background: $pgbg;    background: $pgbg;
     font-size: 1em;
     font-weight: bold;
   }
   
   h1.LC_helpdesk_title {
     display: inline;
     font-size: 1em;
     line-height: 2.5em;
     margin: 0;
   padding: 0;    padding: 0;
   border-spacing: 1px;    vertical-align: bottom;
 }  }
   
 table#LC_helpmenu_links tr td {  .LC_helpdesk_links {
   padding: 1px;    border: 1px solid black;
     padding: 3px;
   background: $tabbg;    background: $tabbg;
   text-align: center;    text-align: center;
   font-weight: bold;    font-weight: bold;
     display: inline;
     margin-right: -6px;
   }
   
   .LC_helpdesk_img,
   .LC_helpdesk_text {
     padding: 0;
     margin: 0;
     border: 0;
     display: inline;
 }  }
   
 table#LC_helpmenu_links a:link,  .LC_helpdesk_img a:link,
 table#LC_helpmenu_links a:visited,  .LC_helpdesk_img a:visited,
 table#LC_helpmenu_links a:active {  .LC_helpdesk_img a:active,
   .LC_helpdesk_text a:link,
   .LC_helpdesk_text a:visited,
   .LC_helpdesk_text a:active {
   text-decoration: none;    text-decoration: none;
   color: $font;    color: $font;
 }  }
   
 table#LC_helpmenu_links a:hover {  div.LC_helpdesk_text a:hover {
   text-decoration: underline;    text-decoration: underline;
   color: $vlink;    color: $vlink;
 }  }
Line 7652  table.LC_pick_box { Line 8161  table.LC_pick_box {
   border-spacing: 1px;    border-spacing: 1px;
 }  }
   
 table.LC_pick_box td.LC_pick_box_title {  table.LC_pick_box th.LC_pick_box_title {
   background: $sidebg;    background: $sidebg;
   font-weight: bold;    font-weight: bold;
   text-align: left;    text-align: left;
Line 7693  table.LC_pick_box td.LC_oddrow_value { Line 8202  table.LC_pick_box td.LC_oddrow_value {
   background-color: $data_table_light;    background-color: $data_table_light;
 }  }
   
   td.LC_log_filter,
   th.LC_log_filter {
     vertical-align: top;
     text-align: left;
     padding: 0 4px;
   }
   
 span.LC_helpform_receipt_cat {  span.LC_helpform_receipt_cat {
   font-weight: bold;    font-weight: bold;
 }  }
Line 7855  table.LC_prior_tries td { Line 8371  table.LC_prior_tries td {
   padding: 6px;    padding: 6px;
 }  }
   
   span.LC_prob_status {
     margin: 5px 0 0 0;
     padding: 0 5px 0 0;
     vertical-align: middle;
   }
   
   div.LC_prob_status_outer {
     display: inline-block;
     margin: -5px 0 0 0;
     padding: 0;
   }
   
   div.LC_prob_status_inner {
     display: inline-block;
     margin: 0 5px 0 0;
     padding: 5px;
   }
   
   caption.LC_filesub_status {
     text-align: left;
     font-weight: bold;
   }
   
   .LC_mail_actions {
     float: left;
     padding: 0;
     margin: 6px;
   }
   
   .LC_vertical_line {
     width: 1px;
     background-color: black;
     height: 4em;
     float: left;
     margin: 0;
     padding: 0;
   }
   
 span.LC_prior_numerical,  span.LC_prior_numerical,
 span.LC_prior_string,  span.LC_prior_string,
 span.LC_prior_custom,  span.LC_prior_custom,
Line 8008  div.LC_grade_show_user div.LC_Box { Line 8562  div.LC_grade_show_user div.LC_Box {
   margin-right: 50px;    margin-right: 50px;
 }  }
   
   div.LC_grade_show_user div.LC_Box table tr th {
     font-weight: normal;
   }
   
 div.LC_grade_submissions,  div.LC_grade_submissions,
 div.LC_grade_message_center,  div.LC_grade_message_center,
 div.LC_grade_info_links {  div.LC_grade_info_links {
Line 8038  table.LC_scantron_action tr th { Line 8596  table.LC_scantron_action tr th {
   font-style:normal;    font-style:normal;
 }  }
   
   div.LC_edit_problem_daxe_header {
     padding: 3px;
     background: $tabbg;
     z-index: 100;
   }
   
 .LC_edit_problem_header,  .LC_edit_problem_header,
 div.LC_edit_problem_footer {  div.LC_edit_problem_footer {
   font-weight: normal;    font-weight: normal;
Line 8103  img.stift { Line 8667  img.stift {
   vertical-align: middle;    vertical-align: middle;
 }  }
   
 table td.LC_mainmenu_col_fieldset {  div.LC_mainmenu {
   vertical-align: top;    margin: 3px 2px 2px 1px;
     float: left;
 }  }
   
 div.LC_createcourse {  div.LC_createcourse {
Line 8152  h6 { Line 8717  h6 {
   border-bottom:solid 1px $lg_border_color;    border-bottom:solid 1px $lg_border_color;
 }  }
   
   .LC_MainMenu_Box > .LC_hcell,
 .LC_Box > .LC_hcell {  .LC_Box > .LC_hcell {
   margin: 0 -10px 10px -10px;    margin: 0 -10px 10px -10px;
 }  }
Line 8186  fieldset { Line 8752  fieldset {
 }  }
   
 fieldset#LC_selectuser {  fieldset#LC_selectuser {
     margin: 0;    margin: -1px 0 0 0;
     padding: 0;    padding: 0;
     border: 0;
   }
   
   fieldset.LC_delete_slot {
     display:inline;
     margin: 0 4px 4px;
     padding: 4px;
   }
   
   fieldset.LC_delete_slot > legend {
     font-weight: normal;
   }
   
   p.LC_medium_line {
     line-height: 0.85em;
 }  }
   
 article.geogebraweb div {  article.geogebraweb div {
Line 8589  ol#LC_PathBreadcrumbs li a { Line 9170  ol#LC_PathBreadcrumbs li a {
   padding: 0 0 10px 10px;    padding: 0 0 10px 10px;
 }  }
   
   .LC_MainMenu_Box {
     border: solid 1px $lg_border_color;
     padding: 0 10px 0 10px;
   }
   
 .LC_AboutMe_Image {  .LC_AboutMe_Image {
   float:left;    float:left;
   margin-right:10px;    margin-right:10px;
Line 8610  dl.LC_ListStyleClean dd { Line 9196  dl.LC_ListStyleClean dd {
 .LC_ListStyleClean,  .LC_ListStyleClean,
 .LC_ListStyleSimple,  .LC_ListStyleSimple,
 .LC_ListStyleNormal,  .LC_ListStyleNormal,
   .LC_ListStyleMainMenu,
 .LC_ListStyleSpecial {  .LC_ListStyleSpecial {
   /* display:block; */    /* display:block; */
   list-style-position: inside;    list-style-position: inside;
Line 8647  dl.LC_ListStyleClean dd { Line 9234  dl.LC_ListStyleClean dd {
   margin-bottom: 4px;    margin-bottom: 4px;
 }  }
   
   .LC_ListStyleMainMenu li {
     margin: 0;
     padding: 2px 5px 2px 10px;
     clear: both;
   }
   
 table.LC_SimpleTable {  table.LC_SimpleTable {
   margin:5px;    margin:5px;
   border:solid 1px $lg_border_color;    border:solid 1px $lg_border_color;
Line 8745  ul#LC_toolbar { Line 9338  ul#LC_toolbar {
   padding: 0;    padding: 0;
   margin: 2px;    margin: 2px;
   list-style:none;    list-style:none;
   position:relative;    display:inline;
   background-color:white;    background-color:white;
   overflow: auto;    overflow: auto;
 }  }
Line 8773  a.LC_toolbarItem { Line 9366  a.LC_toolbarItem {
   background-color:transparent;    background-color:transparent;
 }  }
   
   .LC_navtools {
     display: inline-block;
     padding: 0;
     margin: 2px;
     vertical-align: middle;
   }
   
 ul.LC_funclist {  ul.LC_funclist {
     margin: 0;      margin: 0;
     padding: 0.5em 1em 0.5em 0;      padding: 0.5em 1em 0.5em 0;
Line 8877  pre.LC_wordwrap { Line 9477  pre.LC_wordwrap {
 /*  /*
   styles used for response display    styles used for response display
 */  */
 div.LC_radiofoil, div.LC_rankfoil {  div.LC_radiofoil, div.LC_rankfoil, div.LC_optionfoil, div.LC_matchfoil, div.LC_login_links {
   margin: .5em 0em .5em 0em;    margin: .5em 0em .5em 0em;
 }  }
 table.LC_itemgroup {  table.LC_itemgroup {
   margin-top: 1em;    margin-top: 1em;
 }  }
   
   table.LC_itemgroup tr th {
     font-weight: normal;
   }
   
   fieldset.LC_webbubbles {
     margin: 2px 0 0 0;
     padding: 0;
     border: 0;
   }
   
   ul.LC_webbubbles {
     list-style: none;
     padding: 0;
     margin: 0;
     text-align: left;
     float: left;
   }
   
   ul.LC_webbubbles li {
     line-height: 1.8em;
     border: 1px solid black;
     padding: 0 2px 0 5px;
     margin: 0 0 0 -1px;
     float: left;
   }
   
 /*  /*
   styles used by TTH when "Default set of options to pass to tth/m    styles used by TTH when "Default set of options to pass to tth/m
   when converting TeX" in course settings has been set    when converting TeX" in course settings has been set
Line 9079  sub headtag { Line 9705  sub headtag {
         $inhibitprint = &print_suppression();          $inhibitprint = &print_suppression();
     }      }
   
     if (!$args->{'frameset'}) {      if (!$args->{'frameset'} && !$args->{'switchserver'}) {
  $result .= &Apache::lonhtmlcommon::htmlareaheaders();   $result .= &Apache::lonhtmlcommon::htmlareaheaders();
     }      }
     if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) {      if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) {
Line 9087  sub headtag { Line 9713  sub headtag {
     }      }
     if (!$args->{'no_nav_bar'}       if (!$args->{'no_nav_bar'} 
  && !$args->{'only_body'}   && !$args->{'only_body'}
  && !$args->{'frameset'}) {   && !$args->{'frameset'}
    && !$args->{'switchserver'}) {
  $result .= &help_menu_js($httphost);   $result .= &help_menu_js($httphost);
         $result.=&modal_window();          $result.=&modal_window();
         $result.=&togglebox_script();          $result.=&togglebox_script();
Line 9283  OFFLOAD Line 9910  OFFLOAD
  $title = 'The LearningOnline Network with CAPA';   $title = 'The LearningOnline Network with CAPA';
     }      }
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }      if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
     $result .= '<title> LON-CAPA '.$title.'</title>'      if ($title =~ /^LON-CAPA\s+/) {
  .'<link rel="stylesheet" type="text/css" href="'.$url.'"';          $result .= '<title> '.$title.'</title>';
       } else {
           $result .= '<title> LON-CAPA '.$title.'</title>';
       }
       $result .= "\n".'<link rel="stylesheet" type="text/css" href="'.$url.'"';
     if (!$args->{'frameset'}) {      if (!$args->{'frameset'}) {
         $result .= ' /';          $result .= ' /';
     }      }
Line 9299  OFFLOAD Line 9930  OFFLOAD
     }      }
     if ($clientmobile) {      if ($clientmobile) {
         $result .= '          $result .= '
 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta name="apple-mobile-web-app-capable" content="yes" />';  <meta name="apple-mobile-web-app-capable" content="yes" />';
     }      }
     $result .= '<meta name="google" content="notranslate" />'."\n";      $result .= '<meta name="google" content="notranslate"';
       if (!$args->{'frameset'}) {
           $result .= ' /';
       }
       $result .= '>'."\n";
     return $result.'</head>';      return $result.'</head>';
 }  }
   
Line 9433  sub xml_begin { Line 10068  sub xml_begin {
     .'xmlns="http://www.w3.org/1999/xhtml">';      .'xmlns="http://www.w3.org/1999/xhtml">';
     } elsif ($is_frameset) {      } elsif ($is_frameset) {
         $output='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'."\n".          $output='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'."\n".
                 '<html>'."\n";                  '<html lang="en">'."\n";
     } else {      } else {
  $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n".   $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'."\n".
                 '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'."\n";                  '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">'."\n";
Line 9483  $args - additional optional args support Line 10118  $args - additional optional args support
              no_auto_mt_title -> prevent &mt()ing the title arg               no_auto_mt_title -> prevent &mt()ing the title arg
              bread_crumbs ->             Array containing breadcrumbs               bread_crumbs ->             Array containing breadcrumbs
              bread_crumbs_component ->  if exists show it as headline else show only the breadcrumbs               bread_crumbs_component ->  if exists show it as headline else show only the breadcrumbs
                bread_crumbs_style -> breadcrumbs are contained within <div id="LC_breadcrumbs">,
                                      and &standard_css() contains CSS for #LC_breadcrumbs, if you want
                                      to override those values, or add to them, specify the value to
                                      include in the style attribute to include in the div tag by using
                                      bread_crumbs_style (e.g., overflow: visible)
              bread_crumbs_nomenu -> if true will pass false as the value of $menulink               bread_crumbs_nomenu -> if true will pass false as the value of $menulink
                                     to lonhtmlcommon::breadcrumbs                                      to lonhtmlcommon::breadcrumbs
              group          -> includes the current group, if page is for a                group          -> includes the current group, if page is for a 
Line 9651  sub start_page { Line 10291  sub start_page {
                 }                  }
  #if bread_crumbs_component exists show it as headline else show only the breadcrumbs   #if bread_crumbs_component exists show it as headline else show only the breadcrumbs
  if(exists($args->{'bread_crumbs_component'})){   if(exists($args->{'bread_crumbs_component'})){
  $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'},'',$menulink);   $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'},
                                                                          '',$menulink,'',
                                                                          $args->{'bread_crumbs_style'});
                 } else {                  } else {
  $result .= &Apache::lonhtmlcommon::breadcrumbs('','',$menulink);   $result .= &Apache::lonhtmlcommon::breadcrumbs('','',$menulink,'',
                                                                          $args->{'bread_crumbs_style'});
  }   }
         }          }
     }      }
Line 10338  sub simple_error_page { Line 10981  sub simple_error_page {
     }      }
   
     my $page =      my $page =
  &Apache::loncommon::start_page($title,'',\%displayargs).   &Apache::loncommon::start_page($title,'',\%displayargs)."\n".
           '<div class="LC_landmark" style="clear:both" role="main">'.
  '<p class="LC_error">'.$msg.'</p>'.   '<p class="LC_error">'.$msg.'</p>'.
           '</div>'.
  &Apache::loncommon::end_page();   &Apache::loncommon::end_page();
     if (ref($r)) {      if (ref($r)) {
  $r->print($page);   $r->print($page);
Line 10361  sub simple_error_page { Line 11006  sub simple_error_page {
         return;          return;
     }      }
   
       sub set_data_table_count {
           my ($count) = @_;
           unshift(@row_count,$count);
       }
   
     sub start_data_table {      sub start_data_table {
  my ($add_class,$id) = @_;   my ($add_class,$id) = @_;
  my $css_class = (join(' ','LC_data_table',$add_class));   my $css_class = (join(' ','LC_data_table',$add_class));
Line 10408  sub simple_error_page { Line 11058  sub simple_error_page {
     }      }
   
     sub start_data_table_header_row {      sub start_data_table_header_row {
  return  '<tr class="LC_header_row">'."\n";;   my ($add_class,$id) = @_;
    my $css_class = 'LC_header_row';
    $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
    $id = (' id="'.$id.'"') unless ($id eq '');
    return '<tr class="'.$css_class.'"'.$id.'>'."\n";
     }      }
   
     sub end_data_table_header_row {      sub end_data_table_header_row {
Line 10416  sub simple_error_page { Line 11070  sub simple_error_page {
     }      }
   
     sub data_table_caption {      sub data_table_caption {
         my $caption = shift;          my ($caption,$css_class) = @_;
         return "<caption class=\"LC_caption\">$caption</caption>";          return "<caption class=\"LC_caption $css_class\">$caption</caption>";
     }      }
 }  }
   
Line 15087  sub upfile_select_html { Line 15741  sub upfile_select_html {
                  tab   => &mt('Tabulator separated'),                   tab   => &mt('Tabulator separated'),
 #                 xml   => &mt('HTML/XML'),  #                 xml   => &mt('HTML/XML'),
                  );                   );
     my $Str = '<input type="file" name="upfile" size="50" />'.      my $Str = '<input type="file" name="upfile" id="upfile" size="50" />'.
         '<br />'.&mt('Type').': <select name="upfiletype">';          '<br /><label>'.&mt('Type').': <select name="upfiletype">';
     foreach my $type (sort(keys(%Types))) {      foreach my $type (sort(keys(%Types))) {
         $Str .= '<option value="'.$type.'" >'.$Types{$type}."</option>\n";          $Str .= '<option value="'.$type.'" >'.$Types{$type}."</option>\n";
     }      }
     $Str .= "</select>\n";      $Str .= "</select></label>\n";
     return $Str;      return $Str;
 }  }
   
Line 15176  sub csv_print_select_table { Line 15830  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().'<td>'.$display.'</td>');   $r->print(&start_data_table_row().'<td><label for="f'.$i.'">'.$display.'</label></td>');
   
  $r->print('<td><select name="f'.$i.'"'.   $r->print('<td><select name="f'.$i.'" id="f'.$i.'"'.
   ' onchange="javascript:flip(this.form,'.$i.');">');    ' onchange="javascript:flip(this.form,'.$i.');">');
  $r->print('<option value="none"></option>');   $r->print('<option value="none"></option>');
  foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) {   foreach my $sample (sort({$a <=> $b} keys(%{ $samples->[0] }))) {
Line 15223  sub csv_samples_select_table { Line 15877  sub csv_samples_select_table {
               &end_data_table_header_row());                &end_data_table_header_row());
   
     foreach my $key (sort(keys(%{ $samples->[0] }))) {      foreach my $key (sort(keys(%{ $samples->[0] }))) {
           my $num = $i+1;
           my $labeltext = &HTML::Entities::encode(&mt('Field for data in column [_1]',$num));
  $r->print(&start_data_table_row().'<td><select name="f'.$i.'"'.   $r->print(&start_data_table_row().'<td><select name="f'.$i.'"'.
   ' onchange="javascript:flip(this.form,'.$i.');">');    ' onchange="javascript:flip(this.form,'.$i.');" aria-label="'.$labeltext.'">');
  foreach my $option (@$d) {   foreach my $option (@$d) {
     my ($value,$display,$defaultcol)=@{ $option };      my ($value,$display,$defaultcol)=@{ $option };
     $r->print('<option value="'.$value.'"'.      $r->print('<option value="'.$value.'"'.
Line 17732  sub init_user_environment { Line 18388  sub init_user_environment {
                                                       \%userenv,\%domdef,\%is_adv);                                                        \%userenv,\%domdef,\%is_adv);
             }              }
   
               if ((ref($userroles) eq 'HASH') && ($userroles->{'user.author'}) &&
                   (exists($userroles->{"user.role.au./$domain/"}))) {
                   if ($userenv{'authoreditors'}) {
                       $userenv{'editors'} = $userenv{'authoreditors'};
                   } elsif ($domdef{'editors'} ne '') {
                       $userenv{'editors'} = $domdef{'editors'};
                   } else {
                       $userenv{'editors'} = 'edit,xml';
                   }
                   if ($userenv{'authorarchive'}) {
                       $userenv{'canarchive'} = 1;
                   } elsif (($userenv{'authorarchive'} eq '') &&
                            ($domdef{'archive'})) {
                       $userenv{'canarchive'} = 1;
                   }
               }
   
             $userenv{'canrequest.author'} =              $userenv{'canrequest.author'} =
                 &Apache::lonnet::usertools_access($username,$domain,'requestauthor',                  &Apache::lonnet::usertools_access($username,$domain,'requestauthor',
                                                   'reload','requestauthor',                                                    'reload','requestauthor',
Line 18518  Returns: HTML to display with informatio Line 19191  Returns: HTML to display with informatio
 sub check_release_result {  sub check_release_result {
     my ($switchwarning,$switchserver) = @_;      my ($switchwarning,$switchserver) = @_;
     my $output = &start_page('Selected course unavailable on this server').      my $output = &start_page('Selected course unavailable on this server').
                  '<p class="LC_warning">';                   '<div class="LC_landmark" role="main"><p class="LC_warning">';
     if ($switchwarning) {      if ($switchwarning) {
         $output .= $switchwarning.'<br /><a href="/adm/roles">';          $output .= $switchwarning.'<br /><a href="/adm/roles">';
         if (&show_course()) {          if (&show_course()) {
Line 18534  sub check_release_result { Line 19207  sub check_release_result {
                    &mt('Switch Server').                     &mt('Switch Server').
                    '</a>';                     '</a>';
     }      }
     $output .= '</p>'.&end_page();      $output .= '</p></div>'.&end_page();
     return $output;      return $output;
 }  }
   
Line 18618  sub needs_coursereinit { Line 19291  sub needs_coursereinit {
                     $update = 'supp';                      $update = 'supp';
                 }                  }
             }              }
             return ($update);  
         }          }
           return ($update);
     }      }
     return ();      return ();
 }  }
Line 19150  sub create_captcha { Line 19823  sub create_captcha {
         if (-e $Apache::lonnet::perlvar{'lonCaptchaDir'}.'/'.$md5sum.'.png') {          if (-e $Apache::lonnet::perlvar{'lonCaptchaDir'}.'/'.$md5sum.'.png') {
             $output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n".              $output = '<input type="hidden" name="crypt" value="'.$md5sum.'" />'."\n".
                       '<span class="LC_nobreak">'.                        '<span class="LC_nobreak">'.
                       &mt('Type in the letters/numbers shown below').'&nbsp;'.                        '<label>'.&mt('Type in the letters/numbers shown below').'&nbsp;'.
                       '<input type="text" size="5" name="code" value="" autocomplete="new-password" />'.                        '<input type="text" size="5" name="code" value="" autocomplete="new-password" aria-required="true" />'.
                       '</span><br />'.                        '</label></span><br />'.
                       '<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png" alt="captcha" />';                        '<img src="'.$captcha_params{'www_output_dir'}.'/'.$md5sum.'.png" alt="captcha" />';
             last;              last;
         }          }

Removed from v.1.1416  
changed lines
  Added in v.1.1477


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>