Diff for /loncom/interface/londocs.pm between versions 1.660 and 1.693

version 1.660, 2019/04/11 14:22:35 version 1.693, 2023/01/19 16:43:49
Line 91  sub storemap { Line 91  sub storemap {
   
     if ($map =~ /^default/) {      if ($map =~ /^default/) {
         $hadchanges=1;          $hadchanges=1;
     } else {      } elsif ($contentchg) {
         $suppchanges=1;          $suppchanges=1;
     }      }
     return ($errtext,0);      return ($errtext,0);
Line 183  sub default_folderpath { Line 183  sub default_folderpath {
     }      }
 }  }
   
   sub validate_supppath {
       my ($coursenum,$coursedom) = @_;
       my $backto;
       if ($env{'form.supppath'} ne '') {
           my @items = split(/\&/,$env{'form.supppath'});
           my ($badpath,$got_supp,$supppath,%supphidden,%suppids);
           for (my $i=0; $i<@items; $i++) {
               my $odd = $i%2;
               if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {
                   $badpath = 1;
                   last;
               } elsif ($odd) {
                   my $suffix;
                   my $idx = $i-1;
                   if ($items[$i] =~ /^([^:]*)::(|1):::$/) {
                       $backto .= '&'.$1;
                   } elsif ($items[$idx] eq 'supplemental') {
                       $backto .= '&'.$items[$i];
                   } else {
                       $backto .= '&'.$items[$i];
                       my $is_hidden;
                       unless ($got_supp) {
                           my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
                           if (ref($supplemental) eq 'HASH') {
                               if (ref($supplemental->{'hidden'}) eq 'HASH') {
                                   %supphidden = %{$supplemental->{'hidden'}};
                               }
                               if (ref($supplemental->{'ids'}) eq 'HASH') {
                                   %suppids = %{$supplemental->{'ids'}};
                               }
                           }
                           $got_supp = 1;
                       }
                       if (ref($suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}) eq 'ARRAY') {
                           my $mapid = $suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}->[0];
                           if ($supphidden{$mapid}) {
                               $is_hidden = 1;
                           }
                       }
                       $suffix = '::'.$is_hidden.':::';
                   }
                   $supppath .= '&'.$items[$i].$suffix;
               } else {
                   $supppath .= '&'.$items[$i];
                   $backto .= '&'.$items[$i];
               }
           }
           if ($badpath) {
               delete($env{'form.supppath'});
           } else {
               $supppath =~ s/^\&//;
               $backto =~ s/^\&//;
               $env{'form.supppath'} = $supppath;
           }
       }
       return $backto;
   }
   
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 833  sub group_import { Line 891  sub group_import {
     }      }
     my $ext = 'false';      my $ext = 'false';
     if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }      if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
     $name = &LONCAPA::map::qtunescape($name);  
             if ($name eq '') {  
                 $name = &LONCAPA::map::qtunescape(&mt('Web Page'));  
             }  
             if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {              if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {
                 my $filepath = $1;                  my $filepath = $1;
                 my $fname = $name;                  my $fname;
                 if ($fname =~ /^\W+$/) {                  if ($name eq '') {
                       $name = &mt('Web Page');
                     $fname = 'web';                      $fname = 'web';
                 } else {                  } else {
                     $fname =~ s/\W/_/g;                      $fname = $name;
                 }                      $fname=&Apache::lonnet::clean_filename($fname);
                 if (length($fname) > 15) {                      if ($fname eq '') {
                     $fname = substr($fname,0,14);                          $fname = 'web';
                       } elsif (length($fname) > 15) {
                           $fname = substr($fname,0,14);
                       }
                 }                  }
                   my $title = &Apache::loncommon::cleanup_html($name);
                 my $initialtext = &mt('Replace with your own content.');                  my $initialtext = &mt('Replace with your own content.');
                 my $newhtml = <<END;                  my $newhtml = <<END;
 <html>  <html>
 <head>  <head>
 <title>$name</title>  <title>$title</title>
 </head>  </head>
 <body bgcolor="#ffffff">  <body bgcolor="#ffffff">
 $initialtext  $initialtext
Line 874  END Line 933  END
                     return (&mt('Failed to save new web page.'),1);                      return (&mt('Failed to save new web page.'),1);
                 }                  }
             }              }
               $name = &LONCAPA::map::qtunescape($name);
             $url  = &LONCAPA::map::qtunescape($url);              $url  = &LONCAPA::map::qtunescape($url);
     $LONCAPA::map::resources[$residx] =      $LONCAPA::map::resources[$residx] =
  join(':', ($name, $url, $ext, 'normal', 'res'));   join(':', ($name, $url, $ext, 'normal', 'res'));
Line 914  END Line 974  END
         &storemap($coursenum, $coursedom, $folder.'.'.$container,1);          &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
     unless ($fatal) {      unless ($fatal) {
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
             &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);  
             my ($errtext,$fatal) = &mapread($coursenum,$coursedom,              my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                             $folder.'.'.$container);                                              $folder.'.'.$container);
         }          }
Line 1148  sub docs_change_log { Line 1207  sub docs_change_log {
  }   }
  $r->print('</ul>');   $r->print('</ul>');
  if ($docslog{$id}{'logentry'}{'parameter_res'}) {   if ($docslog{$id}{'logentry'}{'parameter_res'}) {
     $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');              my ($title,$url) = split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'},3);
               if ($title eq '') {
                   ($title) = ($url =~ m{/([^/]+)$});
               }
               $r->print(&LONCAPA::map::qtescape($title).':<ul>');
     foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder','gradable') {      foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder','gradable') {
  if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {   if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
 # FIXME: internationalization seems wrong here  # FIXME: internationalization seems wrong here
Line 1217  sub update_paste_buffer { Line 1280  sub update_paste_buffer {
 # Construct identifiers for current contents of user's paste buffer  # Construct identifiers for current contents of user's paste buffer
     if (@currpaste) {      if (@currpaste) {
         foreach my $suffix (@currpaste) {          foreach my $suffix (@currpaste) {
              my $cid = $env{'docs.markedcopy_crs_'.$suffix};              my $cid = $env{'docs.markedcopy_crs_'.$suffix};
              my $url = $env{'docs.markedcopy_url_'.$suffix};              my $url = $env{'docs.markedcopy_url_'.$suffix};
              my $mapidx = $env{'docs.markedcopy_map_'.$suffix};              my $mapidx = $env{'docs.markedcopy_map_'.$suffix};
              if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&              if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
                  ($url ne '')) {                  ($url ne '')) {
                  $pasteurls{$cid.'_'.$url.'_'.$mapidx} = 1;                  if ($url eq '/res/lib/templates/simpleproblem.problem') {
              }                      $pasteurls{$cid.'_'.$mapidx} = 1;
                   } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {
                       $pasteurls{$url} = 1;
                   } else {
                       $pasteurls{$cid.'_'.$url} = 1;
                   }
               }
         }          }
     }      }
   
Line 1232  sub update_paste_buffer { Line 1301  sub update_paste_buffer {
   
     my @pathitems = split(/\&/,$env{'form.folderpath'});      my @pathitems = split(/\&/,$env{'form.folderpath'});
     my @folderconf = split(/\:/,$pathitems[-1]);      my @folderconf = split(/\:/,$pathitems[-1]);
     my $ispage = $folderconf[4];      my $ispage = $folderconf[5];
   
     foreach my $item (@possibles) {      foreach my $item (@possibles) {
         my ($orderidx,$cmd) = split(/:/,$item);          my ($orderidx,$cmd) = split(/:/,$item);
Line 1245  sub update_paste_buffer { Line 1314  sub update_paste_buffer {
                                           $env{'form.folderpath'},\%curr_groups);                                            $env{'form.folderpath'},\%curr_groups);
         next if ($denied{'copy'});          next if ($denied{'copy'});
         $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};          $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
         next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));          if ($url eq '/res/lib/templates/simpleproblem.problem') {
               next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));
           } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {
               next if (exists($pasteurls{$url}));
           } else {
               next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));
           }
         my ($suffix,$errortxt,$locknotfreed) =          my ($suffix,$errortxt,$locknotfreed) =
             &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');              &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');
         if ($suffix ne '') {          if ($suffix ne '') {
Line 1442  sub print_paste_buffer { Line 1517  sub print_paste_buffer {
             }              }
             $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';              $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';
             if ($nopaste) {              if ($nopaste) {
                  $pasteitems .= $nopaste;                      $pasteitems .= ' <span class="LC_cusr_emph">'.$nopaste.'</span>';   
             } else {              } else {
                 if ($othercrs) {                  if ($othercrs) {
                     $pasteitems .= $othercrs;                      $pasteitems .= $othercrs;
Line 1790  sub do_paste_from_buffer { Line 1865  sub do_paste_from_buffer {
     %msgs = &Apache::lonlocal::texthash (      %msgs = &Apache::lonlocal::texthash (
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',                  notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',                  notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
                 notindom  => 'Paste failed: Item is an external tool from a course in a different donain.',                   notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',                  duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
             );              );
   
Line 2329  sub copy_templated_files { Line 2404  sub copy_templated_files {
         my @simpleprobqtypes = qw(radio option string essay numerical);          my @simpleprobqtypes = qw(radio option string essay numerical);
         my $qtype=$srcparms{$srcprefix.'questiontype'};          my $qtype=$srcparms{$srcprefix.'questiontype'};
         if (grep(/^\Q$qtype\E$/,@simpleprobqtypes)) {          if (grep(/^\Q$qtype\E$/,@simpleprobqtypes)) {
             my %newdata;              my %newdata = (
                   $newprefix.'questiontype' => $qtype,
               );
             foreach my $type (@simpleprobqtypes) {              foreach my $type (@simpleprobqtypes) {
                 if ($type eq $qtype) {                  if ($type eq $qtype) {
                     $newdata{"$weightprefix.$type.weight"}=1;                      $newdata{"$weightprefix.$type.weight"}=1;
Line 2745  sub apply_fixups { Line 2822  sub apply_fixups {
             $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;              $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
         }          }
         my $mapcontent = &Apache::lonnet::getfile($key);          my $mapcontent = &Apache::lonnet::getfile($key);
           if (($mapcontent eq '-1') && ($before{'map'} eq 'supplemental') &&
               ($after{'map'} eq 'default') &&
               ($key =~ m{^/uploaded/$match_domain/$match_courseid/supplemental_\d+\.sequence$})) {
               $mapcontent = '<map>'."\n".
                             '<resource id="1" src="" type="start" />'."\n".
                             '<link from="1" to="2" index="1" />'."\n".
                             '<resource id="2" src="" type="finish" />'."\n".
                             '</map>';
           }
         if ($mapcontent eq '-1') {          if ($mapcontent eq '-1') {
             if (ref($errors) eq 'HASH') {              if (ref($errors) eq 'HASH') {
                 $errors->{$key} = 1;                  $errors->{$key} = 1;
Line 2803  sub apply_fixups { Line 2889  sub apply_fixups {
                 }                  }
             }              }
             if (ref($resdatacopy{$key}) eq 'HASH') {              if (ref($resdatacopy{$key}) eq 'HASH') {
                 if ($newsubdir{$key}) {                  my ($gotnewmapname,$newmapname,$srcfolder,$srccontainer);
   
                 }  
                 foreach my $idx (keys(%{$resdatacopy{$key}})) {                  foreach my $idx (keys(%{$resdatacopy{$key}})) {
                     if (ref($resdatacopy{$key}{$idx}) eq 'HASH') {                      if (ref($resdatacopy{$key}{$idx}) eq 'HASH') {
                         my $srcurl = $resdatacopy{$key}{$idx}{'src'};                          my $srcurl = $resdatacopy{$key}{$idx}{'src'};
Line 2815  sub apply_fixups { Line 2899  sub apply_fixups {
                                 ($resdatacopy{$key}{$idx}{'cnum'} =~ /^$match_courseid$/)) {                                  ($resdatacopy{$key}{$idx}{'cnum'} =~ /^$match_courseid$/)) {
                                 my $srcdom = $resdatacopy{$key}{$idx}{'cdom'};                                  my $srcdom = $resdatacopy{$key}{$idx}{'cdom'};
                                 my $srcnum = $resdatacopy{$key}{$idx}{'cnum'};                                  my $srcnum = $resdatacopy{$key}{$idx}{'cnum'};
                                 my ($newmapname) = ($key =~ m{/([^/]+)$});                                  unless ($gotnewmapname) {
                                 my ($srcfolder,$srccontainer) = split(/\./,$newmapname);                                      ($newmapname) = ($key =~ m{/([^/]+)$});
                                       ($srcfolder,$srccontainer) = split(/\./,$newmapname);
                                       if ($newsubdir{$key}) {
                                           $newmapname =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
                                       }
                                       $gotnewmapname = 1;
                                   }
                                 my $srcmapinfo = $srcfolder.':'.$idx;                                  my $srcmapinfo = $srcfolder.':'.$idx;
                                 if ($srccontainer eq 'page') {                                  if ($srccontainer eq 'page') {
                                     $srcmapinfo .= ':1';                                      $srcmapinfo .= ':1';
                                 }                                  }
                                 if ($newsubdir{$key}) {  
                                     $newmapname =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;  
                                 }  
                                 &copy_templated_files($srcurl,$srcdom,$srcnum,$srcmapinfo,$cdom,                                  &copy_templated_files($srcurl,$srcdom,$srcnum,$srcmapinfo,$cdom,
                                                       $cnum,$template,$idx,$newmapname);                                                        $cnum,$template,$idx,$newmapname);
                             }                              }
Line 3026  sub update_parameter { Line 3113  sub update_parameter {
             my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);              my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
             $name=&LONCAPA::map::qtescape($name);              $name=&LONCAPA::map::qtescape($name);
             $url=&LONCAPA::map::qtescape($url);              $url=&LONCAPA::map::qtescape($url);
             next unless ($name && $url);              next unless $url;
             my $is_map;              my $is_map;
             if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {              if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
                 $is_map = 1;                  $is_map = 1;
Line 3478  sub editor { Line 3565  sub editor {
         $r->print('</div>');          $r->print('</div>');
     }      }
   
       if ((!$allowed) && ($folder =~ /^supplemental_\d+$/)) {
           my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
           if (ref($supplemental) eq 'HASH') {
               if ((ref($supplemental->{'hidden'}) eq 'HASH') &&
                   (ref($supplemental->{'ids'}) eq 'HASH')) {
                   if (ref($supplemental->{'ids'}->{"/uploaded/$coursedom/$coursenum/$folder.$container"}) eq 'ARRAY') {
                       my $mapnum = $supplemental->{'ids'}->{"/uploaded/$coursedom/$coursenum/$folder.$container"}->[0];
                       if ($supplemental->{'hidden'}->{$mapnum}) {
                           $ishidden = 1;
                       }
                   }
               }
           }
       }
   
     my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);      my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);
     %filters =  (      %filters =  (
                   canremove      => [],                    canremove      => [],
Line 3501  sub editor { Line 3603  sub editor {
             push(@allmapidx,$res);              push(@allmapidx,$res);
         }          }
   
           if (($supplementalflag) && (!$allowed) && (!$env{'request.role.adv'})) {
               if (($ishidden) || ((&LONCAPA::map::getparameter($res,'parameter_hiddenresource'))[0]=~/^yes$/i)) {
                   $idx++;
                   next;
               }
           }
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,          $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
                               $coursenum,$coursedom,$crstype,                                $coursenum,$coursedom,$crstype,
                               $pathitem,$supplementalflag,$container,                                $pathitem,$supplementalflag,$container,
                               \%filters,\%curr_groups,$ltitoolsref,$canedit,                                \%filters,\%curr_groups,$ltitoolsref,$canedit,
                               $isencrypted,$navmapref,$hostname);                                $isencrypted,$ishidden,$navmapref,$hostname);
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
Line 3514  sub editor { Line 3622  sub editor {
     my $need_save;      my $need_save;
     if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {      if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {
         my $toolslink;          my $toolslink;
         if ($allowed) {          if ($allowed || $canedit) {
               my $helpitem = 'Navigation_Screen';
               if (!$allowed) {
                   $helpitem = 'Supplemental_Navigation';
               }
             $toolslink = '<table><tr><td>'              $toolslink = '<table><tr><td>'
                        .&Apache::loncommon::help_open_menu('Navigation Screen',                         .&Apache::loncommon::help_open_menu('Navigation Screen',
                                                            'Navigation_Screen',undef,'RAT')                                                             $helpitem,undef,'RAT')
                        .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'                         .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'
                        .'<td align="left"><ul id="LC_toolbar">'                         .'<td align="left"><ul id="LC_toolbar">'
                        .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '                         .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '
Line 3533  sub editor { Line 3645  sub editor {
                           .&Apache::loncommon::start_data_table_header_row()                            .&Apache::loncommon::start_data_table_header_row()
                           .'<th colspan="2">'.&mt('Move').'</th>'                            .'<th colspan="2">'.&mt('Move').'</th>'
                           .'<th colspan="3">'.&mt('Actions').'</th>'                            .'<th colspan="3">'.&mt('Actions').'</th>'
                           .'<th>'.&mt('Document').'</th>';                            .'<th>'.&mt('Document').'</th>'
                 if ($folder !~ /^supplemental/) {                            .'<th colspan="2">'.&mt('Settings').'</th>'
                     $to_show .= '<th colspan="2">'.&mt('Settings').'</th>';                            .&Apache::loncommon::end_data_table_header_row();
                 }  
                 $to_show .= &Apache::loncommon::end_data_table_header_row();  
                 if ($folder !~ /^supplemental/) {                  if ($folder !~ /^supplemental/) {
                     $lists{'canhide'} = join(',',@allidx);                      $lists{'canhide'} = join(',',@allidx);
                     $lists{'canrandomlyorder'} = join(',',@allmapidx);                      $lists{'canrandomlyorder'} = join(',',@allmapidx);
Line 3885  sub is_supplemental_title { Line 3995  sub is_supplemental_title {
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,          $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,
         $ltitoolsref,$canedit,$isencrypted,$navmapref,$hostname)=@_;          $ltitoolsref,$canedit,$isencrypted,$ishidden,$navmapref,$hostname)=@_;
     my ($foldertitle,$renametitle,$oldtitle);      my ($foldertitle,$renametitle,$oldtitle,$encodedtitle);
     if (&is_supplemental_title($title)) {      if (&is_supplemental_title($title)) {
  ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);   ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
           $encodedtitle=$title;
     } else {      } else {
  $title=&HTML::Entities::encode($title,'"<>&\'');   $title=&HTML::Entities::encode($title,'"<>&\'');
           $encodedtitle=$title;
  $renametitle=$title;   $renametitle=$title;
  $foldertitle=$title;   $foldertitle=$title;
     }      }
Line 3912  sub entryline { Line 4024  sub entryline {
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end,$form_common,$form_param);      my ($form_start,$form_end,$form_common,$form_param);
 # Edit commands  # Edit commands
     my ($esc_path, $path, $symb, $curralias);      my ($esc_path, $path, $symb, $shownsymb, $curralias);
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
  $esc_path=&escape($env{'form.folderpath'});   $esc_path=&escape($env{'form.folderpath'});
  $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
Line 4117  END Line 4229  END
     my $ispage;      my $ispage;
     my $containerarg;      my $containerarg;
     my $folderurl;      my $folderurl;
       my $plainurl;
     if ($uploaded) {      if ($uploaded) {
         if (($extension eq 'sequence') || ($extension eq 'page')) {          if (($extension eq 'sequence') || ($extension eq 'page')) {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;              $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
Line 4135  END Line 4248  END
                 $url='/adm/supplemental?';                  $url='/adm/supplemental?';
             }              }
  } else {   } else {
     &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);      $plainurl = $url;
  }   }
     }      }
   
     my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);      my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);
     my $orig_url = $url;      my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
     $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};      if ($container eq 'page') {
           $url=~s{^http(|s)(&colon;|:)//}{/ext/};
       } else {
           $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
       }
     if (!$supplementalflag && $residx && $symb) {      if (!$supplementalflag && $residx && $symb) {
         if ((!$isfolder) && (!$ispage)) {          if ((!$isfolder) && (!$ispage)) {
     (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);      (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
     $url=&Apache::lonnet::clutter($url);              if (($url =~ m{^ext/}) && ($container eq 'page')) {
                   $url=&Apache::lonnet::clutter_with_no_wrapper($url);
               } else {
                   $url=&Apache::lonnet::clutter($url);
               } 
     if ($url=~/^\/*uploaded\//) {      if ($url=~/^\/*uploaded\//) {
         $url=~/\.(\w+)$/;          $url=~/\.(\w+)$/;
         my $embstyle=&Apache::loncommon::fileembstyle($1);          my $embstyle=&Apache::loncommon::fileembstyle($1);
Line 4160  END Line 4281  END
     } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {      } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {
                 my $wrapped = $1;                  my $wrapped = $1;
                 my $exturl = $2;                  my $exturl = $2;
                 if ($wrapped eq '') {                  if (($wrapped eq '') && ($container ne 'page')) { 
                     $url='/adm/wrapper'.$url;                      $url='/adm/wrapper'.$url;
                 }                  }
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {                  if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {
Line 4171  END Line 4292  END
             } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {              } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {
                 if (($ENV{'SERVER_PORT'} == 443) &&                  if (($ENV{'SERVER_PORT'} == 443) &&
                     ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {                      ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                     unless (&Apache::lonnet::uses_sts()) {                      unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                         $url .= '?usehttp=1';                          $url .= '?usehttp=1';
                     }                      }
                     $nomodal = 1;                      $nomodal = 1;
                 }                  }
             }              }
             if (&Apache::lonnet::symbverify($symb,$url)) {              my ($checkencrypt,$shownurl);
                 my $shownsymb = $symb;              if (!$env{'request.role.adv'}) {
                 if ($isexternal) {  
                     if ($url =~ /^([^#]+)#([^#]+)$/) {  
                         $url = $1;  
                         $anchor = $2;  
                         my $escan = &escape('#');  
                         $shownsymb =~ s/^([^\#]+)#([^\#]+)$/$1$escan$2/;  
                     }  
                 }  
                 unless ($env{'request.role.adv'}) {  
                     if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {  
                         $url = '';  
                     }  
                     if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) {  
                         $url = '';  
                         $hiddenres = 1;  
                     }  
                 }  
                 if ($url ne '') {  
                     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);  
                 }  
             } elsif (!$env{'request.role.adv'}) {  
                 my $checkencrypt;  
                 if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||                  if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||
                       $isencrypted || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {                      ($isencrypted) || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {
                     $checkencrypt = 1;                      $checkencrypt = 1;
                 } elsif (ref($navmapref)) {                  } elsif (ref($navmapref)) {
                     unless (ref($$navmapref)) {                      unless (ref($$navmapref)) {
Line 4210  END Line 4309  END
                     }                      }
                     if (ref($$navmapref)) {                      if (ref($$navmapref)) {
                         if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') {                          if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') {
                             $checkencrypt = 1;                                     $checkencrypt = 1;
                         }                          }
                     }                      }
                 }                  }
                 if ($checkencrypt) {              }
                     my $shownsymb = &Apache::lonenc::encrypted($symb);              if ($checkencrypt) {
                     my $shownurl = &Apache::lonenc::encrypted($url);                  my $currenc = $env{'request.enc'};
                     if (&Apache::lonnet::symbverify($shownsymb,$shownurl)) {                  $env{'request.enc'} = 1;
                         $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);                  $shownsymb = &Apache::lonenc::encrypted($symb);
                         if ($env{'request.enc'} ne '') {                  $shownurl = &Apache::lonenc::encrypted($url);
                             delete($env{'request.enc'});                  if (&Apache::lonnet::symbverify($symb,$url)) {
                         }                      $url = $shownurl;
                     } else {  
                         $url='';  
                     }  
                 } else {                  } else {
                     $url='';                      $url = '';
                 }                  }
             } else {                  $env{'request.enc'} = $currenc;
                 $url='';              } elsif (&Apache::lonnet::symbverify($symb,$url)) {
                   $shownsymb = $symb;
                   if ($isexternal) {
                       $url =~ s/\#[^#]+$//;
                       if ($container eq 'page') {
                           $url = &Apache::lonnet::clutter($url);
                       }
                   }
                   $shownurl = $url;
               }
               unless ($env{'request.role.adv'}) {
                   if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                       $url = '';
                   }
                   if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) {
                       $url = '';
                       $hiddenres = 1;
                   }
               }
               if ($url ne '') {
                   $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
             }              }
  }   }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
Line 4238  END Line 4354  END
                 $url = $1;                  $url = $1;
                 $anchor = $2;                  $anchor = $2;
                 if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {                  if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {
                     unless (&Apache::lonnet::uses_sts()) {                      unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                         if ($hostname ne '') {                          if ($hostname ne '') {
                             $url = 'http://'.$hostname.$url;                              $url = 'http://'.$hostname.$url;
                         }                          }
Line 4250  END Line 4366  END
         } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {          } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {
             if (($ENV{'SERVER_PORT'} == 443) &&              if (($ENV{'SERVER_PORT'} == 443) &&
                 ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {                  ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                 unless (&Apache::lonnet::uses_sts()) {                  unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                     if ($hostname ne '') {                      if ($hostname ne '') {
                         $url = 'http://'.$hostname.$url;                          $url = 'http://'.$hostname.$url;
                     }                      }
Line 4258  END Line 4374  END
                 }                  }
                 $nomodal = 1;                  $nomodal = 1;
             }              }
           } elsif (($uploaded) && (!$allowed) && ($url ne '/adm/supplemental?')) {
               my $embstyle=&Apache::loncommon::fileembstyle($extension);
               unless ($embstyle eq 'ssi') {
                   if (($embstyle eq 'img')
                    || ($embstyle eq 'emb')
                    || ($embstyle eq 'wrp')) {
                       $url='/adm/wrapper'.$url;
                   } elsif ($url !~ /\.(sequence|page)$/) {
                       $url='/adm/coursedocs/showdoc'.$url;
                   }
               }
           }
           unless ($allowed && $env{'request.role.adv'}) {
               if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                   $hiddenres = 1;
               }
         }          }
     }      }
     my ($rand_pick_text,$rand_order_text,$hiddenfolder);      my ($rand_pick_text,$rand_order_text,$hiddenfolder);
Line 4269  END Line 4401  END
         if (!$allowed && $supplementalflag) {          if (!$allowed && $supplementalflag) {
             $folderpath.=$containerarg.'&'.$foldername;              $folderpath.=$containerarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);              $url.='folderpath='.&escape($folderpath);
               if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                   $hiddenfolder = 1;
               }
         } else {          } else {
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,              my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
                                                         'parameter_randompick'))[0];                                                          'parameter_randompick'))[0];
Line 4354  $form_end; Line 4489  $form_end;
         $url .= ($url =~ /\?/) ? '&amp;':'?';          $url .= ($url =~ /\?/) ? '&amp;':'?';
         $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');          $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');
         if ($title) {          if ($title) {
             $url .= '&amp;title='.&HTML::Entities::encode($renametitle,'<>&"');              $url .= '&amp;title='.$encodedtitle;
         }          }
         if ((($isexternal) || ($isexttool)) && $orderidx) {          if ((($isexternal) || ($isexttool)) && $orderidx) {
             $url .= '&amp;idx='.$orderidx;              $url .= '&amp;idx='.$orderidx;
Line 4389  $form_end; Line 4524  $form_end;
                     &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,                      &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,
                                                             $switchserver,                                                              $switchserver,
                                                             $forceedit,                                                              $forceedit,
                                                             undef,$symb,                                                              undef,$symb,$shownsymb,
                                                             &escape($env{'form.folderpath'}),                                                              &escape($env{'form.folderpath'}),
                                                             $renametitle,$hostname,                                                              $renametitle,$hostname,
                                                             '','',1,$suppanchor);                                                              '','',1,$suppanchor);
Line 4420  $form_end; Line 4555  $form_end;
         }          }
     }      }
     $line.='</td><td>';      $line.='</td><td>';
     my $link;      my ($link,$nolink);
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';          if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) {
               if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                   $nolink = 1;
               }
           }
           if ($nolink) {
               $line .= '<img src="'.$icon.'" alt="" class="LC_icon" /></a>';
           } else {
               $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
           }
     } elsif ($url) {      } elsif ($url) {
        if ($anchor ne '') {         if ($anchor ne '') {
            if ($supplementalflag) {             if ($supplementalflag) {
Line 4437  $form_end; Line 4581  $form_end;
            $link = $url;             $link = $url;
        }         }
        $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.$anchor);         $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.$anchor);
        if ($nomodal) {         if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) {
              if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                  $nolink = 1;
              }
          }
          if ($nolink) {
              $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
          } elsif ($nomodal) {
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.             $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.
                   '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>';                    '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>';
        } else {         } else {
Line 4449  $form_end; Line 4600  $form_end;
     }      }
     $line.='</span></td><td'.$tdwidth.'>';      $line.='</span></td><td'.$tdwidth.'>';
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'">'.$title.'</a>';         if ($nolink) {
              $line.=$title;
          } else {
              $line.='<a href="'.$url.'">'.$title.'</a>';
          }
          if (!$allowed && $supplementalflag && $canedit && $isfolder) {
              my $editicon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';
              my $editurl = $url;
              $editurl =~ s{^\Q/adm/supplemental?\E}{/adm/coursedocs?command=direct&amp;forcesupplement=1&amp;};
              $line .= '&nbsp;'.'<a href="'.$editurl.'">'.
                       '<img src="'.$editicon.'" alt="'.&mt('Edit Content').'" title="'.&mt('Edit Content').'" />'.
                       '</a>';
          }
          if ((($hiddenfolder) || ($hiddenres)) && (!$allowed) && ($supplementalflag))  {
              $line.= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
          }
     } elsif ($url) {      } elsif ($url) {
        if ($nomodal) {         if ($nolink) {
              $line.=$title;
          } elsif ($nomodal) {
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.             $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.
                   $title.'</a>';                    $title.'</a>';
        } else {         } else {
Line 4470  $form_end; Line 4638  $form_end;
     $line .= '</td>';      $line .= '</td>';
     $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');      $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');
     $rand_order_text = '&nbsp;' if ($rand_order_text eq '');      $rand_order_text = '&nbsp;' if ($rand_order_text eq '');
     if (($allowed) && ($folder!~/^supplemental/)) {      if ($uploaded && $url && !$isfolder && !$ispage) {
   my %lt=&Apache::lonlocal::texthash(          if (($plainurl ne '') && ($env{'request.role.adv'} || $allowed || !$hiddenres)) {
        'hd' => 'Hidden',              &Apache::lonnet::allowuploaded('/adm/coursedoc',$plainurl);
        'ec' => 'URL hidden');  
         my ($enctext,$hidtext);  
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {  
             $enctext = ' checked="checked"';  
             if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {  
                 push(@{$filtersref->{'encrypturl'}},$orderidx);  
             }  
         }          }
       }
       if ($allowed) {
           my %lt=&Apache::lonlocal::texthash(
                                 'hd' => 'Hidden',
                                 'ec' => 'URL hidden');
           my ($enctext,$hidtext,$formhidden,$formurlhidden);
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {          if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
             $hidtext = ' checked="checked"';              $hidtext = ' checked="checked"';
             if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {              if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
                 push(@{$filtersref->{'hiddenresource'}},$orderidx);                  push(@{$filtersref->{'hiddenresource'}},$orderidx);
             }              }
         }          }
         my $formhidden = 'edit_hiddenresource_'.$orderidx;          $formhidden = 'edit_hiddenresource_'.$orderidx;
         my $formurlhidden = 'edit_encrypturl_'.$orderidx;          $line.=(<<ENDPARMS);
  $line.=(<<ENDPARMS);  
   <td class="LC_docs_entry_parameter">    <td class="LC_docs_entry_parameter">
     <form action="/adm/coursedocs" method="post" name="$formhidden">      <form action="/adm/coursedocs" method="post" name="$formhidden">
     $form_param      $form_param
     $form_common      $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $disabled /> $lt{'hd'}</label>      <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $disabled /> $lt{'hd'}</label>
     $form_end      $form_end
   ENDPARMS
           if ($folder =~/^supplemental/) {
               $line.= "\n    <td>";
           } else {
               if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {
                   $enctext = ' checked="checked"';
                   if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {
                       push(@{$filtersref->{'encrypturl'}},$orderidx);
                   }
               }
               $formurlhidden = 'edit_encrypturl_'.$orderidx;
       $line.=(<<ENDPARMS);
     <br />      <br />
     <form action="/adm/coursedocs" method="post" name="$formurlhidden">      <form action="/adm/coursedocs" method="post" name="$formurlhidden">
     $form_param      $form_param
Line 4506  $form_end; Line 4684  $form_end;
   <td class="LC_docs_entry_parameter">$rand_pick_text<br />    <td class="LC_docs_entry_parameter">$rand_pick_text<br />
                                       $rand_order_text</td>                                        $rand_order_text</td>
 ENDPARMS  ENDPARMS
           }
     }      }
     $line.=&Apache::loncommon::end_data_table_row();      $line.=&Apache::loncommon::end_data_table_row();
     return $line;      return $line;
Line 4839  sub short_urls { Line 5018  sub short_urls {
         $r->rflush();          $r->rflush();
         my $readonly;          my $readonly;
         if ($canedit) {          if ($canedit) {
             my ($numnew,$errors) = &Apache::loncommon::make_short_symbs($cdom,$cnum,$navmap);              my ($numnew,$errors) = &Apache::loncommon::get_requested_shorturls($cdom,$cnum,$navmap);
             if ($numnew) {              if ($numnew) {
                 $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');                  $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');
             }              }
Line 4874  sub contentverifyform { Line 5053  sub contentverifyform {
               &mt('No').'</label>'.('&nbsp;'x2).                &mt('No').'</label>'.('&nbsp;'x2).
               '<label><input type="radio" name="checkstale" value="1" />'.                '<label><input type="radio" name="checkstale" value="1" />'.
               &mt('Yes').'</label></span></p><p>'.                &mt('Yes').'</label></span></p><p>'.
               '<input type="submit" value="'.&mt('Verify content').' "/>'.                '<input type="submit" value="'.&mt('Verify Content').' "/>'.
               '<input type="hidden" value="1" name="tools" />'.                '<input type="hidden" value="1" name="tools" />'.
               '<input type="hidden" value="1" name="verify" /></p></form>');                '<input type="hidden" value="1" name="verify" /></p></form>');
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
Line 5361  sub handler { Line 5540  sub handler {
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
     
     my ($allowed,$canedit,$canview,$noendpage,$disabled);      my ($allowed,$canedit,$canview,$noendpage,$disabled);
   # does this user have privileges to modify content.
       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
 # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.  # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
     unless ($r->uri eq '/adm/supplemental') {          unless ($r->uri eq '/adm/supplemental') {
         # does this user have privileges to modify content.    
         if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
             $allowed = 1;              $allowed = 1;
             $canedit = 1;          }
             $canview = 1;          $canedit = 1;
         } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) {          $canview = 1;
       } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) {
   # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
           unless ($r->uri eq '/adm/supplemental') {
             $allowed = 1;              $allowed = 1;
             $canview = 1;  
         }          }
           $canview = 1;
     }      }
     unless ($canedit) {      unless ($canedit) {
         $disabled = ' disabled="disabled"';          $disabled = ' disabled="disabled"';
Line 5476  sub handler { Line 5658  sub handler {
 # Get the parameters that may be needed  # Get the parameters that may be needed
 #  #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['folderpath',                                              ['folderpath','title',
                                              'forcesupplement','forcestandard',                                               'forcesupplement','forcestandard',
                                              'tools','symb','command','supppath']);                                               'tools','symb','command','supppath']);
   
Line 5523  sub handler { Line 5705  sub handler {
     if ($env{'form.tools'}) { $toolsflag=1; }      if ($env{'form.tools'}) { $toolsflag=1; }
   
     if ($env{'form.folderpath'} ne '') {      if ($env{'form.folderpath'} ne '') {
         my @items = split(/\&/,$env{'form.folderpath'});          &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
         my $badpath;  
         for (my $i=0; $i<@items; $i++) {  
             my $odd = $i%2;  
             if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) {  
                 $badpath = 1;  
             } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) {  
                 $badpath = 1;  
             }  
             last if ($badpath);  
         }  
         if ($badpath) {  
             delete($env{'form.folderpath'});  
         }  
     }      }
   
       my $backto_supppath;
     if ($env{'form.supppath'} ne '') {      if ($env{'form.supppath'} ne '') {
         my @items = split(/\&/,$env{'form.supppath'});          if ($supplementalflag && $allowed) {
         my $badpath;              $backto_supppath = &validate_supppath($coursenum,$coursedom);
         for (my $i=0; $i<@items; $i++) {  
             my $odd = $i%2;  
             if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {  
                 $badpath = 1;   
             }  
             last if ($badpath);  
         }  
         if ($badpath) {  
             delete($env{'form.supppath'});  
         }          }
     }      }
   
Line 5572  sub handler { Line 5733  sub handler {
                &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap);                 &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap);
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>             &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                $env{'form.command'}.'_'.$env{'form.symb'}});                 $env{'form.command'}.'_'.$env{'form.symb'}});
        } elsif ($env{'form.supppath'} ne '') {         } elsif (($env{'form.supppath'} ne '') && $supplementalflag && $allowed) {
            $env{'form.folderpath'}=$env{'form.supppath'};             $env{'form.folderpath'}=$env{'form.supppath'};
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>             &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                $env{'form.command'}.'_'.$env{'form.supppath'}});                 $env{'form.command'}.'_'.$backto_supppath});
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
        $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap);         $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap);
Line 5610  sub handler { Line 5771  sub handler {
         } else {          } else {
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         }          }
           if ($env{'form.folderpath'} ne '') {
               &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
           }
     }      }
         
 # If we are not allowed to make changes, all we can see are supplemental docs  # If we are not allowed to make changes, all we can see are supplemental docs
Line 5624  sub handler { Line 5788  sub handler {
                                   .'&'.                                    .'&'.
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
 # If allowed and user's role is not advanced check folderpath is not hidden    # If allowed and user's role is not advanced check folderpath is not hidden
     if (($allowed) && (!$env{'request.role.adv'}) &&       my $hidden_and_empty;
         ($env{'form.folderpath'} ne '') && (!$supplementalflag)) {      if (($allowed) && (!$env{'request.role.adv'}) && ($env{'form.folderpath'} ne '')) {
         my $folderurl;          my ($folderurl,$foldername,$hiddenfolder);
         my @pathitems = split(/\&/,$env{'form.folderpath'});          my @pathitems = split(/\&/,$env{'form.folderpath'});
         my $folder = $pathitems[-2];          my $folder = $pathitems[-2];
         if ($folder eq '') {          if ($folder eq '') {
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         } else {          } else {
             $folderurl = "uploaded/$coursedom/$coursenum/$folder";              $folderurl = "uploaded/$coursedom/$coursenum/$folder";
             if ((split(/\:/,$pathitems[-1]))[4]) {              if ((split(/\:/,$pathitems[-1]))[5]) {
                 $folderurl .= '.page';                  $folderurl .= '.page';
             } else {              } else {
                 $folderurl .= '.sequence';                  $folderurl .= '.sequence';
             }              }
             unless (ref($navmap)) {              if ($supplementalflag) {
                 $navmap = Apache::lonnavmaps::navmap->new();                  ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*)::(|1):::$/);
             }                  $foldername = &HTML::Entities::decode(&unescape($foldername));
             if (ref($navmap)) {                  my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
                 if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {                  if (ref($supplemental) eq 'HASH') {
                     my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);                      my ($suppmap,$suppmapnum);
                     unless (@resources) {                      if ($folder eq 'supplemental') {
                         undef($env{'form.folderpath'});                          $suppmap = 'default';
                           $suppmapnum = 0;
                       } elsif ($folder =~ /^supplemental_(\d+)$/) {
                           $suppmap = $1;
                           $suppmapnum = $suppmap;
                       }
                       if ($hiddenfolder) {
                           my $hascontent;
                           foreach my $key (reverse(sort(keys(%{$supplemental->{'ids'}})))) {
                               if ($key =~ m{^\Q/uploaded/$coursedom/$coursenum/supplemental/$suppmap/\E}) {
                                   $hascontent = 1;
                               } elsif (ref($supplemental->{'ids'}->{$key}) eq 'ARRAY') {
                                   foreach my $id (@{$supplemental->{'ids'}->{$key}}) {
                                       if ($id =~ /^$suppmapnum\:/) {
                                           $hascontent = 1;
                                           last;
                                       }
                                   }
                               }
                               last if ($hascontent);
                           }
                           unless ($hascontent) {
                               if ($foldername ne '') {
                                   $hidden_and_empty = $foldername;
                               } else {
                                   $hidden_and_empty = $folder;
                               }
                           }
                       }
                   }
               } else {
                   unless (ref($navmap)) {
                       $navmap = Apache::lonnavmaps::navmap->new();
                   }
                   ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*):|\d+:|1:(|1):|1:|1$/);
                   $foldername = &HTML::Entities::decode(&unescape($foldername));
                   if (ref($navmap)) {
                       if ($hiddenfolder ||
                           (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes')) {
                           my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);
                           unless (@resources) {
                               if ($foldername ne '') {
                                   $hidden_and_empty = $foldername;
                               } else {
                                   $hidden_and_empty = $folder;
                               }
                           }
                     }                      }
                 }                  }
             }              }
               if ($hidden_and_empty ne '') {
                   splice(@pathitems,-2);
                   if (@pathitems) {
                       $env{'form.folderpath'} = join('&',@pathitems);
                   } else {
                       undef($env{'form.folderpath'});
                   }
               }
         }          }
     }      }
   
   
 # If after all of this, we still don't have any paths, make them  # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {      unless ($env{'form.folderpath'}) {
        if ($supplementalflag) {         if ($supplementalflag) {
Line 5747  sub handler { Line 5964  sub handler {
                        &inject_data_js().                         &inject_data_js().
                        &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid).                         &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid).
                        &Apache::lonextresedit::extedit_javascript(\%ltitools);                         &Apache::lonextresedit::extedit_javascript(\%ltitools);
               my $onload = "javascript:resize_scrollbox('contentscroll','1','1');";
               if ($hidden_and_empty ne '') {
                   my $alert = &mt("Additional privileges required to edit empty and hidden folder: '[_1]'",
                                   $hidden_and_empty);
                   $onload .= "javascript:alert('".&js_escape($alert)."');";
               }
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload => $onload,
                           };                            };
         }          }
         $script .= &paste_popup_js();           $script .= &paste_popup_js(); 
Line 5770  sub handler { Line 5993  sub handler {
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     if ($showdoc) {      if ($showdoc) {
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,          my $args;
                                                 {'force_register' => $showdoc,}));          if ($supplementalflag) {
               my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');
               my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
               $args = {'bread_crumbs' => $brcrum};
           } else {
               $args = {'force_register' => $showdoc};
           }
           $r->print(&Apache::loncommon::start_page("$crstype documents",undef,$args));
     } elsif ($toolsflag) {      } elsif ($toolsflag) {
         my ($breadtext,$breadtitle);          my ($breadtext,$breadtitle);
         $breadtext = "$crstype Editor";          $breadtext = "$crstype Editor";
Line 5789  sub handler { Line 6019  sub handler {
                      $breadtitle)                       $breadtitle)
                  );                   );
     } elsif ($r->uri eq '/adm/supplemental') {      } elsif ($r->uri eq '/adm/supplemental') {
           unless ($env{'request.role.adv'}) {
               unless (&Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom)) {
                   $r->internal_redirect('/adm/navmaps');
                   return OK;
               }
           }
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,          $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
                                                 {'bread_crumbs' => $brcrum,}));                                                  {'bread_crumbs' => $brcrum,}));
Line 5819  sub handler { Line 6055  sub handler {
   my %codebase = ();    my %codebase = ();
   my ($upload_result,$upload_output,$uploadphase);    my ($upload_result,$upload_output,$uploadphase);
   if ($canedit) {    if ($canedit) {
         undef($suppchanges);
       if (($env{'form.uploaddoc.filename'}) &&        if (($env{'form.uploaddoc.filename'}) &&
   ($env{'form.cmd'}=~/^upload_(\w+)/)) {    ($env{'form.cmd'}=~/^upload_(\w+)/)) {
           my $context = $1;             my $context = $1; 
Line 5830  sub handler { Line 6067  sub handler {
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
             if ($suppchanges) {
                 &Apache::lonnet::update_supp_caches($coursedom,$coursenum);
                 undef($suppchanges);
             }
           $r->print($upload_output);            $r->print($upload_output);
       } elsif ($env{'form.phase'} eq 'upload_embedded') {        } elsif ($env{'form.phase'} eq 'upload_embedded') {
           # Process file upload - phase two - upload embedded objects             # Process file upload - phase two - upload embedded objects 
Line 5898  sub handler { Line 6139  sub handler {
                 'stpr' => 'Standard Problem',                  'stpr' => 'Standard Problem',
                 'news' => 'New sub-directory',                  'news' => 'New sub-directory',
                 'crpr' => 'Create Problem',                  'crpr' => 'Create Problem',
                   'swit' => 'Switch Server',
                 'drbx' => 'Drop Box',                  'drbx' => 'Drop Box',
                 'scuf' => 'External Scores (handgrade, upload, clicker)',                  'scuf' => 'External Scores (handgrade, upload, clicker)',
                 'bull' => 'Discussion Board',                  'bull' => 'Discussion Board',
Line 5967  sub handler { Line 6209  sub handler {
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
         $quotainfo          $quotainfo
  $lt{'file'}:<br />   $lt{'file'}:<br />
  <input type="file" name="uploaddoc" class="flUpload" size="40" $disabled />   <input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled />
         <input type="hidden" id="free_space" value="$free_space" />          <input type="hidden" id="LC_free_space" value="$free_space" />
 FIUP  FIUP
   
  my $checkbox=(<<CHBO);   my $checkbox=(<<CHBO);
Line 6056  FUFORM Line 6298  FUFORM
 SEDFFORM  SEDFFORM
         my $importcrsresform;          my $importcrsresform;
         my ($numdirs,$pickfile) =           my ($numdirs,$pickfile) = 
             &Apache::loncommon::import_crsauthor_form('crsresimportform','coursepath','coursefile',              &Apache::loncommon::import_crsauthor_form('coursepath','coursefile',
                                                       "resize_scrollbox('contentscroll','1','0');",                                                        "resize_scrollbox('contentscroll','1','0');",
                                                       undef,'res');                                                        undef,'res');
         if ($pickfile) {          if ($pickfile) {
             $importcrsresform=(<<CRSFORM);              $importcrsresform=(<<CRSFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res','$numdirs');">          <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res');">
         $lt{'imcr'}</a>$help{'Course_Resources'}          $lt{'imcr'}</a>$help{'Course_Resources'}
         <form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();">          <form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();">
         <fieldset id="importcrsresform" style="display: none;">          <fieldset id="importcrsresform" style="display: none;">
Line 6072  SEDFFORM Line 6314  SEDFFORM
         $lt{'title'}: <input type="textbox" name="crsrestitle" value="" $disabled />          $lt{'title'}: <input type="textbox" name="crsrestitle" value="" $disabled />
         </p>          </p>
         <input type="hidden" name="importdetail" value="" />          <input type="hidden" name="importdetail" value="" />
         <input type="submit" name="crsres" value="$lt{'impo'}" $disabled />          <input type="submit" name="crsres" value="$lt{'impo'}" $disabled /><br />
         </fieldset>          </fieldset>
         </form>          </form>
 CRSFORM  CRSFORM
Line 6092  CRSFORM Line 6334  CRSFORM
         { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform },          { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform },
         );          );
         if ($pickfile) {          if ($pickfile) {
             push(@importpubforma,{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{imcr}.'"  onclick="javascript:toggleImportCrsres(\'res\','."'$numdirs'".');"/>' => $importcrsresform});              push(@importpubforma,{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{imcr}.'"  onclick="javascript:toggleImportCrsres(\'res\');" />' => $importcrsresform});
  }   }
  $importpubform = &create_form_ul(&create_list_elements(@importpubforma));   $importpubform = &create_form_ul(&create_list_elements(@importpubforma));
         my $extresourcesform =          my $extresourcesform =
Line 6294  NROSTFORM Line 6536  NROSTFORM
 NWEBFORM  NWEBFORM
   
         my @ids=&Apache::lonnet::current_machine_ids();          my @ids=&Apache::lonnet::current_machine_ids();
         my %select_menus;          my $machines_str = "'".join("','",@ids)."'";
         my $numauthor = 0;          my (%is_home,%toppath,$rolehomes);
         my $numcrsdirs = 0;  
         my $toppath = "/priv/$env{'user.domain'}/$env{'user.name'}";   
         if ($env{'user.author'}) {          if ($env{'user.author'}) {
             $numauthor ++;  
             $select_menus{'author'}->{'text'} = &Apache::lonnet::plaintext('au');  
             if (grep(/^\Q$env{'user.home'}\E$/,@ids)) {              if (grep(/^\Q$env{'user.home'}\E$/,@ids)) {
                 my $is_home = 1;                  $is_home{'author'} = 1;
                 my %subdirs;  
                 &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);  
                 $select_menus{'author'}->{'default'} = '/';   
                 $select_menus{'author'}->{'select2'}->{'/'} = '/';  
                 my @ordered = ('/');  
                 foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {  
                     $select_menus{'author'}->{'select2'}->{$relpath} = $relpath;  
                     push(@ordered,$relpath);  
                 }  
                 $select_menus{'author'}->{'order'} = \@ordered;  
             } else {  
                 $select_menus{'author'}->{'select2'}->{'switch'} = &mt('Switch server required');  
                 $select_menus{'author'}->{'default'} = 'switch';  
                 $select_menus{'author'}->{'order'} = ['switch'];  
             }              }
               $rolehomes = '<input type="hidden" id="rolehome_author" name="rolehome_author" value="'.$env{'user.home'}.'" />'."\n";
         }          }
         my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',          my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                       ['active'],['ca','aa']);                                                        ['active'],['ca','aa']);
         my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};  
         my %by_roletype;          my %by_roletype;
         if (keys(%roleshash)) {          if (keys(%roleshash)) {
             foreach my $entry (keys(%roleshash)) {              foreach my $entry (keys(%roleshash)) {
                 my ($auname,$audom,$roletype) = split(/:/,$entry);                  my ($auname,$audom,$roletype) = split(/:/,$entry);
                 my $key = $entry;                  my $key = $entry;
                 $key =~ s/:/___/g;                  $key =~ s/:/___/g;
                 $by_roletype{$roletype}{$auname.'___'.$audom} = 1;                  my $author = $auname.'___'.$audom;
                 $select_menus{$key}->{'text'} = &Apache::lonnet::plaintext($roletype)." ($audom/$auname)";                  $by_roletype{$roletype}{$author} = 1;
                 my $rolehome = &Apache::lonnet::homeserver($auname,$audom);                  my $rolehome = &Apache::lonnet::homeserver($auname,$audom);
                 if (grep(/^\Q$rolehome\E$/,@ids)) {                      $toppath{$author} = "/priv/$audom/$auname";
                     my $is_home = 1;                  if (grep(/^\Q$rolehome\E$/,@ids)) {
                     my (%subdirs,@ordered);                      $is_home{$author} = 1;
                     my $toppath="/priv/$audom/$auname";  
                     &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);  
                     $select_menus{$key}->{'default'} = '/';  
                     $select_menus{$key}->{'select2'}->{'/'} = '/';  
                     my @ordered = ('/');  
                     foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {  
                         $select_menus{$key}->{'select2'}->{$relpath} = $relpath;  
                         push(@ordered,$relpath);  
                     }  
                     $select_menus{$key}->{'order'} = \@ordered;  
                 } else {  
                     $select_menus{$key}->{'select2'}->{'switch'} = &mt('Switch server required');  
                     $select_menus{$key}->{'default'} = 'switch';  
                     $select_menus{$key}->{'order'} = ['switch'];  
                 }  
                 $numauthor ++;  
             }  
         }  
         my ($pickdir,$showtitle);  
         if ($numauthor) {  
             my @order;  
             my $defrole;  
             if ($env{'user.author'}) {  
                 push(@order,'author');  
                 $defrole = 'author';  
             }  
             if (keys(%by_roletype)) {  
                 foreach my $possrole ('ca','aa') {  
                     if (ref($by_roletype{$possrole}) eq 'HASH') {  
                         foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) {  
                             unless ($defrole) {  
                                 $defrole = $author;  
                             }  
                             push(@order,$author.'___'.$possrole);  
                         }  
                     }  
                 }                  }
                   $rolehomes .= '<input type="hidden" id="rolehome_coauthor_'.$roletype.'_'.$audom.'/'.$auname.'" '.
                                 'name="rolehome_coauthor" value="'.$roletype.'='.$audom.'/'.$auname.'='.$rolehome.'" />'."\n";
             }              }
             $select_menus{'course'}->{'text'} = &mt('Course Resource');          }
             if (grep(/^\Q$crshome\E$/,@ids)) {          my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};
                 my $is_home = 1;          if (grep(/^\Q$crshome\E$/,@ids)) {
                 my %subdirs;              $is_home{'course'} = 1;
                 my $toppath="/priv/$coursedom/$coursenum";          }
                 &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);          $rolehomes .= '<input type="hidden" id="rolehome_course" name="rolehome_course" value="'.$crshome.'" />'."\n";
                 $numcrsdirs = keys(%subdirs);          my $pickdir = $lt{'loca'}.
                 $select_menus{'course'}->{'default'} = '/';                     '<select name="authorrole" onchange="populateDirSelects(this.form,'."'authorrole','authorpath'".',1,1,0);">'."\n".
                 $select_menus{'course'}->{'select2'}->{'/'} = '/';                     '<option value="" selected="selected">'.&mt('Select').'</option>'."\n";
                 my @ordered = ('/');          if ($env{'user.author'}) {
                 foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {              $pickdir .= '<option value="author">'.&Apache::lonnet::plaintext('au').'</option>'."\n";
                     $select_menus{'course'}->{'select2'}->{$relpath} = $relpath;          }
                     push(@ordered,$relpath);          if (keys(%by_roletype)) {
                 }              foreach my $possrole ('ca','aa') {
                 $select_menus{'course'}->{'order'} = \@ordered;                  if (ref($by_roletype{$possrole}) eq 'HASH') {
             } else {                      my $roletitle = &Apache::lonnet::plaintext($possrole);
                 $select_menus{'course'}->{'select2'}->{'switch'} = &mt('Switch server required');                      foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) {
                 $select_menus{'course'}->{'default'} = 'switch';                          my ($none,$where,$auname,$audom) = split(/\//,$toppath{$author});
                 $select_menus{'course'}->{'order'} = ['switch'];                          $pickdir .= '<option value="'.$author.'___'.$possrole.'">'.
             }                                       $roletitle." ($audom/$auname)</option>\n";
             push(@order,'course');  
             $pickdir = $lt{'loca'}.  
                        &Apache::loncommon::linked_select_forms('courseresform','<br />'.$lt{'dire'},  
                                                                $defrole,'authorrole','authorpath',  
                                                                \%select_menus,\@order,'toggleCrsResTitle();',  
                                                                '','priv').'<br />';  
             $showtitle = 'none';  
         } else {  
             my $is_home;  
             $showtitle = 'inline';  
             if (grep(/^\Q$crshome\E$/,@ids)) {  
                 $is_home = 1;  
                 $pickdir .= '<input type="hidden" name="authorrole" value="course" />';   
                 my $toppath="/priv/$coursedom/$coursenum'}";  
                 my %subdirs;  
                 &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);  
                 $numcrsdirs = keys(%subdirs);   
                 if ($numcrsdirs) {  
                     $pickdir .= &mt('Directory: ').'<select name="authorpath">'."\n".  
                                  '<option value="/">/</option>'."\n";  
                     foreach my $key (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {  
                         $pickdir .= '<option value="'.$key.'">'.$key.'</option>'."\n";  
                     }                      }
                     $pickdir .= '</select>';  
                 } else {  
                     $pickdir .= '<input type="hidden" name="authorpath" value="/" />'."\n";     
                 }                  }
             }              }
         }          }
           $pickdir .= '<option value="course">'.&mt('Course Resource').'</option>'."\n".
                       '</select><br />'."\n".
                       $lt{'dire'}.
                       '<select name="authorpath" onchange="toggleCrsResTitle();">'.
                       '<option value=""></option>'.
                       '</select><br />'."\n";
   
         my %seltemplate_menus;          my %seltemplate_menus;
         my @files = &Apache::lonhomework::get_template_list('problem');          my @files = &Apache::lonhomework::get_template_list('problem');
Line 6463  NWEBFORM Line 6634  NWEBFORM
         my $templatepreview =  '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true);  return false;">'.          my $templatepreview =  '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true);  return false;">'.
                                '<span id="newresexample">'.&mt('Example').'<span></a>';                                 '<span id="newresexample">'.&mt('Example').'<span></a>';
         my $crsresform=(<<RESFORM);          my $crsresform=(<<RESFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res','$numauthor','$numcrsdirs');">          <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">
         $lt{'stpr'}</a>$help{'Course_Resource'}          $lt{'stpr'}</a>$help{'Course_Resource'}
         <form action="/adm/coursedocs" method="post" name="courseresform">          <form action="/adm/coursedocs" method="post" name="courseresform">
         <fieldset id="crsresform" style="display:none;">          <fieldset id="crsresform" style="display:none;">
Line 6471  NWEBFORM Line 6642  NWEBFORM
         <input type="hidden" name="active" value="bb" />          <input type="hidden" name="active" value="bb" />
         <p>          <p>
         $pickdir          $pickdir
           <div id="newstdproblem" style="display:none;">
         <span class="LC_nobreak">$lt{'news'}?&nbsp;          <span class="LC_nobreak">$lt{'news'}?&nbsp;
         <label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label>          <label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label>
         &nbsp;          &nbsp;
Line 6481  NWEBFORM Line 6653  NWEBFORM
         $lt{'fnam'}          $lt{'fnam'}
         <input type="text" size="20" name="newresourcename" autocomplete="off" $disabled />          <input type="text" size="20" name="newresourcename" autocomplete="off" $disabled />
         <p>          <p>
         <div id="newresource" style="display:$showtitle">          <div id="newresource" style="display:none">
         $lt{'addp'}          $lt{'addp'}
         <label><input type="radio" name="newresourceadd" value="0" checked="checked" onclick="toggleNewInCourse(this.form);" $disabled />          <label><input type="radio" name="newresourceadd" value="0" checked="checked" onclick="toggleNewInCourse(this.form);" $disabled />
         $lt{'no'}</label>&nbsp;&nbsp;          $lt{'no'}</label>&nbsp;&nbsp;
Line 6506  NWEBFORM Line 6678  NWEBFORM
         <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />          <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
         <input type="submit" name="newcrs" value="$lt{'crpr'}" $disabled />          <input type="submit" name="newcrs" value="$lt{'crpr'}" $disabled />
         </span>          </span>
           </div>
           <div id="stdprobswitch" style="display:none;">
           $rolehomes
           <input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" />
           </div>
         </fieldset>          </fieldset>
         </form>          </form>
   
Line 6564  NSYLFORM Line 6741  NSYLFORM
  $help{'Group Portfolio'}   $help{'Group Portfolio'}
  </form>   </form>
 NGFFORM  NGFFORM
  @specialdocumentsforma=(          if ($container eq 'page') {
               @specialdocumentsforma=(
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
               );
           } else {
       @specialdocumentsforma=(
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
         );              );
           }
         $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));          $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
   
         my @external = (          my @external = (
Line 6598  NGFFORM Line 6781  NGFFORM
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\','."'$numauthor','$numcrsdirs'".');" />'=>$crsresform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\');" />'=>$crsresform},
         );          );
         $gradingform = &create_form_ul(&create_list_elements(@gradingforma));          $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
   
Line 6616  my %orderhash = ( Line 6799  my %orderhash = (
                 'bb' => ['Import',$importpubform],                  'bb' => ['Import',$importpubform],
                 'cc' => ['External',$externalform],                  'cc' => ['External',$externalform],
                 'dd' => ['Grading',$gradingform],                  'dd' => ['Grading',$gradingform],
                   'ff' => ['Other',$specialdocumentsform],
                 );                  );
 unless ($container eq 'page') {  unless ($container eq 'page') {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
     $orderhash{'ee'} = ['Collaboration',$communityform];      $orderhash{'ee'} = ['Collaboration',$communityform];
     $orderhash{'ff'} = ['Other',$specialdocumentsform];  
 }  }
   
  $hadchanges=0;   $hadchanges=0;
Line 6648  unless ($container eq 'page') { Line 6831  unless ($container eq 'page') {
        unless ($supplementalflag) {         unless ($supplementalflag) {
    $folder='supplemental';     $folder='supplemental';
        }         }
        if ($folder =~ /^supplemental$/ &&         if (($folder eq 'supplemental') &&
    (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {     (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
           $env{'form.folderpath'} = &supplemental_base();            $env{'form.folderpath'} = &supplemental_base();
        } elsif ($allowed) {         } elsif ($allowed) {
Line 6777  my %suporderhash = ( Line 6960  my %suporderhash = (
                 'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]                  'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]
                 );                  );
         if ($supplementalflag) {          if ($supplementalflag) {
            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,              $suppchanges = 0;
                                $supplementalflag,\%suporderhash,$iconpath,$pathitem,              my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                \%ltitools,$canedit,$hostname);                                  $supplementalflag,\%suporderhash,$iconpath,$pathitem,
            if ($error) {                                  \%ltitools,$canedit,$hostname);
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');              if ($error) {
            } else {                  $r->print('<p><span class="LC_error">'.$error.'</span></p>');
                if ($suppchanges) {              }
                    my %servers = &Apache::lonnet::internet_dom_servers($coursedom);              if ($suppchanges) {
                    my @ids=&Apache::lonnet::current_machine_ids();                  &Apache::lonnet::update_supp_caches($coursedom,$coursenum);
                    foreach my $server (keys(%servers)) {                  undef($suppchanges);
                        next if (grep(/^\Q$server\E$/,@ids));              }
                        my $hashid=$coursenum.':'.$coursedom;  
                        my $cachekey = &escape('suppcount').':'.&escape($hashid);  
                        &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);  
                    }  
                    &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);  
                    undef($suppchanges);  
                }  
            }  
         }          }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                             $supplementalflag,'',$iconpath,$pathitem,'','',$hostname);                              $supplementalflag,'',$iconpath,$pathitem,'',$canedit,
                               $hostname);
         if ($error) {          if ($error) {
             $r->print('<p><span class="LC_error">'.$error.'</span></p>');              $r->print('<p><span class="LC_error">'.$error.'</span></p>');
         }          }
Line 6963  sub remove_archive { Line 7139  sub remove_archive {
             if ($url eq $env{'form.archiveurl'}) {              if ($url eq $env{'form.archiveurl'}) {
                 if (&handle_edit_cmd($docuname,$docudom)) {                  if (&handle_edit_cmd($docuname,$docudom)) {
                     ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);                      ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);
                       if ($suppchanges) {
                           &Apache::lonnet::update_supp_caches($docudom,$docuname);
                           undef($suppchanges);
                       }
                     if ($fatal) {                      if ($fatal) {
                         if ($container eq 'page') {                          if ($container eq 'page') {
                             $delwarning = &mt('An error occurred updating the contents of the current page.');                              $delwarning = &mt('An error occurred updating the contents of the current page.');
Line 7237  sub editing_js { Line 7417  sub editing_js {
                                           tinc    => 'Title in course',                                            tinc    => 'Title in course',
                                           sunm    => 'Sub-directory name',                                            sunm    => 'Sub-directory name',
                                           edri    => 'Editing rights unavailable for your current role.',                                            edri    => 'Editing rights unavailable for your current role.',
                                             sele    => 'Select',
                                             swit    => 'Switch server required',
                                         );                                          );
     &js_escape(\%js_lt);      &js_escape(\%js_lt);
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 7248  sub editing_js { Line 7430  sub editing_js {
     my $backtourl;      my $backtourl;
     my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref));      my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref));
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
       my $showfile_js = &Apache::loncommon::show_crsfiles_js();
       my @ids=&Apache::lonnet::current_machine_ids();
       my $machines_str = "'".join("','",@ids)."'";
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {      if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {
         my $caller = $1;          my $caller = $1;
         if ($caller =~ /^supplemental/) {          if ($caller =~ /^supplemental/) {
Line 7277  sub editing_js { Line 7461  sub editing_js {
                 if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {                  if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {
                     if (($ENV{'SERVER_PORT'} == 443) &&                      if (($ENV{'SERVER_PORT'} == 443) &&
                         ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {                          ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                         unless (&Apache::lonnet::uses_sts()) {                          unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                             if ($hostname ne '') {                              if ($hostname ne '') {
                                 $backtourl = 'http://'.$hostname.$backtourl;                                  $backtourl = 'http://'.$hostname.$backtourl;
                             }                              }
Line 7286  sub editing_js { Line 7470  sub editing_js {
                     }                      }
                 } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) {                  } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) {
                     if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) {                      if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) {
                         unless (&Apache::lonnet::uses_sts()) {                          unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                             if ($hostname ne '') {                              if ($hostname ne '') {
                                 $backtourl = 'http://'.$hostname.$backtourl;                                  $backtourl = 'http://'.$hostname.$backtourl;
                             }                              }
Line 7305  sub editing_js { Line 7489  sub editing_js {
     } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {      } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {
         $backtourl = '/adm/menu';          $backtourl = '/adm/menu';
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         $backtourl = '/adm/supplemental';          if (($env{'request.role.adv'}) ||
               (&Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom))) {
               $backtourl = '/adm/supplemental';
           } else {
               $backtourl = '/adm/navmaps';
           }
     } else {      } else {
         $backtourl = '/adm/navmaps';          $backtourl = '/adm/navmaps';
     }      }
Line 7332  sub editing_js { Line 7521  sub editing_js {
 function makenewfolder(targetform,folderseq) {  function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}');      var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}');
     if (foldername) {      if (foldername) {
        targetform.importdetail.value=escape(foldername)+"="+folderseq;         targetform.importdetail.value=encodeURIComponent(foldername)+"="+folderseq;
         targetform.submit();          targetform.submit();
     }      }
 }  }
Line 7340  function makenewfolder(targetform,folder Line 7529  function makenewfolder(targetform,folder
 function makenewpage(targetform,folderseq) {  function makenewpage(targetform,folderseq) {
     var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}');      var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}');
     if (pagename) {      if (pagename) {
         targetform.importdetail.value=escape(pagename)+"="+folderseq;          targetform.importdetail.value=encodeURIComponent(pagename)+"="+folderseq;
         targetform.submit();          targetform.submit();
     }      }
 }  }
Line 7349  function makeexamupload() { Line 7538  function makeexamupload() {
    var title=prompt('$js_lt{"p_mxu"}');     var title=prompt('$js_lt{"p_mxu"}');
    if (title) {     if (title) {
     this.document.forms.newexamupload.importdetail.value=      this.document.forms.newexamupload.importdetail.value=
  escape(title)+'=/res/lib/templates/examupload.problem';   encodeURIComponent(title)+'=/res/lib/templates/examupload.problem';
     this.document.forms.newexamupload.submit();      this.document.forms.newexamupload.submit();
    }     }
 }  }
Line 7358  function makesmppage() { Line 7547  function makesmppage() {
    var title=prompt('$js_lt{"p_msp"}');     var title=prompt('$js_lt{"p_msp"}');
    if (title) {     if (title) {
     this.document.forms.newsmppg.importdetail.value=      this.document.forms.newsmppg.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/new/smppg';   encodeURIComponent(title)+'=/adm/$udom/$uname/new/smppg';
     this.document.forms.newsmppg.submit();      this.document.forms.newsmppg.submit();
    }     }
 }  }
Line 7373  function makewebpage(type) { Line 7562  function makewebpage(type) {
    }     }
    if (title) {     if (title) {
        var webpage = formname.importdetail.value;          var webpage = formname.importdetail.value; 
        formname.importdetail.value = escape(title)+'='+webpage;         formname.importdetail.value = encodeURIComponent(title)+'='+webpage;
        formname.submit();         formname.submit();
    }     }
 }  }
Line 7382  function makesmpproblem() { Line 7571  function makesmpproblem() {
    var title=prompt('$js_lt{"p_msb"}');     var title=prompt('$js_lt{"p_msb"}');
    if (title) {     if (title) {
     this.document.forms.newsmpproblem.importdetail.value=      this.document.forms.newsmpproblem.importdetail.value=
  escape(title)+'=/res/lib/templates/simpleproblem.problem';   encodeURIComponent(title)+'=/res/lib/templates/simpleproblem.problem';
     this.document.forms.newsmpproblem.submit();      this.document.forms.newsmpproblem.submit();
    }     }
 }  }
Line 7391  function makedropbox() { Line 7580  function makedropbox() {
    var title=prompt('$js_lt{"p_mdb"}');     var title=prompt('$js_lt{"p_mdb"}');
    if (title) {     if (title) {
     this.document.forms.newdropbox.importdetail.value=      this.document.forms.newdropbox.importdetail.value=
         escape(title)+'=/res/lib/templates/DropBox.problem';          encodeURIComponent(title)+'=/res/lib/templates/DropBox.problem';
     this.document.forms.newdropbox.submit();      this.document.forms.newdropbox.submit();
    }     }
 }  }
Line 7400  function makebulboard() { Line 7589  function makebulboard() {
    var title=prompt('$js_lt{"p_mbb"}');     var title=prompt('$js_lt{"p_mbb"}');
    if (title) {     if (title) {
     this.document.forms.newbul.importdetail.value=      this.document.forms.newbul.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/new/bulletinboard';   encodeURIComponent(title)+'=/adm/$udom/$uname/new/bulletinboard';
     this.document.forms.newbul.submit();      this.document.forms.newbul.submit();
    }     }
 }  }
Line 7595  function toggleMap(caller) { Line 7784  function toggleMap(caller) {
     return;      return;
 }  }
   
 function toggleCrsRes(caller,numauthorrole,numcrsdirs) {  function toggleCrsRes(caller) {
     var disp = 'none';      var disp = 'none';
     if (document.getElementById('crsresform')) {      if (document.getElementById('crsresform')) {
         if (caller == 'res') {          if (caller == 'res') {
             var curr = document.getElementById('crsresform').style.display;              var form = document.getElementById('crsresform');
               var curr = form.style.display;
             if (curr == 'none') {              if (curr == 'none') {
                 disp='block';                  disp='block';
                 numauthor = parseInt(numauthorrole);                  document.courseresform.authorrole.selectedIndex = 0;
                 if (numauthor > 0) {                  document.courseresform.authorpath.selectedIndex = 0;
                     document.courseresform.authorrole.selectedIndex = 0;                  document.courseresform.newresourceadd.selectedIndex = 0;
                     select1priv_changed();                  populateDirSelects(form,'authorrole','authorpath',1,0,0);
                     document.courseresform.authorpath.selectedIndex = 0;                  toggleNewInCourse(document.courseresform);
                     document.courseresform.newresourceadd.selectedIndex = 0;                  if (document.getElementById('newresource')) {
                     toggleNewInCourse(document.courseresform);                      document.getElementById('newresource').style.display = 'none';
                     if (document.getElementById('newresource')) {  
                         document.getElementById('newresource').style.display = 'none';  
                     }  
                 } else {  
                     if (numcrsdirs) {  
                         document.courseresform.authorpath.selectedIndex = 0;  
                     }  
                 }                  }
                 if (document.courseresform.newresusetemp.length) {                  if (document.courseresform.newresusetemp.length) {
                     document.courseresform.newresusetemp[0].checked = true;                      document.courseresform.newresusetemp[0].checked = true;
Line 7669  function toggleNewsubdir(form) { Line 7852  function toggleNewsubdir(form) {
   
 function toggleCrsResTitle() {  function toggleCrsResTitle() {
     if (document.getElementById('newresource')) {      if (document.getElementById('newresource')) {
         if (document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value == 'course') {          var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value;
           if (selloc == 'course') {
             document.getElementById('newresource').style.display = 'inline';              document.getElementById('newresource').style.display = 'inline';
             document.courseresform.newresourceadd[0].checked = true;              document.courseresform.newresourceadd[0].checked = true;
             toggleNewInCourse(document.courseresform);              toggleNewInCourse(document.courseresform);
         } else {          } else {
             document.getElementById('newresource').style.display = 'none';              document.getElementById('newresource').style.display = 'none';
         }          }
     }       }
       if (document.getElementById('newstdproblem')) {
           if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') {
               document.getElementById('newstdproblem').style.display = 'none'; 
               if (document.getElementById('stdprobswitch')) {
                   document.getElementById('stdprobswitch').style.display = 'block'; 
               }
           } else {
               document.getElementById('newstdproblem').style.display = 'block';
               if (document.getElementById('stdprobswitch')) {
                   document.getElementById('stdprobswitch').style.display = 'none';
               }
           }
       }
 }  }
   
 function toggleNewInCourse(form) {  function toggleNewInCourse(form) {
Line 7756  function getExample(width,height,scrolli Line 7953  function getExample(width,height,scrolli
     }      }
 }  }
   
 function toggleImportCrsres(caller,dircount) {  function toggleImportCrsres(caller) {
     var disp = 'none';      var disp = 'none';
     if (document.getElementById('importcrsresform')) {      if (document.getElementById('importcrsresform')) {
         if (caller == 'res') {          if (caller == 'res') {
             var numdirs = parseInt(dircount);  
             var curr = document.getElementById('importcrsresform').style.display;              var curr = document.getElementById('importcrsresform').style.display;
             if (curr == 'none') {              if (curr == 'none') {
                 disp='block';                  disp='block';
                 if (numdirs > 1) {                  populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1);
                     select1res_changed();  
                 }  
             }              }
         }          }
         document.getElementById('importcrsresform').style.display=disp;          document.getElementById('importcrsresform').style.display=disp;
Line 7775  function toggleImportCrsres(caller,dirco Line 7969  function toggleImportCrsres(caller,dirco
     return;      return;
 }  }
   
   $showfile_js
   
   function populateDirSelects(form,locsel,dirsel,setdir,recurse,nonemptydir) {
       var location = form.elements[locsel].options[form.elements[locsel].selectedIndex].value;
       if ((setdir) && (dirsel != null) && (dirsel != 'undefined') && (dirsel != '')) {
           var selelem = form.elements[dirsel];
           var i, numfiles = selelem.options.length -1;
           if (numfiles >=0) {
               for (i = numfiles; i >= 0; i--) {
                   selelem.remove(i);
               }
           }
           if ((location == '') || (location == null) || (location == 'undefined')) {
                if (selelem.options.length == 0) {
                    selelem.options[selelem.options.length] = new Option('','');
                    selelem.selectedIndex = 0;
                }
                if (document.getElementById('newstdproblem')) {
                    document.getElementById('newstdproblem').style.display = 'none';
                }
                return;
           }
           var machineIds = new Array($machines_str);
           var athome = 0;
           var role = location;
           if ((location == 'author') || (location == 'course')) {
               if (document.getElementById('rolehome_'+location)) {
                   var currhome = document.getElementById('rolehome_'+location).value;
                   if ((currhome != '') && (currhome != null) && (currhome != 'undefined')) {
                       if (machineIds.includes(currhome)) {
                           athome = 1;
                       }
                   }
               }
           } else {
               const roleinfo = location.split('___');
               role = encodeURIComponent(roleinfo[0]+'./'+roleinfo[1]);
               if (document.getElementById('rolehome_coauthor_'+roleinfo[1]+'_'+roleinfo[0])) {
                   var currhome = document.getElementById('rolehome_coauthor_'+roleinfo[1]+'_'+roleinfo[0]).value;
                   if ((currhome != '') && (currhome != null) && (currhome != 'undefined')) {
                       if (machineIds.includes(currhome)) {
                           athome = 1;
                       }
                   }
               }
           }
           if (athome) {
               if (document.getElementById('stdprobswitch')) {
                   document.getElementById('stdprobswitch').style.display = 'none';
               }
               if (document.getElementById('newstdproblem')) {
                   document.getElementById('newstdproblem').style.display = 'none';
               }
               var http = new XMLHttpRequest();
               var url = "/adm/courseauthor";
               var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir;
               http.open("POST", url, true);
               http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
               http.onreadystatechange = function() {
                   if (http.readyState == 4 && http.status == 200) {
                       var data = JSON.parse(http.responseText);
                       if (Array.isArray(data.dirs)) {
                           var len = data.dirs.length;
                           if (len) {
                               if (len > 1) {
                                   selelem.options[selelem.options.length] = new Option('$js_lt{sele}','');
                               }
                           }
                           if (len) {
                               var j;
                               for (j = 0; j < len; j++) {
                                   selelem.options[selelem.options.length] = new Option(data.dirs[j],data.dirs[j]);
                               }
                               selelem.selectedIndex = 0;
                           }
                       }
                   }
               }
               http.send(params);
           } else {
               selelem.options[selelem.options.length] = new Option('$js_lt{swit}','switch');
               selelem.selectedIndex = 0;
               if (document.getElementById('stdprobswitch')) {
                   document.getElementById('stdprobswitch').style.display = 'block';
               }
               if (document.getElementById('newstdproblem')) {
                   document.getElementById('newstdproblem').style.display = 'none';
               }
           }
       }
       return;
   }
   
   function switchForProb() {
       if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') {
           var url = '/adm/switchserver?otherserver=';
           var newhostid = '';
           var role = '';
           var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value;
           if (selloc == 'author') {
               newhostid = document.courseresform.rolehome_author.value;
               role = "au./&js_escape($env{'user.domain'})/";
           } else if (selloc == 'course') {
               newhostid = document.courseresform.rolehome_course.value;
               role = "&js_escape($env{'request.role'})";
           } else {
               var items = new Array();
               items = selloc.split('___');
               var len = document.courseresform.rolehome_coauthor.length;
               if (null == len) {
                   var currval = document.courseresform.rolehome_coauthor.value;
                   if (null != currval) {
                       var info = new Array();
                       info = currval.split('=');
                       newhostid = info[2];
                       role = info[0]+'./'+info[1];
                   }
               } else {
                   for (var i=0; i<len; i++) {
                       var currval = document.courseresform.rolehome_coauthor[i].value;
                       if (null != currval) {
                           var info = new Array();
                           info = currval.split('=');
                           if ((info[1] == items[1]+'/'+items[0]) && (info[0] == items[2])) {
                               newhostid = info[2];
                               role = info[0]+'./'+info[1];
                               break;
                           }
                       }
                   }
               }
           }
           if (newhostid != '') {
               url += newhostid;
               if (role != '') {
                   url += '&role='+role;
               }
               document.location.href = url;
           }
       }
       return;
   }
   
 function makeims(imsform) {  function makeims(imsform) {
     if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {      if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {
         alert("$js_lt{'imsfile'}");          alert("$js_lt{'imsfile'}");
Line 8524  function validImportCrsRes() { Line 8861  function validImportCrsRes() {
         url += fname;          url += fname;
     }      }
     var title = document.crsresimportform.crsrestitle.value;      var title = document.crsresimportform.crsrestitle.value;
     document.crsresimportform.importdetail.value=escape(title)+'='+escape(url);      document.crsresimportform.importdetail.value=encodeURIComponent(title)+'='+encodeURIComponent(url);
     return true;      return true;
 }  }
   

Removed from v.1.660  
changed lines
  Added in v.1.693


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

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

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

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