Diff for /loncom/interface/loncommon.pm between versions 1.925.2.22 and 1.972

version 1.925.2.22, 2010/12/05 17:40:24 version 1.972, 2010/08/07 19:23:50
Line 483  ENDAUTHORBRW Line 483  ENDAUTHORBRW
   
 sub coursebrowser_javascript {  sub coursebrowser_javascript {
     my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;      my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;
     my $wintitle = &mt('Course Browser');      my $wintitle = 'Course_Browser';
     if ($crstype ne '') {      if ($crstype eq 'Community') {
         $wintitle = &mt($crstype);          $wintitle = 'Community_Browser';
     }      }
     my $id_functions = &javascript_index_functions();      my $id_functions = &javascript_index_functions();
     my $output = '      my $output = '
Line 900  sub select_language { Line 900  sub select_language {
             $langchoices{$code} = &plainlanguagedescription($id);              $langchoices{$code} = &plainlanguagedescription($id);
         }          }
     }      }
     return &select_form($selected,$name,%langchoices);      return &select_form($selected,$name,\%langchoices);
 }  }
   
 =pod  =pod
Line 1127  sub help_open_topic { Line 1127  sub help_open_topic {
     $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'      $template.=' <a target="_top" href="'.$link.'" title="'.$title.'">'
               .'<img src="'.$helpicon.'" border="0"'                .'<img src="'.$helpicon.'" border="0"'
               .' alt="'.&mt('Help: [_1]',$topic).'"'                .' alt="'.&mt('Help: [_1]',$topic).'"'
               .' title="'.$title.'"'                 .' title="'.$title.'" style="vertical-align:middle;"' 
               .' /></a>';                .' /></a>';
     if ($text ne "") {      if ($text ne "") {
         $template.='</span>';          $template.='</span>';
Line 1202  ENDOUTPUT Line 1202  ENDOUTPUT
 sub help_open_menu {  sub help_open_menu {
     my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text)       my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) 
  = @_;       = @_;    
     $stayOnPage = 0 if (not defined $stayOnPage);      $stayOnPage = 1;
     # only use pop-up help (stayOnPage == 0)  
     # if environment.remote is on (using remote control UI)  
     if ($env{'environment.remote'} eq 'off' ) {  
         $stayOnPage=1;  
     }  
     my $output;      my $output;
     if ($component_help) {      if ($component_help) {
  if (!$text) {   if (!$text) {
Line 1228  sub help_open_menu { Line 1223  sub help_open_menu {
 sub top_nav_help {  sub top_nav_help {
     my ($text) = @_;      my ($text) = @_;
     $text = &mt($text);      $text = &mt($text);
     my $stay_on_page =       my $stay_on_page = 1;
  ($env{'environment.remote'} eq 'off' );  
     my $link = ($stay_on_page) ? "javascript:helpMenu('display')"      my $link = ($stay_on_page) ? "javascript:helpMenu('display')"
                      : "javascript:helpMenu('open')";                       : "javascript:helpMenu('open')";
     my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page);      my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page);
Line 1244  END Line 1239  END
   
 sub help_menu_js {  sub help_menu_js {
     my ($text) = @_;      my ($text) = @_;
       my $stayOnPage = 1;
     my $stayOnPage =   
  ($env{'environment.remote'} eq 'off' );  
   
     my $width = 620;      my $width = 620;
     my $height = 600;      my $height = 600;
     my $helptopic=&general_help();      my $helptopic=&general_help();
Line 1304  sub help_open_bug { Line 1296  sub help_open_bug {
     unless ($env{'user.adv'}) { return ''; }      unless ($env{'user.adv'}) { return ''; }
     unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; }      unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; }
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);  
     if ($env{'environment.remote'} eq 'off' ) {  
  $stayOnPage=1;   $stayOnPage=1;
     }  
     $width = 600 if (not defined $width);      $width = 600 if (not defined $width);
     $height = 600 if (not defined $height);      $height = 600 if (not defined $height);
   
Line 1348  sub help_open_faq { Line 1337  sub help_open_faq {
     unless ($env{'user.adv'}) { return ''; }      unless ($env{'user.adv'}) { return ''; }
     unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; }      unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; }
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);  
     if ($env{'environment.remote'} eq 'off' ) {  
  $stayOnPage=1;   $stayOnPage=1;
     }  
     $width = 350 if (not defined $width);      $width = 350 if (not defined $width);
     $height = 400 if (not defined $height);      $height = 400 if (not defined $height);
   
Line 1719  sub create_workbook { Line 1705  sub create_workbook {
     my $workbook  = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);      my $workbook  = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
     if (! defined($workbook)) {      if (! defined($workbook)) {
         $r->log_error("Error creating excel spreadsheet $filename: $!");          $r->log_error("Error creating excel spreadsheet $filename: $!");
         $r->print('<p>'.&mt("Unable to create new Excel file.  ".          $r->print(
                             "This error has been logged.  ".              '<p class="LC_error">'
                             "Please alert your LON-CAPA administrator").             .&mt('Problems occurred in creating the new Excel file.')
                   '</p>');             .' '.&mt('This error has been logged.')
              .' '.&mt('Please alert your LON-CAPA administrator.')
              .'</p>'
           );
         return (undef);          return (undef);
     }      }
     #      #
Line 1762  sub create_text_file { Line 1751  sub create_text_file {
     $fh = Apache::File->new('>/home/httpd'.$filename);      $fh = Apache::File->new('>/home/httpd'.$filename);
     if (! defined($fh)) {      if (! defined($fh)) {
         $r->log_error("Couldn't open $filename for output $!");          $r->log_error("Couldn't open $filename for output $!");
         $r->print(&mt('Problems occurred in creating the output file. '          $r->print(
                      .'This error has been logged. '              '<p class="LC_error">'
                      .'Please alert your LON-CAPA administrator.'));             .&mt('Problems occurred in creating the output file.')
              .' '.&mt('This error has been logged.')
              .' '.&mt('Please alert your LON-CAPA administrator.')
              .'</p>'
           );
     }      }
     return ($fh,$filename)      return ($fh,$filename)
 }  }
Line 1793  sub domain_select { Line 1786  sub domain_select {
  return &multiple_select_form($name,$value,4,\%domains);   return &multiple_select_form($name,$value,4,\%domains);
     } 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);
     }      }
 }  }
   
Line 1855  sub multiple_select_form { Line 1848  sub multiple_select_form {
   
 =pod  =pod
   
 =item * &select_form($defdom,$name,%hash)  =item * &select_form($defdom,$name,$hashref,$onchange)
   
 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 hash option_name => displayed text.    allow a user to select options from a ref to a hash containing:
   option_name => displayed text. An optional $onchange can include
   a javascript onchange item, e.g., onchange="this.form.submit();"  
   
 See lonrights.pm for an example invocation and use.  See lonrights.pm for an example invocation and use.
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
 sub select_form {  sub select_form {
     my ($def,$name,%hash) = @_;      my ($def,$name,$hashref,$onchange) = @_;
     my $selectform = "<select name=\"$name\" size=\"1\">\n";      return unless (ref($hashref) eq 'HASH');
       if ($onchange) {
           $onchange = ' onchange="'.$onchange.'"';
       }
       my $selectform = "<select name=\"$name\" size=\"1\"$onchange>\n";
     my @keys;      my @keys;
     if (exists($hash{'select_form_order'})) {      if (exists($hashref->{'select_form_order'})) {
  @keys=@{$hash{'select_form_order'}};   @keys=@{$hashref->{'select_form_order'}};
     } else {      } else {
  @keys=sort(keys(%hash));   @keys=sort(keys(%{$hashref}));
     }      }
     foreach my $key (@keys) {      foreach my $key (@keys) {
         $selectform.=          $selectform.=
     '<option value="'.&HTML::Entities::encode($key,'"<>&').'" '.      '<option value="'.&HTML::Entities::encode($key,'"<>&').'" '.
             ($key eq $def ? 'selected="selected" ' : '').              ($key eq $def ? 'selected="selected" ' : '').
                 ">".$hash{$key}."</option>\n";                  ">".$hashref->{$key}."</option>\n";
     }      }
     $selectform.="</select>";      $selectform.="</select>";
     return $selectform;      return $selectform;
Line 1895  sub display_filter { Line 1895  sub display_filter {
            &mt('Filter [_1]',             &mt('Filter [_1]',
    &select_form($env{'form.displayfilter'},     &select_form($env{'form.displayfilter'},
  'displayfilter',   'displayfilter',
  ('currentfolder' => 'Current folder/page',   {'currentfolder' => 'Current folder/page',
  'containing' => 'Containing phrase',   'containing' => 'Containing phrase',
  'none' => 'None'))).   'none' => 'None'})).
  '<input type="text" name="containingphrase" size="30" value="'.&HTML::Entities::encode($env{'form.containingphrase'}).'" /></span>';   '<input type="text" name="containingphrase" size="30" value="'.&HTML::Entities::encode($env{'form.containingphrase'}).'" /></span>';
 }  }
   
Line 1978  sub select_dom_form { Line 1978  sub select_dom_form {
             ($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom;              ($dom eq $defdom ? 'selected="selected" ' : '').'>'.$dom;
         if ($showdomdesc) {          if ($showdomdesc) {
             if ($dom ne '') {              if ($dom ne '') {
                 my $domdesc;                  my $domdesc = &Apache::lonnet::domain($dom,'description');
                 if ($name eq 'srchdomain') {  
                     if ($dom =~ /^\w+ci$/) {  
                         $domdesc = 'Faculty';  
                     } else {  
                         $domdesc = 'Students';  
                     }  
                 } else {  
                     $domdesc = &Apache::lonnet::domain($dom,'description');  
                 }  
                 if ($domdesc ne '') {                  if ($domdesc ne '') {
                     $selectdomain .= ' ('.$domdesc.')';                      $selectdomain .= ' ('.$domdesc.')';
                 }                  }
Line 2478  sub authform_internal{ Line 2469  sub authform_internal{
     }      }
     $autharg = '<input type="password" size="10" name="intarg" value="'.      $autharg = '<input type="password" size="10" name="intarg" value="'.
                $intarg.'" onchange="'.$jscall.'" />';                 $intarg.'" onchange="'.$jscall.'" />';
     my $authtext = '[_1] Internally authenticated (with initial password [_2])';      $result = &mt
     if ($in{'caller'} eq 'requestcrs') {          ('[_1] Internally authenticated (with initial password [_2])',
         $authtext = "[_1] Students' password, if none in the uploaded file: [_2]";           '<label>'.$authtype,'</label>'.$autharg);
     }  
     $result = &mt($authtext,'<label>'.$authtype,'</label>'.$autharg);  
     $result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';      $result.="<label><input type=\"checkbox\" name=\"visible\" onclick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
     return $result;      return $result;
 }  }
Line 3250  sub filemimetype { Line 3239  sub filemimetype {
 sub filecategoryselect {  sub filecategoryselect {
     my ($name,$value)=@_;      my ($name,$value)=@_;
     return &select_form($value,$name,      return &select_form($value,$name,
  '' => &mt('Any category'),                          {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))});
  map { $_,$_ } sort(keys(%category_extensions)));  
 }  }
   
 =pod  =pod
Line 3416  sub get_previous_attempt { Line 3404  sub get_previous_attempt {
       }        }
       $prevattempts=&start_data_table().&start_data_table_header_row();        $prevattempts=&start_data_table().&start_data_table_header_row();
       $prevattempts.='<th>'.&mt('History').'</th>';        $prevattempts.='<th>'.&mt('History').'</th>';
         my %typeparts;
         my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'});
       foreach my $key (sort(keys(%lasthash))) {        foreach my $key (sort(keys(%lasthash))) {
  my ($ign,@parts) = split(/\./,$key);   my ($ign,@parts) = split(/\./,$key);
  if ($#parts > 0) {   if ($#parts > 0) {
   my $data=$parts[-1];    my $data=$parts[-1];
   pop(@parts);    pop(@parts);
   $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.'&nbsp;</th>';            if ($data eq 'type') {
                 unless ($showsurv) {
                     my $id = join(',',@parts);
                     $typeparts{$ign.'.'.$id} = $lasthash{$key};
                 }
                 delete($lasthash{$key});
             } else {
         $prevattempts.='<th>'.&mt('Part ').join('.',@parts).'<br />'.$data.'&nbsp;</th>';
             }
  } else {   } else {
   if ($#parts == 0) {    if ($#parts == 0) {
     $prevattempts.='<th>'.$parts[0].'</th>';      $prevattempts.='<th>'.$parts[0].'</th>';
Line 3431  sub get_previous_attempt { Line 3429  sub get_previous_attempt {
  }   }
       }        }
       $prevattempts.=&end_data_table_header_row();        $prevattempts.=&end_data_table_header_row();
         my %lasthidden;
       if ($getattempt eq '') {        if ($getattempt eq '') {
  for ($version=1;$version<=$returnhash{'version'};$version++) {   for ($version=1;$version<=$returnhash{'version'};$version++) {
   $prevattempts.=&start_data_table_row().              my @hidden;
       '<td>'.&mt('Transaction [_1]',$version).'</td>';              if (%typeparts) {
     foreach my $key (sort(keys(%lasthash))) {                  foreach my $id (keys(%typeparts)) {
  my $value = &format_previous_attempt_value($key,                      if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) {
    $returnhash{$version.':'.$key});                          push(@hidden,$id);
  $prevattempts.='<td>'.$value.'&nbsp;</td>';                             $lasthidden{$id} = 1;
     }                      } elsif ($lasthidden{$id}) {
   $prevattempts.=&end_data_table_row();                          if (exists($returnhash{$version.':'.$id.'.award'})) {
                               delete($lasthidden{$id});
                           }
                       }
                   }
               }
               $prevattempts.=&start_data_table_row().
                              '<td>'.&mt('Transaction [_1]',$version).'</td>';
               if (@hidden) {
                   foreach my $key (sort(keys(%lasthash))) {
                       my $hide;
                       foreach my $id (@hidden) {
                           if ($key =~ /^\Q$id\E/) {
                               $hide = 1;
                               last;
                           }
                       }
                       if ($hide) {
                           my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/);
                           if (($data eq 'award') || ($data eq 'awarddetail')) {
                               my $value = &format_previous_attempt_value($key,
                                                $returnhash{$version.':'.$key});
                               $prevattempts.='<td>'.$value.'&nbsp;</td>';
                           } else {
                               $prevattempts.='<td>&nbsp;</td>';
                           }
                       } else {
                           if ($key =~ /\./) {
                               my $value = &format_previous_attempt_value($key,
                                                 $returnhash{$version.':'.$key});
                               $prevattempts.='<td>'.$value.'&nbsp;</td>';
                           } else {
                               $prevattempts.='<td>&nbsp;</td>';
                           }
                       }
                   }
               } else {
           foreach my $key (sort(keys(%lasthash))) {
       my $value = &format_previous_attempt_value($key,
               $returnhash{$version.':'.$key});
       $prevattempts.='<td>'.$value.'&nbsp;</td>';
           }
               }
       $prevattempts.=&end_data_table_row();
  }   }
       }        }
         my @currhidden = keys(%lasthidden);
       $prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>';        $prevattempts.=&start_data_table_row().'<td>'.&mt('Current').'</td>';
       foreach my $key (sort(keys(%lasthash))) {        foreach my $key (sort(keys(%lasthash))) {
  my $value = &format_previous_attempt_value($key,$lasthash{$key});            if (%typeparts) {
  if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}                my $hidden;
  $prevattempts.='<td>'.$value.'&nbsp;</td>';                foreach my $id (@currhidden) {
                     if ($key =~ /^\Q$id\E/) {
                         $hidden = 1;
                         last;
                     }
                 }
                 if ($hidden) {
                     my ($id,$data) = ($key =~ /^(.+)\.([^.]+)$/);
                     if (($data eq 'award') || ($data eq 'awarddetail')) {
                         my $value = &format_previous_attempt_value($key,$lasthash{$key});
                         if ($key =~/$regexp$/ && (defined &$gradesub)) {
                             $value = &$gradesub($value);
                         }
                         $prevattempts.='<td>'.$value.'&nbsp;</td>';
                     } else {
                         $prevattempts.='<td>&nbsp;</td>';
                     }
                 } else {
                     my $value = &format_previous_attempt_value($key,$lasthash{$key});
                     if ($key =~/$regexp$/ && (defined &$gradesub)) {
                         $value = &$gradesub($value);
                     }
                     $prevattempts.='<td>'.$value.'&nbsp;</td>';
                 }
             } else {
         my $value = &format_previous_attempt_value($key,$lasthash{$key});
         if ($key =~/$regexp$/ && (defined &$gradesub)) {
                     $value = &$gradesub($value);
                 }
         $prevattempts.='<td>'.$value.'&nbsp;</td>';
             }
       }        }
       $prevattempts.= &end_data_table_row().&end_data_table();        $prevattempts.= &end_data_table_row().&end_data_table();
     } else {      } else {
Line 3620  sub submlink { Line 3693  sub submlink {
     }      }
     if (!$symb) { $symb=&Apache::lonnet::symbread(); }      if (!$symb) { $symb=&Apache::lonnet::symbread(); }
     $symb=&escape($symb);      $symb=&escape($symb);
     if ($target) { $target="target=\"$target\""; }      if ($target) { $target=" target=\"$target\""; }
     return '<a href="/adm/grades?&command=submission&'.      return
  'symb='.$symb.'&student='.$uname.          '<a href="/adm/grades?command=submission'.
  '&userdom='.$udom.'" '.$target.'>'.$text.'</a>';          '&amp;symb='.$symb.
           '&amp;student='.$uname.
           '&amp;userdom='.$udom.'"'.
           $target.'>'.$text.'</a>';
 }  }
 ##############################################  ##############################################
   
Line 4150  sub get_domainconf { Line 4226  sub get_domainconf {
     if (defined($cached)) { return %{$result}; }      if (defined($cached)) { return %{$result}; }
   
     my %domconfig = &Apache::lonnet::get_dom('configuration',      my %domconfig = &Apache::lonnet::get_dom('configuration',
      ['login','rolecolors'],$udom);       ['login','rolecolors','autoenroll'],$udom);
     my (%designhash,%legacy);      my (%designhash,%legacy);
     if (keys(%domconfig) > 0) {      if (keys(%domconfig) > 0) {
         if (ref($domconfig{'login'}) eq 'HASH') {          if (ref($domconfig{'login'}) eq 'HASH') {
             if (keys(%{$domconfig{'login'}})) {              if (keys(%{$domconfig{'login'}})) {
                 foreach my $key (keys(%{$domconfig{'login'}})) {                  foreach my $key (keys(%{$domconfig{'login'}})) {
                     if (ref($domconfig{'login'}{$key}) eq 'HASH') {                      if (ref($domconfig{'login'}{$key}) eq 'HASH') {
                         foreach my $img (keys(%{$domconfig{'login'}{$key}})) {                          if ($key eq 'loginvia') {
                             $designhash{$udom.'.login.'.$key.'_'.$img} =                               if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') {
                                 $domconfig{'login'}{$key}{$img};                                  my @ids = &Apache::lonnet::current_machine_ids();
                                   foreach my $hostname (@ids) {
                                       if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') {
                                           if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) {
                                               my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'};
                                               $designhash{$udom.'.login.loginvia'} = $server;
                                               if ($domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'} eq 'custom') {
   
                                                   $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'};
                                               } else {
                                                    $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'};
                                               }
                                               if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) {
                                                   $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'};
                                               }
                                           }
                                       }
                                   }
                               }
                           } else {
                               foreach my $img (keys(%{$domconfig{'login'}{$key}})) {
                                   $designhash{$udom.'.login.'.$key.'_'.$img} = 
                                       $domconfig{'login'}{$key}{$img};
                               }
                         }                          }
                     } else {                      } else {
                         $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};                          $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};
Line 4186  sub get_domainconf { Line 4285  sub get_domainconf {
         } else {          } else {
             $legacy{'rolecolors'} = 1;              $legacy{'rolecolors'} = 1;
         }          }
           if (ref($domconfig{'autoenroll'}) eq 'HASH') {
               if ($domconfig{'autoenroll'}{'co-owners'}) {
                   $designhash{$udom.'.autoassign.co-owners'}=$domconfig{'autoenroll'}{'co-owners'};
               }
           }
         if (keys(%legacy) > 0) {          if (keys(%legacy) > 0) {
             my %legacyhash = &get_legacy_domconf($udom);              my %legacyhash = &get_legacy_domconf($udom);
             foreach my $item (keys(%legacyhash)) {              foreach my $item (keys(%legacyhash)) {
Line 4441  Inputs: Line 4545  Inputs:
   
 =item * $bgcolor, used to override the bgcolor on a webpage to a specific value  =item * $bgcolor, used to override the bgcolor on a webpage to a specific value
   
 =item * $no_inline_link, if true and in remote mode, don't show the   
          'Switch To Inline Menu' link  
   
 =item * $args, optional argument valid values are  =item * $args, optional argument valid values are
             no_auto_mt_title -> prevents &mt()ing the title arg              no_auto_mt_title -> prevents &mt()ing the title arg
             inherit_jsmath -> when creating popup window in a page,              inherit_jsmath -> when creating popup window in a page,
Line 4461  other decorations will be returned. Line 4562  other decorations will be returned.
   
 sub bodytag {  sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,      my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,
         $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_;          $no_nav_bar,$bgcolor,$args)=@_;
   
     my $public;      my $public;
     if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))      if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
Line 4483  sub bodytag { Line 4584  sub bodytag {
    'link'    => &designparm($function.'.link',$domain),);     'link'    => &designparm($function.'.link',$domain),);
     @design{keys(%$addentries)} = @$addentries{keys(%$addentries)};       @design{keys(%$addentries)} = @$addentries{keys(%$addentries)}; 
   
     my $custommenu;  
     if ($env{'environment.remote'} eq 'off') {  
         $custommenu = &needs_gci_custom();  
     }  
  # role and realm   # role and realm
     my ($role,$realm) = split(/\./,$env{'request.role'},2);      my ($role,$realm) = split(/\./,$env{'request.role'},2);
     if ($role  eq 'ca') {      if ($role  eq 'ca') {
Line 4496  sub bodytag { Line 4593  sub bodytag {
 # realm  # realm
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         if ($env{'request.role'} !~ /^cr/) {          if ($env{'request.role'} !~ /^cr/) {
             if (($custommenu) && (($role eq 'cm') || ($env{'form.context'} eq 'requestcrs'))) {              $role = &Apache::lonnet::plaintext($role,&course_type());
                 undef($role);  
             } else {  
                 $role = &Apache::lonnet::plaintext($role,&course_type());  
             }  
         }          }
         if (defined($role) && $env{'request.course.sec'}) {          if ($env{'request.course.sec'}) {
             $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$env{'request.course.sec'};              $role .= ('&nbsp;'x2).'-&nbsp;'.&mt('section:').'&nbsp;'.$env{'request.course.sec'};
         }          }   
         if ($env{'form.context'} eq 'requestcrs') {   $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
             undef($realm);  
         } else {  
     $realm = $env{'course.'.$env{'request.course.id'}.'.description'};  
         }  
     } else {      } else {
         if (($custommenu) && ($role eq 'cm')) {          $role = &Apache::lonnet::plaintext($role);
             undef($role);  
         } else {  
             $role = &Apache::lonnet::plaintext($role);  
         }  
     }      }
   
     if (!$realm) { $realm='&nbsp;'; }      if (!$realm) { $realm='&nbsp;'; }
 # Set messages  
     my $messages=&domainlogo($domain);  
   
     my $extra_body_attr = &make_attr_string($forcereg,\%design);      my $extra_body_attr = &make_attr_string($forcereg,\%design);
   
Line 4554  sub bodytag { Line 4637  sub bodytag {
     $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;      $role = '<span class="LC_nobreak">('.$role.')</span>' if $role;
     &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);      &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
   
     if ($env{'environment.remote'} ne 'on') {  
         # No Remote  
         if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') {           if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { 
             return $bodytag;               return $bodytag; 
         }           } 
Line 4566  sub bodytag { Line 4647  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
         #    }          #    }
   
         my $role_selector;  
         if (($custommenu) && !($env{'form.context'} eq 'requestcrs') &&   
             ($env{'request.course.id'}) &&   
             ($env{'course.'.$env{'request.course.id'}.'.domain'} =~ /^\w+citest$/)) {  
             $role_selector = &Apache::lonmenu::roles_selector(  
                         $env{'course.' . $env{'request.course.id'} . '.domain'},  
                         $env{'course.' . $env{'request.course.id'} . '.num'}  );  
             if ($role_selector) {  
                 $role_selector = '<br />'.$role_selector;  
             }  
         }  
         my $cid = $env{'request.course.id'};  
         my %cicourses;  
         my $udom = $env{'user.domain'};  
         my %allnums = &get_faculty_cnums();  
         if ($udom ne '' && ref($allnums{$udom} eq 'HASH') {  
              foreach my $key (%{$allnums{$udom}}) {  
                  $cicourses{$udom.'_'.$key} = $allnums{$udom}->{$key};  
              }  
         }  
         if (($custommenu && $cid && !$cicourses{$cid}) &&   
              !($env{'form.context'} eq 'requestcrs') ||  
              ($env{'user.domain'} =~ /^\w+citest$/)) {  
             my $role = 'st';  
             if ($custommenu) {  
                 $role = 'cc';  
             }  
             my ($switcher_js,$switcher,$formname);  
             $formname = 'pickrole';  
             my %courses = &existing_gcitest_courses($role);  
             my $numcourses = keys(%courses);  
             my $reqdcount = 0;  
             if ($cid) {  
                 if ($courses{$cid}) {  
                     $reqdcount = 1;   
                 }  
             }  
             if ($numcourses > $reqdcount) {  
                 $switcher = &gcitest_switcher($role,$formname,%courses);  
                 my $current;  
                 if ($cid) {  
                     $current = $role.'./'.$env{'course.'.$cid.'.domain'}.  
                                '/'.$env{'course.'.$cid.'.num'};  
                 }  
                 $switcher_js = &gcitest_switcher_js($current,$numcourses,$formname);  
                 if ($switcher_js) {    
                     $switcher_js= <<"ENDSCRIPT";  
 <script type="text/javascript">  
 // <![CDATA[  
   
 $switcher_js  
   
 // ]]>  
 </script>  
 ENDSCRIPT  
                 }  
             }  
             if ($switcher) {  
                 $switcher = $switcher_js.$switcher;  
                 if ($role_selector) {  
                     $role_selector .= '&nbsp;&nbsp;&nbsp;'.$switcher;  
                 } else {  
                     $role_selector .= '<br />'.$switcher;  
                 }  
             }  
         }  
   
         if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {          if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
              if ($dc_info) {               if ($dc_info) {
Line 4641  ENDSCRIPT Line 4657  ENDSCRIPT
                 <em>$realm</em> $dc_info</div>|;                  <em>$realm</em> $dc_info</div>|;
             return $bodytag;              return $bodytag;
         }          }
         if ($env{'request.noversionuri'} eq '/adm/navmaps' &&  
                 $env{'environment.remotenavmap'} eq 'on') {  
             return $bodytag;  
         }  
   
         if ($cid && $cicourses{$cid} eq 'tutorial') {          unless ($env{'request.symb'} =~ m/\.page___\d+___/) {
             $bodytag .= '<div class="LC_page_header">';              $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>|;
         }          }
    
         $bodytag .= qq|<div id="LC_nav_bar">$name $role $role_selector</div>|;  
   
         $bodytag .= Apache::lonhtmlcommon::scripttag(          $bodytag .= Apache::lonhtmlcommon::scripttag(
             Apache::lonmenu::utilityfunctions('',$custommenu), 'start');              Apache::lonmenu::utilityfunctions(), 'start');
   
         $bodytag .= Apache::lonmenu::primary_menu();          $bodytag .= Apache::lonmenu::primary_menu();
   
Line 4661  ENDSCRIPT Line 4671  ENDSCRIPT
             $dc_info = &dc_courseid_toggle($dc_info);              $dc_info = &dc_courseid_toggle($dc_info);
         }          }
         $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;          $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;
         if ($cid && $cicourses{$cid} eq 'tutorial') {  
             $bodytag .= '</div>';  
         }  
   
         #don't show menus for public users          #don't show menus for public users
         if(!$public){          if (!$public){
             if (($custommenu) &&               $bodytag .= Apache::lonmenu::secondary_menu();
                 ($env{'request.role'} !~ m{^st\./(\w+)citest/$match_courseid})) {  
                 $bodytag .= &Apache::lonmenu::gci_secondary_menu();  
             } elsif ($env{'request.role'} ne 'cm' || &check_for_gci_dc()) {      
                 $bodytag .= Apache::lonmenu::secondary_menu();  
             }  
             $bodytag .= Apache::lonmenu::serverform();              $bodytag .= Apache::lonmenu::serverform();
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');              $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'});                                  $args->{'bread_crumbs'});
             } elsif ($forcereg) {               } elsif ($forcereg) { 
                 $bodytag .= &Apache::lonmenu::innerregister($forcereg);                  $bodytag .= &Apache::lonmenu::innerregister($forcereg);
             } elsif ($custommenu && $env{'request.course.id'} &&   
                      &Apache::lonnet::allowed('mdc', $env{'request.course.id'})) {  
                 if ((($env{'request.noversionuri'} eq '/adm/navmaps') &&   
                     ($env{'request.noversionuri'} ne 'on')) ||  
                     (($env{'request.noversionuri'} eq '/adm/coursedocs') &&  
                      (!($env{'form.context'} eq 'requestcrs'))) ||  
                     (($env{'request.noversionuri'} eq '/adm/createuser') &&  
                      (!($env{'form.context'} eq 'requestcrs'))) ||  
                     ($env{'request.noversionuri'} eq '/adm/whatsnew') ||  
                     ($env{'request.noversionuri'} eq '/cgi-bin/printout.pl') ||  
                     ($env{'request.noversionuri'} eq '/adm/printout') ||  
                     ($env{'request.noversionuri'} eq '/adm/statistics')) {  
   
                     my @advtools = &concept_test_manager();  
                     &Apache::lonhtmlcommon::clear_breadcrumbs();  
                     &Apache::lonhtmlcommon::add_breadcrumb_tool(  
                                       'advtools',@advtools);  
                     my $advlinks;  
                     my $legendtext = '<a class="LC_menubuttons_link" href="/adm/menu">'.&mt('Management').'</a>';  
                     &Apache::lonhtmlcommon::render_advtools(\$advlinks,$legendtext);  
                     $bodytag .= $advlinks;  
                 }  
             }              }
         }else{          }else{
             # this is to seperate menu from content when there's no secondary              # this is to seperate menu from content when there's no secondary
Line 4711  ENDSCRIPT Line 4691  ENDSCRIPT
         }          }
   
         return $bodytag;          return $bodytag;
     }  
   
 #  
 # Top frame rendering, Remote is up  
 #  
   
     my $imgsrc = $img;  
     if ($img =~ /^\/adm/) {  
         $imgsrc = &lonhttpdurl($img);  
     }  
     my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />';  
   
     # Explicit link to get inline menu  
     my $menu= ($no_inline_link?''  
        :'<a href="/adm/remote?action=collapse" target="_top">'.&mt('Switch to Inline Menu Mode').'</a>');  
   
     if ($dc_info) {  
         $dc_info = qq|<span class="LC_cusr_subheading">($dc_info)</span>|;  
     }  
   
     $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>  
             <ol class="LC_primary_menu LC_right">  
                 <li>$menu</li>  
             </ol><div id="LC_realm"> $realm $dc_info</div>| unless $env{'form.inhibitmenu'};  
     return(<<ENDBODY);  
 $bodytag  
 <table id="LC_title_bar" class="LC_with_remote">  
 <tr><td>$upperleft</td>  
     <td>$messages&nbsp;</td>  
 </tr>  
 <tr><td>$titleinfo $dc_info $menu</td>  
 </tr>  
 </table>  
 ENDBODY  
 }  
   
 sub concept_test_manager {  
     my @advtools;  
     my  %items = (  
                    docs => {   
                               desc    => 'Edit Test',  
                               action  => "go('/adm/coursedocs')",  
                               tooltip => 'Assemble or modify Concept Test'  
                            },  
                    cprv => {  
                               desc => 'Enrollment/Activity',  
                               action => "go('/adm/createuser')",  
                               tooltip => 'Enrollment and student activity',  
                            },  
                    new => {   
                               desc   => "What's New?",  
                               action => "go('/adm/whatsnew')",  
                               tooltip => 'Recent events/action items in Concept Test' ,  
                            },  
                    prnt => {  
                               desc => 'Print Test',  
                               action => "go('/adm/printout');",  
                               tooltip => 'Prepare printable Concept Test',  
                            },  
                    chrt => {   
                               desc   => 'Test Statistics',  
                               action => "go('/adm/statistics');",  
                               tooltip => 'Concept Test Statistics',  
                            },  
                    rcrs => {  
                               desc   => 'Create New Test',  
                               action  => "switchpage('createtest');",  
                               tooltip => 'Create new Concept Test',  
                            },  
                  );  
     my @ordered = ('docs','cprv','new','prnt','chrt','rcrs');  
     foreach my $item (@ordered) {  
          push(@advtools,  
                   '<a title="'.$items{$item}{tooltip}.'" class="LC_menubuttons_link" href="javascript:'.  
                   $items{$item}{action}.';">'.  
                   '<img src="'.'/res/adm/pages/'.$item.'22.png" alt="'.$items{$item}{tooltip}.  
                   '" border="0" class="LC_icon" />'.  
                   '<span class="LC_menubuttons_inline_text">'.$items{$item}{desc}.'</span></a>');  
     }  
     return @advtools;  
 }  }
   
 sub dc_courseid_toggle {  sub dc_courseid_toggle {
Line 4822  sub make_attr_string { Line 4722  sub make_attr_string {
  delete($attr_ref->{$key});   delete($attr_ref->{$key});
     }      }
  }   }
  $attr_ref->{'onload'}  =   $attr_ref->{'onload'}  = $on_load;
     &Apache::lonmenu::loadevents().  $on_load;   $attr_ref->{'onunload'}= $on_unload;
  $attr_ref->{'onunload'}=  
     &Apache::lonmenu::unloadevents().$on_unload;  
     }  
   
 # Accessibility font enhance  
     if ($env{'browser.fontenhance'} eq 'on') {  
  my $style;  
  foreach my $key (keys(%{$attr_ref})) {  
     if (lc($key) eq 'style') {  
  $style.=$attr_ref->{$key}.';';  
  delete($attr_ref->{$key});  
     }  
  }  
  $attr_ref->{'style'}=$style.'; font-size: x-large;';  
     }      }
   
     my $attr_string;      my $attr_string;
Line 4911  sub standard_css { Line 4797  sub standard_css {
     my $vlink  = &designparm($function.'.vlink', $domain);      my $vlink  = &designparm($function.'.vlink', $domain);
     my $link   = &designparm($function.'.link',  $domain);      my $link   = &designparm($function.'.link',  $domain);
   
     my $loginbg = &designparm('login.sidebg',$domain);  
     my $bgcol = &designparm('login.bgcol',$domain);  
     my $textcol = &designparm('login.textcol',$domain);  
   
     my $sans                 = 'Verdana,Arial,Helvetica,sans-serif';      my $sans                 = 'Verdana,Arial,Helvetica,sans-serif';
     my $mono                 = 'monospace';      my $mono                 = 'monospace';
     my $data_table_head      = $sidebg;      my $data_table_head      = $sidebg;
Line 4933  sub standard_css { Line 4815  sub standard_css {
     my $table_header         = '#DDDDDD';      my $table_header         = '#DDDDDD';
     my $feedback_link_bg     = '#BBBBBB';      my $feedback_link_bg     = '#BBBBBB';
     my $lg_border_color      = '#C8C8C8';      my $lg_border_color      = '#C8C8C8';
       my $button_hover         = '#BF2317';
   
     my $border = ($env{'browser.type'} eq 'explorer' ||      my $border = ($env{'browser.type'} eq 'explorer' ||
       $env{'browser.type'} eq 'safari'     ) ? '0 2px 0 2px'        $env{'browser.type'} eq 'safari'     ) ? '0 2px 0 2px'
Line 4940  sub standard_css { Line 4823  sub standard_css {
   
   
     return <<END;      return <<END;
   
   /* needed for iframe to allow 100% height in FF */
   body, html { 
       margin: 0;
       padding: 0 0.5%;
       height: 99%; /* to avoid scrollbars */
   }
   
 body {  body {
   font-family: $sans;    font-family: $sans;
   line-height:130%;    line-height:130%;
Line 4947  body { Line 4838  body {
   color:$font;    color:$font;
 }  }
   
 a:focus {  a:focus,
   a:focus img {
   color: red;    color: red;
   background: yellow;    background: yellow;
 }  }
Line 4964  form, .inline { Line 4856  form, .inline {
   vertical-align:middle;    vertical-align:middle;
 }  }
   
 /* just for tests */  
 .LC_400Box {  .LC_400Box {
   width:400px;    width:400px;
 }  }
 /* end */  
   .LC_iframecontainer {
       width: 98%;
       margin: 0;
       position: fixed;
       top: 8.5em;
       bottom: 0;
   }
   
   .LC_iframecontainer iframe{
       border: none;
       width: 100%;
       height: 100%;
   }
   
 .LC_filename {  .LC_filename {
   font-family: $mono;    font-family: $mono;
Line 5082  table#LC_title_bar { Line 4986  table#LC_title_bar {
 }  }
   
 table#LC_title_bar,  table#LC_title_bar,
 table.LC_breadcrumbs,  table.LC_breadcrumbs, /* obsolete? */
 table#LC_title_bar.LC_with_remote {  table#LC_title_bar.LC_with_remote {
   width: 100%;    width: 100%;
   border-color: $pgbg;    border-color: $pgbg;
Line 5116  ul.LC_breadcrumb_tools_outerlist li { Line 5020  ul.LC_breadcrumb_tools_outerlist li {
     float: right;      float: right;
 }  }
   
 div.LC_GCI_Menu {  
     width:900px;  
 }  
   
 div.LC_GCI_Menu:after {  
     content:'';  
     display:block;  
     clear:both;  
 }  
   
 div.LC_GCI_Menu_left {  
     float:left;  
     width:400px;  
 }  
   
 div.LC_GCI_Menu_right {  
     float:left;  
     width:400px;;  
 }  
   
 dl.LC_GCI_Menu {  
     width:300px;  
     float:left;  
     margin-right:2em;  
 }  
   
 dl.LC_GCI_Menu dt {  
     font-weight: bold;  
     font-size:0.9em;  
     margin-bottom:0.7em;  
 }  
   
 dl.LC_GCI_Menu dt a {  
     color: $font;  
 }  
   
 dl.LC_GCI_Menu dd {  
     font-size:0.8em;  
     margin:0 0 2em 0;  
     padding-left:4.5em;  
     line-height:1.5em;  
     background:none no-repeat left top;  
 }  
   
 table#LC_title_bar td {  table#LC_title_bar td {
   background: $tabbg;    background: $tabbg;
 }  }
Line 5170  table#LC_menubuttons img { Line 5030  table#LC_menubuttons img {
   
 .LC_breadcrumbs_component {  .LC_breadcrumbs_component {
   float: right;    float: right;
   margin: 0.25em 1em;    margin: 0 1em;
 }  }
 .LC_breadcrumbs_component img {  .LC_breadcrumbs_component img {
   vertical-align: middle;    vertical-align: middle;
Line 5192  td.LC_table_cell_checkbox { Line 5052  td.LC_table_cell_checkbox {
   overflow: hidden;    overflow: hidden;
   margin: 0;    margin: 0;
   padding: 0;    padding: 0;
   text-align: left;  
 }  
   
 /* Preliminary fix to hide breadcrumbs inside remote control window */  
 #LC_remote #LC_breadcrumbs {  
   display:none;  
 }  }
   
 #LC_head_subbox {  #LC_head_subbox {
   clear:both;    clear:both;
   background: #F8F8F8; /* $sidebg; */    background: #F8F8F8; /* $sidebg; */
   border: 1px solid $sidebg;    border: 1px solid $sidebg;
   margin: 0 0 0 0;          margin: 0 0 10px 0;      
     padding: 3px;
 }  }
   
 .LC_fontsize_medium {  .LC_fontsize_medium {
Line 5221  td.LC_table_cell_checkbox { Line 5076  td.LC_table_cell_checkbox {
   padding-left:3px;    padding-left:3px;
 }  }
   
   .LC_menubuttons_inline_text img{
     vertical-align: middle;
   }
   
   li.LC_menubuttons_inline_text img,a {
     cursor:pointer;
   }
   
 .LC_menubuttons_link {  .LC_menubuttons_link {
   text-decoration: none;    text-decoration: none;
 }  }
Line 5240  td.LC_menubuttons_text { Line 5103  td.LC_menubuttons_text {
   background: $tabbg;    background: $tabbg;
 }  }
   
 table.LC_data_table,  table.LC_data_table {
 table.LC_mail_list {  
   border: 1px solid #000000;    border: 1px solid #000000;
   border-collapse: separate;    border-collapse: separate;
   border-spacing: 1px;    border-spacing: 1px;
Line 5267  table.LC_nested { Line 5129  table.LC_nested {
   width: 100%;    width: 100%;
 }  }
   
   .ui-accordion,
   .ui-accordion table.LC_data_table,
   .ui-accordion table.LC_nested_outer{
     border: 0px;
     border-spacing: 0px;
     margin: 3px;
   }
   
 table.LC_data_table tr th,  table.LC_data_table tr th,
 table.LC_calendar tr th,  table.LC_calendar tr th,
 table.LC_mail_list tr th,  
 table.LC_prior_tries tr th,  table.LC_prior_tries tr th,
 table.LC_innerpickbox tr th {  table.LC_innerpickbox tr th {
   font-weight: bold;    font-weight: bold;
Line 5322  table.LC_data_table tr td.LC_leftcol_hea Line 5191  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 {
   background-color: #FFFFFF;  
   font-weight: bold;    font-weight: bold;
   font-style: italic;    font-style: italic;
   text-align: center;    text-align: center;
   padding: 8px;    padding: 8px;
 }  }
   
   table.LC_data_table tr.LC_empty_row td {
     background-color: $sidebg;
   }
   
   table.LC_nested tr.LC_empty_row td {
     background-color: #FFFFFF;
   }
   
 table.LC_caption {  table.LC_caption {
 }  }
   
Line 5376  table.LC_nested tr td.LC_right_item { Line 5252  table.LC_nested tr td.LC_right_item {
   text-align: right;    text-align: right;
 }  }
   
   .ui-accordion table.LC_nested tr.LC_odd_row td.LC_left_item,
   .ui-accordion table.LC_nested tr.LC_even_row td.LC_left_item {
     text-align: right;
     width: 40%;
     padding-right:10px;
     vertical-align: top;
     padding: 5px;
   }
   
   .ui-accordion table.LC_nested tr.LC_odd_row td.LC_right_item,
   .ui-accordion table.LC_nested tr.LC_even_row td.LC_right_item {
     text-align: left;
     width: 60%;
     padding: 2px 4px;
   }
   
 table.LC_nested tr.LC_odd_row td {  table.LC_nested tr.LC_odd_row td {
   background-color: #EEEEEE;    background-color: #EEEEEE;
 }  }
Line 5417  table.LC_calendar tr td.LC_calendar_day_ Line 5309  table.LC_calendar tr td.LC_calendar_day_
   background-color: $data_table_highlight;    background-color: $data_table_highlight;
 }  }
   
 table.LC_mail_list tr.LC_mail_new {  table.LC_data_table tr td.LC_mail_new {
   background-color: $mail_new;    background-color: $mail_new;
 }  }
   
 table.LC_mail_list tr.LC_mail_new:hover {  table.LC_data_table tr.LC_mail_new:hover {
   background-color: $mail_new_hover;    background-color: $mail_new_hover;
 }  }
   
 table.LC_mail_list tr.LC_mail_read {  table.LC_data_table tr td.LC_mail_read {
   background-color: $mail_read;    background-color: $mail_read;
 }  }
   
 table.LC_mail_list tr.LC_mail_read:hover {  /*
   table.LC_data_table tr.LC_mail_read:hover {
   background-color: $mail_read_hover;    background-color: $mail_read_hover;
 }  }
   */
   
 table.LC_mail_list tr.LC_mail_replied {  table.LC_data_table tr td.LC_mail_replied {
   background-color: $mail_replied;    background-color: $mail_replied;
 }  }
   
 table.LC_mail_list tr.LC_mail_replied:hover {  /*
   table.LC_data_table tr.LC_mail_replied:hover {
   background-color: $mail_replied_hover;    background-color: $mail_replied_hover;
 }  }
   */
   
 table.LC_mail_list tr.LC_mail_other {  table.LC_data_table tr td.LC_mail_other {
   background-color: $mail_other;    background-color: $mail_other;
 }  }
   
 table.LC_mail_list tr.LC_mail_other:hover {  /*
   table.LC_data_table tr.LC_mail_other:hover {
   background-color: $mail_other_hover;    background-color: $mail_other_hover;
 }  }
   */
   
 table.LC_data_table tr > td.LC_browser_file,  table.LC_data_table tr > td.LC_browser_file,
 table.LC_data_table tr > td.LC_browser_file_published {  table.LC_data_table tr > td.LC_browser_file_published {
Line 5477  table.LC_data_table tr > td.LC_roles_is Line 5375  table.LC_data_table tr > td.LC_roles_is
 }  }
   
 table.LC_data_table tr > td.LC_roles_future {  table.LC_data_table tr > td.LC_roles_future {
   background: #FFFF77;    border-right: 8px solid #FFFF77;
 }  }
   
 table.LC_data_table tr > td.LC_roles_will {  table.LC_data_table tr > td.LC_roles_will {
   background: #FFAA77;    border-right: 8px solid #FFAA77;
 }  }
   
 table.LC_data_table tr > td.LC_roles_expired {  table.LC_data_table tr > td.LC_roles_expired {
   background: #FF7777;    border-right: 8px solid #FF7777;
 }  }
   
 table.LC_data_table tr > td.LC_roles_will_not {  table.LC_data_table tr > td.LC_roles_will_not {
   background: #AAFF77;    border-right: 8px solid #AAFF77;
 }  }
   
 table.LC_data_table tr > td.LC_roles_selected {  table.LC_data_table tr > td.LC_roles_selected {
   background: #11CC55;    border-right: 8px solid #11CC55;
 }  }
   
 span.LC_current_location {  span.LC_current_location {
Line 5688  table.LC_group_priv td { Line 5586  table.LC_group_priv td {
   padding: 0;    padding: 0;
 }  }
   
 table.LC_notify_front_page {  
   background: white;  
   border: 1px solid black;  
   padding: 8px;  
 }  
   
 table.LC_notify_front_page td {  
   padding: 8px;  
 }  
   
 .LC_navbuttons {  .LC_navbuttons {
   margin: 2ex 0ex 2ex 0ex;    margin: 2ex 0ex 2ex 0ex;
 }  }
Line 5717  table.LC_notify_front_page td { Line 5605  table.LC_notify_front_page td {
   font-size: 1.2em;    font-size: 1.2em;
 }  }
   
 .LC_topic_bar img {  
   vertical-align: bottom;  
 }  
   
 table.LC_course_group_status {  table.LC_course_group_status {
   margin: 20px;    margin: 20px;
 }  }
Line 5959  div.LC_clear_float_footer { Line 5843  div.LC_clear_float_footer {
 }  }
   
 div.LC_grade_show_user {  div.LC_grade_show_user {
   margin-top: 20px;  /*  border-left: 5px solid $sidebg; */
   border: 1px solid black;    border-top: 5px solid #000000;
     margin: 50px 0 0 0;
     padding: 15px 0 5px 10px;
 }  }
   
 div.LC_grade_user_name {  div.LC_grade_show_user_odd_row {
   background: #DDDDEE;  /*  border-left: 5px solid #000000; */
   border-bottom: 1px solid black;  
   font-weight: bold;  
   font-size: large;  
 }  }
   
 div.LC_grade_show_user_odd_row div.LC_grade_user_name {  div.LC_grade_show_user div.LC_Box {
   background: #DDEEDD;    margin-right: 50px;
 }  }
   
 div.LC_grade_show_problem,  
 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 {
 div.LC_grade_assign {  
   margin: 5px;    margin: 5px;
   width: 99%;    width: 99%;
   background: #FFFFFF;    background: #FFFFFF;
 }  }
   
 div.LC_grade_show_problem_header,  
 div.LC_grade_submissions_header,  div.LC_grade_submissions_header,
 div.LC_grade_message_center_header,  div.LC_grade_message_center_header {
 div.LC_grade_assign_header {  
   font-weight: bold;    font-weight: bold;
   font-size: large;    font-size: large;
 }  }
   
 div.LC_grade_show_problem_problem,  
 div.LC_grade_submissions_body,  div.LC_grade_submissions_body,
 div.LC_grade_message_center_body,  div.LC_grade_message_center_body {
 div.LC_grade_assign_body {  
   border: 1px solid black;    border: 1px solid black;
   width: 99%;    width: 99%;
   background: #FFFFFF;    background: #FFFFFF;
 }  }
   
 span.LC_grade_check_note {  
   font-weight: normal;  
   font-size: medium;  
   display: inline;  
   position: absolute;  
   right: 1em;  
 }  
   
 table.LC_scantron_action {  table.LC_scantron_action {
   width: 100%;    width: 100%;
 }  }
Line 6042  div.LC_edit_problem_header_title { Line 5911  div.LC_edit_problem_header_title {
 }  }
   
 table.LC_edit_problem_header_title {  table.LC_edit_problem_header_title {
   font-size: larger;  
   font-weight:  bold;  
   width: 100%;    width: 100%;
   border-color: $pgbg;  
   border-style: solid;  
   border-width: $border;  
   background: $tabbg;    background: $tabbg;
   border-collapse: collapse;  
   padding: 0;  
 }  }
   
 div.LC_edit_problem_discards {  div.LC_edit_problem_discards {
Line 6083  div.LC_createcourse { Line 5945  div.LC_createcourse {
   display:none;    display:none;
 }  }
   
 /* ---- Remove when done ----  
 # The following styles is part of the redesign of LON-CAPA and are  
 # subject to change during this project.  
 # Don't rely on their current functionality as they might be   
 # changed or removed.  
 # --------------------------*/  
   
 a:hover,  a:hover,
 ol.LC_primary_menu a:hover,  ol.LC_primary_menu a:hover,
 ol#LC_MenuBreadcrumbs a:hover,  ol#LC_MenuBreadcrumbs a:hover,
Line 6097  ol#LC_PathBreadcrumbs a:hover, Line 5952  ol#LC_PathBreadcrumbs a:hover,
 ul#LC_secondary_menu a:hover,  ul#LC_secondary_menu a:hover,
 .LC_FormSectionClearButton input:hover  .LC_FormSectionClearButton input:hover
 ul.LC_TabContent   li:hover a {  ul.LC_TabContent   li:hover a {
   color:#BF2317;    color:$button_hover;
   text-decoration:none;    text-decoration:none;
 }  }
   
Line 6162  fieldset > legend { Line 6017  fieldset > legend {
   padding: 0 5px 0 5px;    padding: 0 5px 0 5px;
 }  }
   
 div.LC_page_header {  
   background-color: $pgbg_or_bgcolor;  
   margin: 0 0 1.0em 0;  
 }  
   
 #LC_nav_bar {  #LC_nav_bar {
   float: left;    float: left;
   margin: 0.2em 0 0 0;    margin: 0 0 2px 0;
 }  }
   
 #LC_realm {  #LC_realm {
Line 6184  div.LC_page_header { Line 6034  div.LC_page_header {
   font-style: normal;    font-style: normal;
 }  }
   
   /* Preliminary fix to hide nav_bar inside bookmarks window */
   #LC_bookmarks #LC_nav_bar {
     display:none;
   }
   
 ol.LC_primary_menu {  ol.LC_primary_menu {
   float: right;    float: right;
   margin: 0.2em 0 0 0;    margin: 0;
 }  }
   
 ol#LC_PathBreadcrumbs {  ol#LC_PathBreadcrumbs {
Line 6201  ol.LC_primary_menu li { Line 6056  ol.LC_primary_menu li {
   
 ol.LC_primary_menu li img {  ol.LC_primary_menu li img {
   vertical-align: bottom;    vertical-align: bottom;
     height: 1.1em;
 }  }
   
 ol.LC_primary_menu a {  ol.LC_primary_menu a {
   font-size: 90%;  
   color: RGB(80, 80, 80);    color: RGB(80, 80, 80);
   text-decoration: none;    text-decoration: none;
 }  }
Line 6253  ul#LC_secondary_menu li a { Line 6108  ul#LC_secondary_menu li a {
 }  }
   
 ul.LC_TabContent {  ul.LC_TabContent {
   min-height:1.5em;    min-height:20px;
 }  }
   
 ul.LC_TabContent li {  ul.LC_TabContent li {
   vertical-align:middle;    vertical-align:middle;
   padding: 0 10px 0 10px;    padding: 0 16px 0 10px;
   background-color:$tabbg;    background-color:$tabbg;
   border-bottom:solid 1px $lg_border_color;    border-bottom:solid 1px $lg_border_color;
     border-right: solid 1px $font;
 }  }
   
 ul.LC_TabContent .right {  ul.LC_TabContent .right {
Line 6273  ul.LC_TabContent li { Line 6129  ul.LC_TabContent li {
   text-decoration:none;    text-decoration:none;
   font-size:95%;    font-size:95%;
   font-weight:bold;    font-weight:bold;
   padding-right: 16px;    min-height:20px;
   }
   
   ul.LC_TabContent li a:hover,
   ul.LC_TabContent li a:focus {
     color: $button_hover;
     background:none;
     outline:none;
   }
   
   ul.LC_TabContent li:hover {
     color: $button_hover;
     cursor:pointer;
 }  }
   
 ul.LC_TabContent li:hover,  
 ul.LC_TabContent li.active {  ul.LC_TabContent li.active {
     color: $font;
   background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;    background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center;
   border-bottom:solid 2px #FFFFFF;    border-bottom:solid 1px #FFFFFF;
   padding-right: 16px;    cursor: default;
 }  }
   
   ul.LC_TabContent li.active a {
     color:$font;
     background:#FFFFFF;
     outline: none;
   }
 #maincoursedoc {  #maincoursedoc {
   clear:both;    clear:both;
 }  }
Line 6301  ul.LC_TabContentBigger li { Line 6174  ul.LC_TabContentBigger li {
   color: #737373;    color: #737373;
 }  }
   
   ul.LC_TabContentBigger li.active {
     position: relative;
     top: 1px;
   }
   
 ul.LC_TabContentBigger li a {  ul.LC_TabContentBigger li a {
   background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;    background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat;
Line 6309  ul.LC_TabContentBigger li a { Line 6186  ul.LC_TabContentBigger li a {
   text-align: center;    text-align: center;
   display: block;    display: block;
   text-decoration: none;    text-decoration: none;
     outline: none;  
 }  }
   
 ul.LC_TabContentBigger li:hover a,  
 ul.LC_TabContentBigger li.active a {  ul.LC_TabContentBigger li.active a {
   background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;    background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat;
   color:$font;    color:$font;
   text-decoration: underline;  
 }  }
   
   
 ul.LC_TabContentBigger li b {  ul.LC_TabContentBigger li b {
   background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;    background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom;
   display: block;    display: block;
   float: left;    float: left;
   padding: 0 30px;    padding: 0 30px;
     border-bottom: 1px solid $lg_border_color;
   }
   
   ul.LC_TabContentBigger li:hover b {
     color:$button_hover;
 }  }
   
 ul.LC_TabContentBigger li:hover b,  
 ul.LC_TabContentBigger li.active b {  ul.LC_TabContentBigger li.active b {
   background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;    background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat;
   color:$font;    color:$font;
   border-bottom: 1px solid #FFFFFF;    border: 0;
     cursor:default;
 }  }
   
   
Line 6347  ol#LC_MenuBreadcrumbs, Line 6227  ol#LC_MenuBreadcrumbs,
 ol#LC_PathBreadcrumbs {  ol#LC_PathBreadcrumbs {
   padding-left: 10px;    padding-left: 10px;
   margin: 0;    margin: 0;
   margin: 0;  
   height: 2.5em;  /* equal to #LC_breadcrumbs line-height */    height: 2.5em;  /* equal to #LC_breadcrumbs line-height */
 }  }
   
Line 6355  ol#LC_MenuBreadcrumbs li, Line 6234  ol#LC_MenuBreadcrumbs li,
 ol#LC_PathBreadcrumbs li,  ol#LC_PathBreadcrumbs li,
 ul.LC_CourseBreadcrumbs li {  ul.LC_CourseBreadcrumbs li {
   display: inline;    display: inline;
   white-space: normal;    white-space: normal;  
 }  }
   
 ol#LC_MenuBreadcrumbs li a,  ol#LC_MenuBreadcrumbs li a,
Line 6468  div.LC_columnSection>* { Line 6347  div.LC_columnSection>* {
   overflow:hidden;    overflow:hidden;
 }  }
   
 .LC_loginpage_container {  
   text-align:left;  
   margin : 0 auto;  
   width:90%;  
   padding: 10px;  
   height: auto;  
   background-color:#FFFFFF;  
   border:1px solid #CCCCCC;  
 }  
   
   
 .LC_loginpage_loginContainer {  
   float:left;  
   width: 182px;  
   padding: 2px;  
   border:1px solid #CCCCCC;  
   background-color:$loginbg;  
 }  
   
 .LC_loginpage_loginContainer h2 {  
   margin-top: 0;  
   display:block;  
   background:$bgcol;  
   color:$textcol;  
   padding-left:5px;  
 }  
   
 .LC_loginpage_loginInfo {  
   float:left;  
   width:182px;  
   border:1px solid #CCCCCC;  
   padding:2px;  
 }  
   
 .LC_loginpage_space {  
   clear: both;  
   margin-bottom: 20px;  
   border-bottom: 1px solid #CCCCCC;  
 }  
   
 .LC_loginpage_floatLeft {  
   float: left;  
   width: 200px;  
   margin: 0;  
 }  
   
 table em {  table em {
   font-weight: bold;    font-weight: bold;
   font-style: normal;    font-style: normal;
Line 6549  a#LC_content_toolbar_firsthomework { Line 6382  a#LC_content_toolbar_firsthomework {
   background-image:url(/res/adm/pages/open-first-problem.gif);    background-image:url(/res/adm/pages/open-first-problem.gif);
 }  }
   
 a#LC_content_toolbar_launchnav {  
   background-image:url(/res/adm/pages/start-navigation.gif);  
 }  
   
 a#LC_content_toolbar_closenav {  
   background-image:url(/res/adm/pages/close-navigation.gif);  
 }  
   
 a#LC_content_toolbar_everything {  a#LC_content_toolbar_everything {
   background-image:url(/res/adm/pages/show-all.gif);    background-image:url(/res/adm/pages/show-all.gif);
 }  }
Line 6577  a#LC_content_toolbar_changefolder_toggle Line 6402  a#LC_content_toolbar_changefolder_toggle
   background-image:url(/res/adm/pages/open-all-folders.gif);    background-image:url(/res/adm/pages/open-all-folders.gif);
 }  }
   
 a#LC_content_toolbar_management {  
   background-image:url(/res/adm/pages/navtomenu.png);  
 }  
   
 ul#LC_toolbar li a:hover {  ul#LC_toolbar li a:hover {
   background-position: bottom center;    background-position: bottom center;
 }  }
Line 6621  ul.LC_funclist { Line 6442  ul.LC_funclist {
 }  }
   
 ul.LC_funclist > li:first-child {  ul.LC_funclist > li:first-child {
     font-weight:bold;      font-weight:bold; 
     margin-left:0.8em;      margin-left:0.8em;
 }  }
   
Line 6645  ul.LC_funclist li { Line 6466  ul.LC_funclist li {
   line-height: 150%;    line-height: 150%;
 }  }
   
 #gciheader {  .ui-accordion .LC_advanced_toggle {
   float:left;    float: right;
   width:100%;    font-size: 90%;
   background:#DAE0D2 url("/gcimenu_bg.gif") repeat-x bottom;    padding: 0px 4px
   font-size:93%;  
   line-height:normal;  
   margin: 0.5em 0 0.5em 0;  
 }  
 #gciheader ul {  
   margin:0;  
   padding:10px 10px 0;  
   list-style:none;  
 }  
 #gciheader li {  
   float:left;  
   background:url("/gcimenu_left.gif") no-repeat left top;  
   margin:0;  
   padding:0 0 0 9px;  
 }  
 #gciheader a {  
   display:block;  
   background:url("/gcimenu_right.gif") no-repeat right top;  
   padding:5px 15px 4px 6px;  
 }  
 #gciheader #current {  
   background-image:url("/gcimenu_left_on.gif");  
 }  
 #gciheader #current a {  
   background-image:url("/gcimenu_right_on.gif");  
   padding-bottom:5px;  
 }  }
   
 END  END
Line 6728  sub headtag { Line 6523  sub headtag {
     if (!$args->{'frameset'}) {      if (!$args->{'frameset'}) {
  $result .= &Apache::lonhtmlcommon::htmlareaheaders();   $result .= &Apache::lonhtmlcommon::htmlareaheaders();
     }      }
     if ($args->{'force_register'}) {      if ($args->{'force_register'} && $env{'request.noversionuri'} !~ m{^/res/adm/pages/}) {
  $result .= &Apache::lonmenu::registerurl(1);          $result .= Apache::lonxml::display_title();
     }      }
     if (!$args->{'no_nav_bar'}       if (!$args->{'no_nav_bar'} 
  && !$args->{'only_body'}   && !$args->{'only_body'}
Line 6755  ADDMETA Line 6550  ADDMETA
     $result .= '<title> LON-CAPA '.$title.'</title>'      $result .= '<title> LON-CAPA '.$title.'</title>'
  .'<link rel="stylesheet" type="text/css" href="'.$url.'" />'   .'<link rel="stylesheet" type="text/css" href="'.$url.'" />'
  .$head_extra;   .$head_extra;
     return $result;      return $result.'</head>';
 }  }
   
 =pod  =pod
Line 6790  Inputs: none Line 6585  Inputs: none
 sub xml_begin {  sub xml_begin {
     my $output='';      my $output='';
   
     if ($env{'internal.start_page'}==1) {  
  &Apache::lonhtmlcommon::init_htmlareafields();  
     }  
   
     if ($env{'browser.mathml'}) {      if ($env{'browser.mathml'}) {
  $output='<?xml version="1.0"?>'   $output='<?xml version="1.0"?>'
             #.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n"              #.'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'."\n"
Line 6812  sub xml_begin { Line 6603  sub xml_begin {
   
 =pod  =pod
   
 =item * &endheadtag()  
   
 Returns a uniform </head> for LON-CAPA web pages.  
   
 Inputs: none  
   
 =cut  
   
 sub endheadtag {  
     return '</head>';  
 }  
   
 =pod  
   
 =item * &head()  
   
 Returns a uniform complete <head>..</head> section for LON-CAPA web pages.  
   
 Inputs:  
   
 =over 4  
   
 $title - optional title for the page  
   
 $head_extra - optional extra HTML to put inside the <head>  
   
 =back  
   
 =cut  
   
 sub head {  
     my ($title,$head_extra,$args) = @_;  
     return &headtag($title,$head_extra,$args).&endheadtag();  
 }  
   
 =pod  
   
 =item * &start_page()  =item * &start_page()
   
 Returns a complete <html> .. <body> section for LON-CAPA web pages.  Returns a complete <html> .. <body> section for LON-CAPA web pages.
Line 6886  $args - additional optional args support Line 6640  $args - additional optional args support
              skip_phases    -> hash ref of                skip_phases    -> hash ref of 
                                     head -> skip the <html><head> generation                                      head -> skip the <html><head> generation
                                     body -> skip all <body> generation                                      body -> skip all <body> generation
              no_inline_link -> if true and in remote mode, don't show the   
                                     'Switch To Inline Menu' link  
              no_auto_mt_title -> prevent &mt()ing the title arg               no_auto_mt_title -> prevent &mt()ing the title arg
              inherit_jsmath -> when creating popup window in a page,               inherit_jsmath -> when creating popup window in a page,
                                     should it have jsmath forced on by the                                      should it have jsmath forced on by the
Line 6904  $args - additional optional args support Line 6656  $args - additional optional args support
 sub start_page {  sub start_page {
     my ($title,$head_extra,$args) = @_;      my ($title,$head_extra,$args) = @_;
     #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));      #&Apache::lonnet::logthis("start_page ".join(':',caller(0)));
   #SD
   #I don't see why we copy certain elements of %$args to %head_args
   #head args is passed to headtag() and this routine only reads those
   #keys that are needed. There doesn't happen any writes or any processing
   #of other keys.
   #proposal: just pass $args to headtag instead of \%head_args and delete 
   #marked lines
   #<- MARK
     my %head_args;      my %head_args;
     foreach my $arg ('redirect','force_register','domain','function',      foreach my $arg ('redirect','force_register','domain','function',
      'bgcolor','frameset','no_nav_bar','only_body',       'bgcolor','frameset','no_nav_bar','only_body',
Line 6912  sub start_page { Line 6672  sub start_page {
     $head_args{$arg} = $args->{$arg};      $head_args{$arg} = $args->{$arg};
  }   }
     }      }
   #MARK ->
   
     $env{'internal.start_page'}++;      $env{'internal.start_page'}++;
     my $result;      my $result;
   
     if (! exists($args->{'skip_phases'}{'head'}) ) {      if (! exists($args->{'skip_phases'}{'head'}) ) {
  $result.=          $result .= 
     &xml_begin().                    &xml_begin() . &headtag($title,$head_extra,\%head_args);
     &headtag($title,$head_extra,\%head_args).&endheadtag();  #replace prev line by
   #                 &xml_begin() . &headtag($title, $head_extra, $args);
     }      }
           
     if (! exists($args->{'skip_phases'}{'body'}) ) {      if (! exists($args->{'skip_phases'}{'body'}) ) {
Line 6932  sub start_page { Line 6695  sub start_page {
                          $args->{'function'},       $args->{'add_entries'},                           $args->{'function'},       $args->{'add_entries'},
                          $args->{'only_body'},      $args->{'domain'},                           $args->{'only_body'},      $args->{'domain'},
                          $args->{'force_register'}, $args->{'no_nav_bar'},                           $args->{'force_register'}, $args->{'no_nav_bar'},
                          $args->{'bgcolor'},        $args->{'no_inline_link'},                           $args->{'bgcolor'},        $args);
                          $args);  
         }          }
     }      }
   
Line 6949  sub start_page { Line 6711  sub start_page {
     #            $result .= &build_functionlist();      #            $result .= &build_functionlist();
     #}      #}
   
     # Don't add anything more if only_body wanted      # Don't add anything more if only_body wanted or in const space
     return $result if $args->{'only_body'};      return $result if    $args->{'only_body'} 
                         || $env{'request.state'} eq 'construct';
   
     #Breadcrumbs for Construction Space provided by &bodytag.   
     if (($env{'environment.remote'} eq 'off') && ($env{'request.state'} eq 'construct')) {  
         return $result;  
     }  
    
     #Breadcrumbs      #Breadcrumbs
     if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) {      if (exists($args->{'bread_crumbs'}) or exists($args->{'bread_crumbs_component'})) {
  &Apache::lonhtmlcommon::clear_breadcrumbs();   &Apache::lonhtmlcommon::clear_breadcrumbs();
Line 6970  sub start_page { Line 6728  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'});   $result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'});
  } elsif (exists($args->{'bread_crumbs_menulink'})) {   }else{
  $result .= &Apache::lonhtmlcommon::breadcrumbs('','',$args->{'bread_crumbs_menulink'});   $result .= &Apache::lonhtmlcommon::breadcrumbs();
                 } else {  
  $result .= &Apache::lonhtmlcommon::breadcrumbs();   
  }   }
     }      }
     return $result;      return $result;
 }  }
   
   
 =pod  
   
 =item * &head()  
   
 Returns a complete </body></html> section for LON-CAPA web pages.  
   
 Inputs:         $args - additional optional args supported are:  
                  js_ready     -> return a string ready for being used in   
                                  a javascript writeln  
                  html_encode  -> return a string ready for being used in   
                                  a html attribute  
                  frameset     -> if true will start with a <frameset>  
                                  rather than <body>  
                  dicsussion   -> if true will get discussion from  
                                   lonxml::xmlend  
                                  (you can pass the target and parser arguments  
                                   through optional 'target' and 'parser' args  
                                   to this routine)  
   
 =cut  
   
 sub end_page {  sub end_page {
     my ($args) = @_;      my ($args) = @_;
     $env{'internal.end_page'}++;      $env{'internal.end_page'}++;
Line 7090  sub simple_error_page { Line 6824  sub simple_error_page {
   
 {  {
     my @row_count;      my @row_count;
   
       sub start_data_table_count {
           unshift(@row_count, 0);
           return;
       }
   
       sub end_data_table_count {
           shift(@row_count);
           return;
       }
   
     sub start_data_table {      sub start_data_table {
  my ($add_class) = @_;   my ($add_class) = @_;
  my $css_class = (join(' ','LC_data_table',$add_class));   my $css_class = (join(' ','LC_data_table',$add_class));
  unshift(@row_count,0);   &start_data_table_count();
  return '<table class="'.$css_class.'">'."\n";   return '<table class="'.$css_class.'">'."\n";
     }      }
   
     sub end_data_table {      sub end_data_table {
  shift(@row_count);   &end_data_table_count();
  return '</table>'."\n";;   return '</table>'."\n";;
     }      }
   
Line 7904  sub user_picker { Line 7649  sub user_picker {
                     'whse'      => "When searching by last,first you must include at least one character in the first name.",                      'whse'      => "When searching by last,first you must include at least one character in the first name.",
                      'thfo'     => "The following need to be corrected before the search can be run:",                       'thfo'     => "The following need to be corrected before the search can be run:",
                                        );                                         );
     my $domform = &select_dom_form($currdom,'srchdomain',undef,1);      my $domform = &select_dom_form($currdom,'srchdomain',1,1);
     my $srchinsel = ' <select name="srchin">';      my $srchinsel = ' <select name="srchin">';
        
     my @srchins = ('crs','dom','alc','instd');      my @srchins = ('crs','dom','alc','instd');
   
     foreach my $option (@srchins) {      foreach my $option (@srchins) {
Line 7916  sub user_picker { Line 7661  sub user_picker {
         next if ($option eq 'alc');          next if ($option eq 'alc');
         next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs'));            next if (($option eq 'crs') && ($env{'form.form'} eq 'requestcrs'));  
         next if ($option eq 'crs' && !$env{'request.course.id'});          next if ($option eq 'crs' && !$env{'request.course.id'});
         next if ($option eq 'instd');  
         if ($curr_selected{'srchin'} eq $option) {          if ($curr_selected{'srchin'} eq $option) {
             $srchinsel .= '               $srchinsel .= ' 
        <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';     <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
         } else {          } else {
             $srchinsel .= '              $srchinsel .= '
     <option value="'.$option.'">'.$lt{$option}.'</option>';     <option value="'.$option.'">'.$lt{$option}.'</option>';
         }          }
     }      }
     $srchinsel .= "\n  </select>\n";      $srchinsel .= "\n  </select>\n";
Line 7966  sub user_picker { Line 7710  sub user_picker {
                     );                      );
                     $new_user_create = '<p class="LC_warning">'                      $new_user_create = '<p class="LC_warning">'
                                       .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")                                        .&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
                                       .'<br />'                                        .' '
                                       .&mt('Enter a valid e-mail address as the username for the new user.').' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.'                                        .&mt('Please contact the [_1]helpdesk[_2] for assistance.'
                                       ,'<a href="'.$helplink.'">','</a>')                                            ,'<a href="'.$helplink.'">','</a>')
                                       .'</p><br />';                                        .'</p><br />';
                 }                  }
             }              }
Line 8317  sub get_institutional_codes { Line 8061  sub get_institutional_codes {
     return;      return;
 }  }
   
   sub get_standard_codeitems {
       return ('Year','Semester','Department','Number','Section');
   }
   
 =pod  =pod
   
 =head1 Slot Helpers  =head1 Slot Helpers
Line 10293  sub check_clone { Line 10041  sub check_clone {
                                          'userroles',['active'],[$ccrole],                                           'userroles',['active'],[$ccrole],
  [$args->{'clonedomain'}]);   [$args->{'clonedomain'}]);
         if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {          if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
     $can_clone = 1;                      $can_clone = 1;
         } else {                  } elsif (&Apache::lonnet::is_course_owner($args->{'clonedomain'},$args->{'clonecourse'},$args->{'ccuname'},$args->{'ccdomain'})) {
                       $can_clone = 1;
                   } else {
                     if ($args->{'crstype'} eq 'Community') {                      if ($args->{'crstype'} eq 'Community') {
                         $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});                          $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
                     } else {                      } else {
Line 10354  sub construct_course { Line 10104  sub construct_course {
     # if anyone ever decides to not show this, and Utils::Course::new      # if anyone ever decides to not show this, and Utils::Course::new
     # will need to be suitably modified.      # will need to be suitably modified.
     $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed;      $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed;
       if ($$courseid =~ /^error:/) {
           return (0,$outcome);
       }
   
 #  #
 # Check if created correctly  # Check if created correctly
 #  #
     ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);      ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);
     my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);      my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);
       if ($crsuhome eq 'no_host') {
           $outcome .= &mt('Course creation failed, unrecognized course home server.').$linefeed;
           return (0,$outcome);
       }
     $outcome .= &mt('Created on').': '.$crsuhome.$linefeed;      $outcome .= &mt('Created on').': '.$crsuhome.$linefeed;
   
 #  #
Line 10377  sub construct_course { Line 10135  sub construct_course {
  $cenv{'url'}=$oldcenv{'url'};   $cenv{'url'}=$oldcenv{'url'};
 # Restore title  # Restore title
  $cenv{'description'}=$oldcenv{'description'};   $cenv{'description'}=$oldcenv{'description'};
   # Restore creation date, creator and creation context.
           $cenv{'internal.created'}=$oldcenv{'internal.created'};
           $cenv{'internal.creator'}=$oldcenv{'internal.creator'};
           $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'};
 # Mark as cloned  # Mark as cloned
  $cenv{'clonedfrom'}=$cloneid;   $cenv{'clonedfrom'}=$cloneid;
 # Need to clone grading mode  # Need to clone grading mode
Line 10623  sub construct_course { Line 10385  sub construct_course {
     $title=&mt('Syllabus');      $title=&mt('Syllabus');
             $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus';              $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus';
         } else {          } else {
             $title=&mt('Navigate Contents');              $title=&mt('Table of Contents');
             $url='/adm/navmaps';              $url='/adm/navmaps';
         }          }
   
Line 10634  sub construct_course { Line 10396  sub construct_course {
         $outcome .= ($fatal?$errtext:'write ok').$linefeed;          $outcome .= ($fatal?$errtext:'write ok').$linefeed;
     }      }
   
     if ($args->{'cloneroster'}) {  
         my ($numadded,$clisterror) = &Apache::lonclonecourse::copyroster($cloneid,$$courseid,$args->{'startaccess'},$args->{'endaccess'});  
         if ($clisterror) {  
             $outcome .= "\0".&mt('An error occurred when copying the student roster from the old course to the new course; the error was: [_1].',$clisterror).$linefeed;  
             if ($numadded) {  
                 $outcome .= &mt('Although [quant,_1,student] have received roles in the new course the roster does not report this. It is  ').$linefeed;  
             }   
         } else {  
             if ($numadded) {  
                 $outcome .= "\0".&mt('[quant,_1,student] copied from roster for old course to roster for new course.',$numadded).$linefeed;  
             } else {  
                 $outcome .= "\0".&mt('No students have been enrolled in the new Concept Test.').' '.&mt('This is because either (a) an error occurred, or (b) there were no students with either current access or access which ended on/after the current default end date set for access to the old course.').$linefeed;  
             }  
         }  
     }  
     return (1,$outcome);      return (1,$outcome);
 }  }
   
 ############################################################  ############################################################
 ############################################################  ############################################################
   
   #SD
   # only Community and Course, or anything else?
 sub course_type {  sub course_type {
     my ($cid) = @_;      my ($cid) = @_;
     if (!defined($cid)) {      if (!defined($cid)) {
Line 10820  sub init_user_environment { Line 10569  sub init_user_environment {
     my %userenv = &Apache::lonnet::dump('environment',$domain,$username);      my %userenv = &Apache::lonnet::dump('environment',$domain,$username);
     my ($tmp) = keys(%userenv);      my ($tmp) = keys(%userenv);
     if ($tmp !~ /^(con_lost|error|no_such_host)/i) {      if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
  # default remote control to off  
  if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; }  
     } else {      } else {
  undef(%userenv);   undef(%userenv);
     }      }
     if (($userenv{'interface'}) && (!$form->{'interface'})) {      if (($userenv{'interface'}) && (!$form->{'interface'})) {
  $form->{'interface'}=$userenv{'interface'};   $form->{'interface'}=$userenv{'interface'};
     }      }
     $env{'environment.remote'}=$userenv{'remote'};  
     if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; }      if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; }
   
 # --------------- Do not trust query string to be put directly into environment  # --------------- Do not trust query string to be put directly into environment
Line 10860  sub init_user_environment { Line 10606  sub init_user_environment {
     $initial_env{"browser.localres"}   = $form->{'localres'};      $initial_env{"browser.localres"}   = $form->{'localres'};
         }          }
   
  if ($public) {  
     $initial_env{"environment.remote"} = "off";  
  }  
  if ($form->{'interface'}) {   if ($form->{'interface'}) {
     $form->{'interface'}=~s/\W//gs;      $form->{'interface'}=~s/\W//gs;
     $initial_env{"browser.interface"} = $form->{'interface'};      $initial_env{"browser.interface"} = $form->{'interface'};
Line 10915  sub _add_to_env { Line 10658  sub _add_to_env {
     }      }
 }  }
   
 sub new_roles_update {  
     my $rolecount = 0;  
     foreach my $envkey (keys(%env)) {  
         next unless ($envkey =~ /^user\.role\./);  
         $rolecount ++;  
     }  
     my $newrolecount = 0;  
     if (!$rolecount) {  
         my %userenv;  
         foreach my $crstype ('official','unofficial','community') {  
             $userenv{'canrequest.'.$crstype} =  
                 &Apache::lonnet::usertools_access($env{'user.name'},  
                 $env{'user.domain'},$crstype,'reload','requestcourses');  
         }  
         my $then=$env{'user.login.time'};  
         my $refresh=time;  
         my (%userroles,%allroles,%allgroups,@newroles);  
         my %roleshash =  
             &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',['active','future','previous'],undef,undef,1);  
         foreach my $item (keys(%roleshash)) {  
             my ($uname,$udom,$role,$section) = split(':',$item);  
             my $where = '/'.$udom.'/'.$uname;  
             my ($tstart,$tend) = split(':',$roleshash{$item});  
             if ($section ne '') {  
                 $where .= '/'.$section;  
             }  
             my $spec = $role.'.'.$where;  
             &Apache::lonnet::set_arearole($role,$where,$tstart,$tend,  
                                           $env{'user.domain'},$env{'user.name'});  
             $userroles{'user.role.'.$spec} = $tstart.'.'.$tend;  
             $newrolecount ++;  
             unless (grep(/^\Q$role\E$/,@newroles)) {  
                 push(@newroles,$role);  
             }  
             my $status =  
                 &Apache::lonnet::curr_role_status($tstart,$tend,$refresh,$then);  
             if ($status eq 'active') {  
                 &Apache::lonnet::gather_roleprivs(\%allroles,\%allgroups,\%userroles,  
                                                   $where,$role,$tstart,$tend);  
             }  
         }  
         if (@newroles) {  
             my ($author,$adv) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles,  
                                                                \%allgroups);  
             &Apache::lonnet::appenv(\%userroles,[@newroles,'cm']);  
             $userenv{'user.adv'} = $adv;  
             $userenv{'user.author'} = $author;  
             $userenv{'user.refresh.time'} = $refresh;  
         }  
         &Apache::lonnet::appenv(\%userenv);  
     }  
     return $newrolecount;  
 }  
   
 # --- Get the symbolic name of a problem and the url  # --- Get the symbolic name of a problem and the url
 sub get_symb {  sub get_symb {
     my ($request,$silent) = @_;      my ($request,$silent) = @_;
Line 11010  sub clean_symb { Line 10699  sub clean_symb {
     return ($symb,$enc);      return ($symb,$enc);
 }  }
   
 sub needs_gci_custom {  
     my $custommenu;  
     my $numdc = &check_for_gci_dc();  
     my $udom = $env{'user.domain'};  
     return if ($udom eq '');  
     unless ($numdc) {  
         my $then=$env{'user.login.time'};  
         my $now = time;  
         my %allnums = &get_faculty_cnums();  
         my $cnums = $allnums{$udom};  
         return unless (ref($cnums) eq 'HASH');  
         if ($env{'user.role.st./\Q$udom\E/'.$cnums->{'review'}}) {  
             my ($start,$end) =  
                 split('.',$env{'user.role.st./\Q$udom\E/'.$cnums->{'review'}});  
             if (((!$start) || ($start && $start <= $now)) &&  
                 ((!$end) || ($end > $now))) {  
                 $custommenu = 1;  
                 if ($env{'user.role.cc./\Q$udom\E/'.$cnums->{'review'}}) {  
                     my ($ccstart,$ccend) =  
                         split('.',$env{'user.role.cc./\Q$udom\E/'.$cnums->{'review'}});  
                     if (((!$start) || ($start && $start <= $now)) &&  
                             ((!$end) || ($end > $now))) {  
                         $custommenu = '';  
                     }  
                 }  
             }  
         }  
     }  
     return $custommenu;  
 }  
   
 sub ci_tabs {  
     my ($domain) = @_;  
     my %tabs = (  
                  gci  => ['review','submit','managetest','tutorial'],  
                  slci => ['review'],  
     return $tabs{$domain};  
 }  
   
 sub check_for_gci_dc {  
     my $then=$env{'user.login.time'};  
     my $numdc = 0;  
     my @doms = &Apache::lonnet::current_machine_domains();  
     foreach my $dom (@doms) {  
         if ($env{'user.role.dc./'.$dom.'/'}) {  
             my $livedc = 1;  
             my ($tstart,$tend)=split(/\./,$env{'user.role.dc./'.$dom.'/'});  
             if ($tstart && $tstart>$then) { $livedc = 0; }  
             if ($tend   && $tend  <$then) { $livedc = 0; }  
             if ($livedc) {  
                 $numdc++;  
             }  
         }  
     }  
     return $numdc;  
 }  
   
 sub get_faculty_cnums {  
     my %cnums = (  
          gci => {   
                     review => '9615072b469884921gcil1',  
                     submit => '1H96711d710194bfegcil1',  
                     tutorial' => '5422913620b814c90gcil1',  
                 },  
          slci => {  
                     review => '',  
                  }  
     );  
     return %cnums;  
 }  
   
 sub existing_gcitest_courses {  
     my ($role) = @_;  
     my %courses;  
     my $cdom = $env{'user.domain'}.'test';  
     my $now = time;  
     foreach my $envkey (keys(%env)) {  
         my $cnum;  
         if ($envkey =~ m{^user\.role\.\Q$role\E\./\Q$cdom\E/($match_courseid)$}) {  
             $cnum = $1;  
         } else {  
             next;  
         }  
         my ($tstart,$tend) = split(/\./,$env{$envkey});  
         if (((!$tstart) || ($tstart < $now)) && ((!$tend) || ($tend > $now))) {  
             my $descr = $env{'course.'.$cdom.'_'.$cnum.'.description'};  
             if ($descr ne '') {  
                 $courses{$cdom.'_'.$cnum}{'description'} = $descr;  
             }  
         }  
     }  
     return %courses;  
 }  
   
 sub gcitest_switcher {  
     my ($role,$formname,%courses) = @_;  
     my $output;  
     my %Sortby;  
     foreach my $course (sort(keys(%courses))) {  
         next unless (ref($courses{$course}) eq 'HASH');  
         my $clean_title = $courses{$course}{'description'};  
         $clean_title =~ s/\W+//g;  
         if ($clean_title eq '') {  
             $clean_title = $courses{$course}{'description'};  
         }  
         push(@{$Sortby{$clean_title}},$course);  
     }  
     my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));  
     my $default;  
     if (@sorted_courses > 1) {  
         if (($env{'request.course.id'}) && ($courses{$env{'request.course.id'}})) {  
             $default = &mt('Switch concept test ...');  
         } else {  
             $default = &mt('Select a concept test ...');  
         }  
     } else {  
         unless (($env{'request.course.id'}) && ($courses{$env{'request.course.id'}})) {  
             $default = &mt('Select concept test ...');  
         }  
     }  
     if ($default) {  
         $output = '<form name="'.$formname.'" action="/adm/roles" method="post">'.  
                   '<select name="newrole" onchange="javascript:courseswitcher();">'.  
                   '<option value="" selected="selected">'.$default.'</option>';  
         foreach my $item (@sorted_courses) {  
             foreach my $course (@{$Sortby{$item}}) {  
                 my ($cdom,$cnum) = split('_',$course);  
                 $output .= '<option value="'.$role.'./'.$cdom.'/'.$cnum.'">'.$courses{$course}{'description'}.'</option>';  
             }  
         }  
         $output .= '</select><input type="hidden" name="selectrole" value="" /></form>';  
     }  
     return $output;  
 }  
   
 sub gcitest_switcher_js {  
     my ($current,$numcourses,$formname) = @_;  
     my $output = <<"ENDJS";  
   
 function courseswitcher(caller) {  
     var numcourses = $numcourses;  
     var current = '$current';  
     var choice = document.$formname.newrole.options[document.$formname.newrole.selectedIndex].value;  
     if (choice == '') {  
         if (caller == 'icon') {  
             alert('No Concept Test selected');  
         }  
         document.$formname.selectrole.value = '';  
         return;  
     }  
     if (choice == current) {  
         if ((caller != 'icon') && (numcourses > 1)) {  
             alert('You have selected the current course.\\nPlease select a different Concept Test course');  
         }  
         document.$formname.newrole.selectedIndex = 0;  
         document.$formname.selectrole.value = '';  
         return;  
     }  
     document.$formname.selectrole.value = '1';  
     document.$formname.submit();  
     return;  
 }  
   
 ENDJS  
     return $output;  
 }  
   
 sub get_citest_map {  
     my ($cdom) = @_;  
     my %questionnaires = (  
                            gcitest  => 'default_1261144274.sequence',  
                            slcitest => 'default_1261144274.sequence',  
                          );  
     return $questionnaires{$cdom};  
 }  
   
 =pod  =pod
   
 =back  =back

Removed from v.1.925.2.22  
changed lines
  Added in v.1.972


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