Diff for /loncom/interface/loncommon.pm between versions 1.926 and 1.983

version 1.926, 2009/12/08 14:44:17 version 1.983, 2010/10/23 19:29: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 1072  END Line 1072  END
   
 =pod  =pod
   
 =item * &help_open_topic($topic,$text,$stayOnPage,$width,$height)  =item * &help_open_topic($topic,$text,$stayOnPage,$width,$height,$imgid)
   
 Returns a string corresponding to an HTML link to the given help  Returns a string corresponding to an HTML link to the given help
 $topic, where $topic corresponds to the name of a .tex file in  $topic, where $topic corresponds to the name of a .tex file in
Line 1090  a new window using Javascript. (Default Line 1090  a new window using Javascript. (Default
   
 $width and $height are optional numerical parameters that will  $width and $height are optional numerical parameters that will
 override the width and height of the popped up window, which may  override the width and height of the popped up window, which may
 be useful for certain help topics with big pictures included.   be useful for certain help topics with big pictures included.
   
   $imgid is the id of the img tag used for the help icon. This may be
   used in a javascript call to switch the image src.  See 
   lonhtmlcommon::htmlareaselectactive() for an example.
   
 =cut  =cut
   
 sub help_open_topic {  sub help_open_topic {
     my ($topic, $text, $stayOnPage, $width, $height) = @_;      my ($topic, $text, $stayOnPage, $width, $height, $imgid) = @_;
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);      $stayOnPage = 0 if (not defined $stayOnPage);
     $width = 350 if (not defined $width);      $width = 350 if (not defined $width);
Line 1124  sub help_open_topic { Line 1128  sub help_open_topic {
     # (Always) Add the graphic      # (Always) Add the graphic
     my $title = &mt('Online Help');      my $title = &mt('Online Help');
     my $helpicon=&lonhttpdurl("/adm/help/help.png");      my $helpicon=&lonhttpdurl("/adm/help/help.png");
       if ($imgid ne '') {
           $imgid = ' id="'.$imgid.'"';
       }
     $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;"'.$imgid 
               .' /></a>';                .' /></a>';
     if ($text ne "") {      if ($text ne "") {
         $template.='</span>';          $template.='</span>';
Line 1202  ENDOUTPUT Line 1209  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 1230  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 1246  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 1303  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 1344  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 1712  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 1758  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 1793  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 1855  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 1902  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 3239  sub filemimetype { Line 3246  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 3405  sub get_previous_attempt { Line 3411  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,%lasthidden);
         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};
                     if (($lasthash{$key} eq 'anonsurvey') || ($lasthash{$key} eq 'anonsurveycred')) {
                         $lasthidden{$ign.'.'.$id} = 1;
                     }
                 }
                 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 3422  sub get_previous_attempt { Line 3441  sub get_previous_attempt {
       $prevattempts.=&end_data_table_header_row();        $prevattempts.=&end_data_table_header_row();
       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>';                         }
     }                  }
   $prevattempts.=&end_data_table_row();              }
               $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 3609  sub submlink { Line 3697  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 3734  sub findallcourses { Line 3825  sub findallcourses {
         $udom = $env{'user.domain'};          $udom = $env{'user.domain'};
     }      }
     if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {      if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
         my %roleshash = &Apache::lonnet::dump('roles',$udom,$uname);          my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1});
           my %roleshash = &Apache::lonnet::dump('roles',$udom,$uname,'.',undef,
                                                 $extra);
         if (!%roles) {          if (!%roles) {
             %roles = (              %roles = (
                        cc => 1,                         cc => 1,
Line 4139  sub get_domainconf { Line 4232  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 4175  sub get_domainconf { Line 4291  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 4430  Inputs: Line 4551  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 4450  other decorations will be returned. Line 4568  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;
       if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
           || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) {
           $public = 1;
       }
     if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }      if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); }
   
     $function = &get_users_function() if (!$function);      $function = &get_users_function() if (!$function);
Line 4487  sub bodytag { Line 4610  sub bodytag {
     }      }
   
     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 4501  sub bodytag { Line 4622  sub bodytag {
     }       } 
   
     my $name = &plainname($env{'user.name'},$env{'user.domain'});      my $name = &plainname($env{'user.name'},$env{'user.domain'});
     if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {      if ($public) {
  undef($role);   undef($role);
     } else {      } else {
  $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'});   $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'});
Line 4522  sub bodytag { Line 4643  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'} eq 'off') {  
         # 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 4545  sub bodytag { Line 4664  sub bodytag {
             return $bodytag;              return $bodytag;
         }          }
   
         $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>|;          unless ($env{'request.symb'} =~ m/\.page___\d+___/) {
               $bodytag .= qq|<div id="LC_nav_bar">$name $role</div>|;
           }
   
         $bodytag .= Apache::lonhtmlcommon::scripttag(          $bodytag .= Apache::lonhtmlcommon::scripttag(
             Apache::lonmenu::utilityfunctions(), 'start');              Apache::lonmenu::utilityfunctions(), 'start');
Line 4558  sub bodytag { Line 4679  sub bodytag {
         $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;          $bodytag .= qq|<div id="LC_realm">$realm $dc_info</div>|;
   
         #don't show menus for public users          #don't show menus for public users
         if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){          if (!$public){
             $bodytag .= Apache::lonmenu::secondary_menu();              $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);
Line 4575  sub bodytag { Line 4696  sub bodytag {
             $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end');               $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); 
         }          }
   
         #SD testing  
         #$bodytag .= Apache::lonmenu::menubuttons($forcereg);  
         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 dc_courseid_toggle {  sub dc_courseid_toggle {
     my ($dc_info) = @_;      my ($dc_info) = @_;
     return ' <span id="dccidtext" class="LC_cusr_subheading">'.      return ' <span id="dccidtext" class="LC_cusr_subheading LC_nobreak">'.
            '<a href="javascript:showCourseID();">'.             '<a href="javascript:showCourseID();">'.
            &mt('(More ...)').'</a></span>'.             &mt('(More ...)').'</a></span>'.
            '<div id="dccid" class="LC_dccid">'.$dc_info.'</div>';             '<div id="dccid" class="LC_dccid">'.$dc_info.'</div>';
Line 4643  sub make_attr_string { Line 4728  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 4732  sub standard_css { Line 4803  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 4754  sub standard_css { Line 4821  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 4761  sub standard_css { Line 4829  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 4768  body { Line 4844  body {
   color:$font;    color:$font;
 }  }
   
 a:focus {  a:focus,
   a:focus img {
   color: red;    color: red;
   background: yellow;    background: yellow;
 }  }
Line 4785  form, .inline { Line 4862  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 4903  table#LC_title_bar { Line 4992  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 4916  table#LC_title_bar.LC_with_remote { Line 5005  table#LC_title_bar.LC_with_remote {
   margin: 0;    margin: 0;
 }  }
   
 /* #SD START (work in progress)*/  ul.LC_breadcrumb_tools_outerlist {
   
 ul.LC_bct {  
     margin: 0;      margin: 0;
     padding: 0;      padding: 0;
       position: relative;
       list-style: none;
 }  }
 ul.LC_bct ol {  ul.LC_breadcrumb_tools_outerlist li {
     display: inline;      display: inline;
 }  }
 ul.LC_bct ul {  
     display: inline;  
     padding: 0;  
 }  
 ul.LC_bct li {  
     list-style-type: none;  
     display: inline;  
 }  
   
   
 ul.LC_breadcrumb_tools {  
 }  
   
 li.LC_breadcrumb_tools {  
 }  
 li.LC_breadcrumb_tools img{  
     vertical-align: middle;  
 }  
   
 .LC_breadcrumb_tools_A {  .LC_breadcrumb_tools_navigation {
     margin: 0 0 0 1em;      padding: 0;
 }      margin: 0;
 .LC_breadcrumb_tools_B {      float: left;
     float: right;  
     margin-top: 0.4em;  
 }  }
 .LC_breadcrumb_tools_C {  .LC_breadcrumb_tools_tools {
     margin: 0 1em 0 0;      padding: 0;
       margin: 0;
     float: right;      float: right;
 }  }
 /* #SD END */  
   
 table#LC_title_bar td {  table#LC_title_bar td {
   background: $tabbg;    background: $tabbg;
Line 4986  td.LC_table_cell_checkbox { Line 5055  td.LC_table_cell_checkbox {
   background: $sidebg;    background: $sidebg;
   border-bottom: 1px solid $lg_border_color;    border-bottom: 1px solid $lg_border_color;
   line-height: 2.5em;    line-height: 2.5em;
      /* SD working here     overflow: hidden;
      height: 2.5em;  
      overflow: hidden; */  
   margin: 0;    margin: 0;
   padding: 0;    padding: 0;
 }  }
   
 /* 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 10px 0;          margin: 0 0 10px 0;      
     padding: 3px;
 }  }
   
 .LC_fontsize_medium {  .LC_fontsize_medium {
Line 5019  td.LC_table_cell_checkbox { Line 5082  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 5038  td.LC_menubuttons_text { Line 5109  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 5065  table.LC_nested { Line 5135  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 5120  table.LC_data_table tr td.LC_leftcol_hea Line 5197  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 5174  table.LC_nested tr td.LC_right_item { Line 5258  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 5215  table.LC_calendar tr td.LC_calendar_day_ Line 5315  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 5275  table.LC_data_table tr > td.LC_roles_is Line 5381  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 5326  span.LC_parm_symb { Line 5432  span.LC_parm_symb {
   color: #AAAAAA;    color: #AAAAAA;
 }  }
   
   ul.LC_parm_parmlist li {
     display: inline-block;
     padding: 0.3em 0.8em;
     vertical-align: top;
     width: 150px;
     border-top:1px solid $lg_border_color;
   }
   
 td.LC_parm_overview_level_menu,  td.LC_parm_overview_level_menu,
 td.LC_parm_overview_map_menu,  td.LC_parm_overview_map_menu,
 td.LC_parm_overview_parm_selectors,  td.LC_parm_overview_parm_selectors,
Line 5486  table.LC_group_priv td { Line 5600  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 5753  div.LC_clear_float_footer { Line 5857  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 5836  div.LC_edit_problem_header_title { Line 5925  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 5877  div.LC_createcourse { Line 5959  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 5891  ol#LC_PathBreadcrumbs a:hover, Line 5966  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 5958  fieldset > legend { Line 6033  fieldset > legend {
   
 #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 5975  fieldset > legend { Line 6050  fieldset > legend {
   
 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 5990  ol.LC_primary_menu li { Line 6065  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;
 }  }
   
   ol.LC_primary_menu a.LC_new_message {
     font-weight:bold;
     color: darkred;
   }
   
   ol.LC_docs_parameters {
     margin-left: 0;
     padding: 0;
     list-style: none;
   }
   
   ol.LC_docs_parameters li {
     margin: 0;
     padding-right: 20px;
     display: inline;
   }
   
   ol.LC_docs_parameters li:before {
     content: "\\002022 \\0020";
   }
   
   li.LC_docs_parameters_title {
     font-weight: bold;
   }
   
   ol.LC_docs_parameters li.LC_docs_parameters_title:before {
     content: "";
   }
   
 ul#LC_secondary_menu {  ul#LC_secondary_menu {
   clear: both;    clear: both;
   color: $fontmenu;    color: $fontmenu;
Line 6037  ul#LC_secondary_menu li a { Line 6141  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 6057  ul.LC_TabContent li { Line 6162  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 6085  ul.LC_TabContentBigger li { Line 6207  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 6093  ul.LC_TabContentBigger li a { Line 6219  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 6131  ol#LC_MenuBreadcrumbs, Line 6260  ol#LC_MenuBreadcrumbs,
 ol#LC_PathBreadcrumbs {  ol#LC_PathBreadcrumbs {
   padding-left: 10px;    padding-left: 10px;
   margin: 0;    margin: 0;
   list-style-position: inside;    height: 2.5em;  /* equal to #LC_breadcrumbs line-height */
     /* SD working here   
     white-space: nowrap; */  
 }  }
   
 ol#LC_MenuBreadcrumbs li,  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: nowrap;    white-space: normal;  
     /* SD working here    
     white-space: normal; */   
 }  }
   
 ol#LC_MenuBreadcrumbs li a,  ol#LC_MenuBreadcrumbs li a,
Line 6151  ul.LC_CourseBreadcrumbs li a { Line 6276  ul.LC_CourseBreadcrumbs li a {
   font-size:90%;    font-size:90%;
 }  }
   
   ol#LC_MenuBreadcrumbs h1 {
     display: inline;
     font-size: 90%;
     line-height: 2.5em;
     margin: 0;
     padding: 0;
   }
   
 ol#LC_PathBreadcrumbs li a {  ol#LC_PathBreadcrumbs li a {
   text-decoration:none;    text-decoration:none;
   font-size:100%;    font-size:100%;
Line 6247  div.LC_columnSection>* { Line 6380  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 6328  a#LC_content_toolbar_firsthomework { Line 6415  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 6395  ul.LC_funclist { Line 6474  ul.LC_funclist {
     padding: 0.5em 1em 0.5em 0;      padding: 0.5em 1em 0.5em 0;
 }  }
   
   ul.LC_funclist > li:first-child {
       font-weight:bold; 
       margin-left:0.8em;
   }
   
 ul.LC_funclist + ul.LC_funclist {  ul.LC_funclist + ul.LC_funclist {
     /*       /* 
        left border as a seperator if we have more than         left border as a seperator if we have more than
Line 6415  ul.LC_funclist li { Line 6499  ul.LC_funclist li {
   line-height: 150%;    line-height: 150%;
 }  }
   
   .ui-accordion .LC_advanced_toggle {
     float: right;
     font-size: 90%;
     padding: 0px 4px
   }
   
   .LC_hidden {
     display: none;
   }
   
 END  END
 }  }
Line 6467  sub headtag { Line 6560  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 6494  ADDMETA Line 6587  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 6529  Inputs: none Line 6622  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 6551  sub xml_begin { Line 6640  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 6625  $args - additional optional args support Line 6677  $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
                                     current page                                      current page
              bread_crumbs ->             Array containing breadcrumbs               bread_crumbs ->             Array containing breadcrumbs
              bread_crumbs_components ->  if exists show it as headline else show only the breadcrumbs               bread_crumbs_component ->  if exists show it as headline else show only the breadcrumbs
   
 =back  =back
   
Line 6643  $args - additional optional args support Line 6693  $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 6651  sub start_page { Line 6709  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 6671  sub start_page { Line 6732  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 6688  sub start_page { Line 6748  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 6716  sub start_page { Line 6772  sub start_page {
     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 6827  sub simple_error_page { Line 6861  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";;
     }      }
   
     sub start_data_table_row {      sub start_data_table_row {
  my ($add_class) = @_;   my ($add_class, $id) = @_;
  $row_count[0]++;   $row_count[0]++;
  my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';   my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
  $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');   $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
  return  '<tr class="'.$css_class.'">'."\n";;          $id = (' id="'.$id.'"') unless ($id eq '');
           return  '<tr class="'.$css_class.'"'.$id.'>'."\n";
     }      }
           
     sub continue_data_table_row {      sub continue_data_table_row {
  my ($add_class) = @_;   my ($add_class, $id) = @_;
  my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';   my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row';
  $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');;   $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');
  return  '<tr class="'.$css_class.'">'."\n";;          $id = (' id="'.$id.'"') unless ($id eq '');
           return  '<tr class="'.$css_class.'"'.$id.'>'."\n";
     }      }
   
     sub end_data_table_row {      sub end_data_table_row {
Line 7014  role status: active, previous or future. Line 7061  role status: active, previous or future.
   
 sub check_user_status {  sub check_user_status {
     my ($udom,$uname,$cdom,$crs,$role,$sec) = @_;      my ($udom,$uname,$cdom,$crs,$role,$sec) = @_;
     my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname);      my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1});
       my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname,'.',undef,$extra);
     my @uroles = keys %userinfo;      my @uroles = keys %userinfo;
     my $srchstr;      my $srchstr;
     my $active_chk = 'none';      my $active_chk = 'none';
Line 8053  sub get_institutional_codes { Line 8101  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 9989  sub check_clone { Line 10041  sub check_clone {
     my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);      my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
     my $clonemsg;      my $clonemsg;
     my $can_clone = 0;      my $can_clone = 0;
     my $lctype = lc($args->{'type'});      my $lctype = lc($args->{'crstype'});
     if ($lctype ne 'community') {      if ($lctype ne 'community') {
         $lctype = 'course';          $lctype = 'course';
     }      }
     if ($clonehome eq 'no_host') {      if ($clonehome eq 'no_host') {
         if ($args->{'type'} eq 'Community') {          if ($args->{'crstype'} eq 'Community') {
             $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});              $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
         } else {          } else {
             $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});              $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
         }               }     
     } else {      } else {
  my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});   my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
         if ($args->{'type'} eq 'Community') {          if ($args->{'crstype'} eq 'Community') {
             if ($clonedesc{'type'} ne 'Community') {              if ($clonedesc{'type'} ne 'Community') {
                  $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});                   $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
                 return ($can_clone, $clonemsg, $cloneid, $clonehome);                  return ($can_clone, $clonemsg, $cloneid, $clonehome);
Line 10020  sub check_clone { Line 10072  sub check_clone {
                 $can_clone = 1;                  $can_clone = 1;
             } else {              } else {
                 my $ccrole = 'cc';                  my $ccrole = 'cc';
                 if ($args->{'type'} eq 'Community') {                  if ($args->{'crstype'} eq 'Community') {
                     $ccrole = 'co';                      $ccrole = 'co';
                 }                  }
         my %roleshash =          my %roleshash =
Line 10029  sub check_clone { Line 10081  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'})) {
                     if ($args->{'type'} eq 'Community') {                      $can_clone = 1;
                   } else {
                       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 {
                         $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});                          $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
Line 10090  sub construct_course { Line 10144  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 10113  sub construct_course { Line 10175  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 10359  sub construct_course { Line 10425  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 10376  sub construct_course { Line 10442  sub construct_course {
 ############################################################  ############################################################
 ############################################################  ############################################################
   
   #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 10541  sub init_user_environment { Line 10609  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 10581  sub init_user_environment { Line 10646  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'};
     $env{'browser.interface'}=$form->{'interface'};      $env{'browser.interface'}=$form->{'interface'};
  }   }
   
           my %is_adv = ( is_adv => $env{'user.adv'} );
           my %domdef = &Apache::lonnet::get_domain_defaults($domain);
   
         foreach my $tool ('aboutme','blog','portfolio') {          foreach my $tool ('aboutme','blog','portfolio') {
             $userenv{'availabletools.'.$tool} =               $userenv{'availabletools.'.$tool} = 
                 &Apache::lonnet::usertools_access($username,$domain,$tool,'reload');                  &Apache::lonnet::usertools_access($username,$domain,$tool,'reload',
                                                     undef,\%userenv,\%domdef,\%is_adv);
         }          }
   
         foreach my $crstype ('official','unofficial','community') {          foreach my $crstype ('official','unofficial','community') {
             $userenv{'canrequest.'.$crstype} =              $userenv{'canrequest.'.$crstype} =
                 &Apache::lonnet::usertools_access($username,$domain,$crstype,                  &Apache::lonnet::usertools_access($username,$domain,$crstype,
                                                   'reload','requestcourses');                                                    'reload','requestcourses',
                                                     \%userenv,\%domdef,\%is_adv);
         }          }
   
  $env{'user.environment'} = "$lonids/$cookie.id";   $env{'user.environment'} = "$lonids/$cookie.id";

Removed from v.1.926  
changed lines
  Added in v.1.983


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