Diff for /loncom/interface/londocs.pm between versions 1.683 and 1.700

version 1.683, 2022/10/19 02:10:20 version 1.700, 2023/07/11 12:44:18
Line 45  use Apache::lontemplate(); Line 45  use Apache::lontemplate();
 use Apache::lonsimplepage();  use Apache::lonsimplepage();
 use Apache::lonhomework();  use Apache::lonhomework();
 use Apache::lonpublisher();  use Apache::lonpublisher();
 use Apache::lonparmset();  
 use Apache::loncourserespicker();  use Apache::loncourserespicker();
 use HTML::Entities;  use HTML::Entities;
 use HTML::TokeParser;  use HTML::TokeParser;
Line 183  sub default_folderpath { Line 182  sub default_folderpath {
     }      }
 }  }
   
 sub validate_folderpath {  sub validate_supppath {
     my ($supplementalflag) = @_;      my ($coursenum,$coursedom) = @_;
     if ($env{'form.folderpath'} ne '') {      my $backto;
         my @items = split(/\&/,$env{'form.folderpath'});  
         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'});  
         }  
     }  
     return;  
 }  
   
 sub validate_suppath {  
     if ($env{'form.supppath'} ne '') {      if ($env{'form.supppath'} ne '') {
         my @items = split(/\&/,$env{'form.supppath'});          my @items = split(/\&/,$env{'form.supppath'});
         my $badpath;          my ($badpath,$got_supp,$supppath,%supphidden,%suppids);
         for (my $i=0; $i<@items; $i++) {          for (my $i=0; $i<@items; $i++) {
             my $odd = $i%2;              my $odd = $i%2;
             if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {              if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {
                 $badpath = 1;                  $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];
             }              }
             last if ($badpath);  
         }          }
         if ($badpath) {          if ($badpath) {
             delete($env{'form.supppath'});              delete($env{'form.supppath'});
           } else {
               $supppath =~ s/^\&//;
               $backto =~ s/^\&//;
               $env{'form.supppath'} = $supppath;
         }          }
     }      }
     return;      return $backto;
 }  }
   
 sub dumpcourse {  sub dumpcourse {
Line 700  sub group_import { Line 718  sub group_import {
                 $url = $1;                  $url = $1;
                 my $marker = $2;                  my $marker = $2;
                 my $info = $3;                  my $info = $3;
                 my ($toolid,%toolhash,%toolsettings);                  my ($toolid,$toolprefix,$tooltype,%toolhash,%toolsettings);
                 my @extras = ('linktext','explanation','crslabel','crstitle','crsappend');                  my @extras = ('linktext','explanation','crslabel','crstitle','crsappend');
                 my @toolinfo = split(/:/,$info);                  my @toolinfo = split(/:/,$info);
                 if ($residx) {                  if ($residx) {
Line 709  sub group_import { Line 727  sub group_import {
                 } else {                  } else {
                     $toolid = shift(@toolinfo);                      $toolid = shift(@toolinfo);
                 }                  }
                   if ($toolid =~ /^c/) {
                       $tooltype = 'crs';
                       $toolprefix = 'c';
                   } else {
                       $tooltype = 'dom';
                   }
                 $toolid =~ s/\D//g;                  $toolid =~ s/\D//g;
                 ($toolhash{'target'},$toolhash{'width'},$toolhash{'height'},                  ($toolhash{'target'},$toolhash{'width'},$toolhash{'height'},
                  $toolhash{'linktext'},$toolhash{'explanation'},$toolhash{'crslabel'},                   $toolhash{'linktext'},$toolhash{'explanation'},$toolhash{'crslabel'},
Line 722  sub group_import { Line 746  sub group_import {
                     $toolhash{'gradable'} =~ s/\D+//g;                      $toolhash{'gradable'} =~ s/\D+//g;
                 }                  }
                 if (ref($ltitoolsref) eq 'HASH') {                  if (ref($ltitoolsref) eq 'HASH') {
                     if (ref($ltitoolsref->{$toolid}) eq 'HASH') {                      if (ref($ltitoolsref->{$tooltype}) eq 'HASH') {
                         my @deleted;                          if (ref($ltitoolsref->{$tooltype}->{$toolid}) eq 'HASH') {
                         $toolhash{'id'} = $toolid;                              my %tools = %{$ltitoolsref->{$tooltype}->{$toolid}};
                         if (($toolhash{'target'} eq 'iframe') || ($toolhash{'target'} eq 'tab') ||                              my @deleted;
                             ($toolhash{'target'} eq 'window')) {                              $toolhash{'id'} = $toolprefix.$toolid;
                             if ($toolhash{'target'} eq 'window') {                              if (($toolhash{'target'} eq 'iframe') || ($toolhash{'target'} eq 'tab') ||
                                 foreach my $item ('width','height') {                                  ($toolhash{'target'} eq 'window')) {
                                     $toolhash{$item} =~ s/^\s+//;                                  if ($toolhash{'target'} eq 'window') {
                                     $toolhash{$item} =~ s/\s+$//;                                      foreach my $item ('width','height') {
                                     if ($toolhash{$item} =~ /\D/) {                                          $toolhash{$item} =~ s/^\s+//;
                                         delete($toolhash{$item});                                          $toolhash{$item} =~ s/\s+$//;
                                         if ($residx) {                                          if ($toolhash{$item} =~ /\D/) {
                                             if ($toolsettings{$item}) {                                              delete($toolhash{$item});
                                                 push(@deleted,$item);                                              if ($residx) {
                                                   if ($toolsettings{$item}) {
                                                       push(@deleted,$item);
                                                   }
                                             }                                              }
                                         }                                          }
                                     }                                      }
                                 }                                  }
                             }                              } elsif ($residx) {
                         } elsif ($residx) {                                  $toolhash{'target'} = $toolsettings{'target'};
                             $toolhash{'target'} = $toolsettings{'target'};                                  if ($toolhash{'target'} eq 'window') {
                             if ($toolhash{'target'} eq 'window') {                                      foreach my $item ('width','height') {
                                 foreach my $item ('width','height') {                                          $toolhash{$item} = $toolsettings{$item};
                                     $toolhash{$item} = $toolsettings{$item};                                      }
                                   }
                               } elsif (ref($tools{'display'}) eq 'HASH') {
                                   $toolhash{'target'} = $tools{'display'}{'target'};
                                   if ($toolhash{'target'} eq 'window') {
                                       $toolhash{'width'} = $tools{'display'}{'width'};
                                       $toolhash{'height'} = $tools{'display'}{'height'};
                                 }                                  }
                             }                              }
                         } elsif (ref($ltitoolsref->{$toolid}->{'display'}) eq 'HASH') {                              if ($toolhash{'target'} eq 'iframe') {
                             $toolhash{'target'} = $ltitoolsref->{$toolid}->{'display'}->{'target'};                                  foreach my $item ('width','height','linktext','explanation') {
                             if ($toolhash{'target'} eq 'window') {                                      delete($toolhash{$item});
                                 $toolhash{'width'} = $ltitoolsref->{$toolid}->{'display'}->{'width'};                                      if ($residx) {
                                 $toolhash{'height'} = $ltitoolsref->{$toolid}->{'display'}->{'height'};                                          if ($toolsettings{$item}) {
                             }                                              push(@deleted,$item);
                         }                                          }
                         if ($toolhash{'target'} eq 'iframe') {  
                             foreach my $item ('width','height','linktext','explanation') {  
                                 delete($toolhash{$item});  
                                 if ($residx) {  
                                     if ($toolsettings{$item}) {  
                                         push(@deleted,$item);  
                                     }                                      }
                                 }                                  }
                             }                              } elsif ($toolhash{'target'} eq 'tab') {
                         } elsif ($toolhash{'target'} eq 'tab') {                                  foreach my $item ('width','height') {
                             foreach my $item ('width','height') {                                      delete($toolhash{$item});
                                 delete($toolhash{$item});                                      if ($residx) {
                                 if ($residx) {                                          if ($toolsettings{$item}) {
                                     if ($toolsettings{$item}) {                                              push(@deleted,$item);
                                         push(@deleted,$item);                                          }
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                              if (ref($tools{'crsconf'}) eq 'HASH') {
                         if (ref($ltitoolsref->{$toolid}->{'crsconf'}) eq 'HASH') {                                  foreach my $item ('label','title','linktext','explanation') {
                             foreach my $item ('label','title','linktext','explanation') {                                      my $crsitem;
                                 my $crsitem;                                      if (($item eq 'label') || ($item eq 'title')) {
                                 if (($item eq 'label') || ($item eq 'title')) {                                          $crsitem = 'crs'.$item;
                                     $crsitem = 'crs'.$item;                                      } else {
                                 } else {                                          $crsitem = $item;
                                     $crsitem = $item;                                      }
                                 }                                      if ($tools{'crsconf'}{$item}) {
                                 if ($ltitoolsref->{$toolid}->{'crsconf'}->{$item}) {                                          $toolhash{$crsitem} =~ s/^\s+//;
                                     $toolhash{$crsitem} =~ s/^\s+//;                                          $toolhash{$crsitem} =~ s/\s+$//;
                                     $toolhash{$crsitem} =~ s/\s+$//;                                          if ($toolhash{$crsitem} eq '') {
                                     if ($toolhash{$crsitem} eq '') {                                              delete($toolhash{$crsitem});
                                           }
                                       } else {
                                         delete($toolhash{$crsitem});                                          delete($toolhash{$crsitem});
                                     }                                      }
                                 } else {                                      if (($residx) && (exists($toolsettings{$crsitem}))) {
                                     delete($toolhash{$crsitem});                                          unless (exists($toolhash{$crsitem})) {
                                 }                                              push(@deleted,$crsitem);
                                 if (($residx) && (exists($toolsettings{$crsitem}))) {                                          }
                                     unless (exists($toolhash{$crsitem})) {  
                                         push(@deleted,$crsitem);  
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                              if ($toolhash{'passback'}) {
                         if ($toolhash{'passback'}) {                                  my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                             my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4);                                  $toolhash{'gradesecret'} = $gradesecret;
                             $toolhash{'gradesecret'} = $gradesecret;                                  $toolhash{'gradesecretdate'} = time;
                             $toolhash{'gradesecretdate'} = time;  
                         }  
                         if ($toolhash{'roster'}) {  
                             my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4);  
                             $toolhash{'rostersecret'} = $rostersecret;  
                             $toolhash{'rostersecretdate'} = time;  
                         }  
                         my $changegradable;  
                         if (($residx) && ($folder =~ /^default/)) {  
                             if ($toolsettings{'gradable'}) {  
                                 unless (($toolhash{'gradable'}) || (defined($LONCAPA::map::zombies[$residx]))) {  
                                     push(@deleted,'gradable');  
                                     $changegradable = 1;  
                                 }  
                             } elsif ($toolhash{'gradable'}) {  
                                 $changegradable = 1;  
                             }                              }
                             if (($caller eq 'londocs') && (defined($LONCAPA::map::zombies[$residx]))) {                              if ($toolhash{'roster'}) {
                                 $changegradable = 1;                                  my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                                   $toolhash{'rostersecret'} = $rostersecret;
                                   $toolhash{'rostersecretdate'} = time;
                               }
                               my $changegradable;
                               if (($residx) && ($folder =~ /^default/)) {
                                 if ($toolsettings{'gradable'}) {                                  if ($toolsettings{'gradable'}) {
                                     $toolhash{'gradable'} = 1;                                      unless (($toolhash{'gradable'}) || (defined($LONCAPA::map::zombies[$residx]))) {
                                           push(@deleted,'gradable');
                                           $changegradable = 1;
                                       }
                                   } elsif ($toolhash{'gradable'}) {
                                       $changegradable = 1;
                                   }
                                   if (($caller eq 'londocs') && (defined($LONCAPA::map::zombies[$residx]))) {
                                       $changegradable = 1;
                                       if ($toolsettings{'gradable'}) {
                                           $toolhash{'gradable'} = 1;
                                       }
                                 }                                  }
                             }                              }
                         }                              my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum);
                         my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum);                              if ($putres eq 'ok') {
                         if ($putres eq 'ok') {                                  if (@deleted) {
                             if (@deleted) {                                      &Apache::lonnet::del('exttool_'.$marker,\@deleted,$coursedom,$coursenum);
                                 &Apache::lonnet::del('exttool_'.$marker,\@deleted,$coursedom,$coursenum);  
                             }  
                             if (($changegradable) && ($folder =~ /^default/)) {  
                                 my $val;  
                                 if ($toolhash{'gradable'}) {  
                                     $val = 'yes';  
                                 } else {  
                                     $val = 'no';  
                                 }                                  }
                                 &LONCAPA::map::storeparameter($residx,'parameter_0_gradable',$val,                                  if (($changegradable) && ($folder =~ /^default/)) {
                                                               'string_yesno');                                      my $val;
                                 &remember_parms($residx,'gradable','set',$val);                                      if ($toolhash{'gradable'}) {
                                           $val = 'yes';
                                       } else {
                                           $val = 'no';
                                       }
                                       &LONCAPA::map::storeparameter($residx,'parameter_0_gradable',$val,
                                                                     'string_yesno');
                                       &remember_parms($residx,'gradable','set',$val);
                                   }
                               } else {
                                   return (&mt('Failed to save update to external tool.'),1);
                             }                              }
                         } else {  
                             return (&mt('Failed to save update to external tool.'),1);  
                         }                          }
                     }                      }
                 }                  }
Line 1188  sub docs_change_log { Line 1215  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{/([^/]+)$});
               } elsif ($is_supp) {
                   $title = &Apache::loncommon::parse_supplemental_title($title);
               }
               $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 2623  sub url_paste_fixups { Line 2656  sub url_paste_fixups {
                     if ($is_exttool) {                      if ($is_exttool) {
                         $exttoolchg = 1;                          $exttoolchg = 1;
                     }                      }
                 } elsif (($rem =~ m{\d+/ext\.tool$}) &&                  } elsif (($is_exttool) &&
                          ($env{'form.docs.markedcopy_options'} ne 'move')) {                           ($env{'form.docs.markedcopy_options'} ne 'move')) {
                     $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                     $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;                      $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
Line 3090  sub update_parameter { Line 3123  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 3277  sub editor { Line 3310  sub editor {
         return $errtext if ($fatal);          return $errtext if ($fatal);
     }      }
   
     my (%supphidden,%suppids,$suppmapid);  
   
     if ($#LONCAPA::map::order<1) {      if ($#LONCAPA::map::order<1) {
  my $idx=&LONCAPA::map::getresidx();   my $idx=&LONCAPA::map::getresidx();
  if ($idx<=0) { $idx=1; }   if ($idx<=0) { $idx=1; }
         $LONCAPA::map::order[0]=$idx;          $LONCAPA::map::order[0]=$idx;
         $LONCAPA::map::resources[$idx]='';          $LONCAPA::map::resources[$idx]='';
     } elsif ($supplementalflag && !$allowed) {  
         my ($supplemental) = &Apache::lonnet::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'}};  
             }  
         }  
         if ($folder eq 'supplemental') {  
             $suppmapid = 0;  
         } elsif ($folder =~ /^supplemental_(\d+)$/) {  
             $suppmapid = $1;  
         }  
     }      }
   
 # ------------------------------------------------------------ Process commands  # ------------------------------------------------------------ Process commands
Line 3559  sub editor { Line 3575  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 3583  sub editor { Line 3614  sub editor {
         }          }
   
         if (($supplementalflag) && (!$allowed) && (!$env{'request.role.adv'})) {          if (($supplementalflag) && (!$allowed) && (!$env{'request.role.adv'})) {
             next if ($supphidden{$suppmapid.':'.$res});              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);
                               \%supphidden,\%suppids,$suppmapid);  
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
Line 3720  sub multiple_check_form { Line 3753  sub multiple_check_form {
     return unless (ref($listsref) eq 'HASH');      return unless (ref($listsref) eq 'HASH');
     my $disabled;      my $disabled;
     unless ($canedit) {      unless ($canedit) {
         $disabled = 'disabled="disabled"';           $disabled = ' disabled="disabled"';
     }      }
     my $output =      my $output =
     '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'.      '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'.
Line 3758  sub multiple_check_form { Line 3791  sub multiple_check_form {
             '</label></span></td>'."\n".              '</label></span></td>'."\n".
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak LC_docs_copy">'.              '<span class="LC_nobreak LC_docs_copy">'.
             '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')"'. $disabled.' />'.&mt('Copy').              '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')"'.$disabled.' />'.&mt('Copy').
             '</label></span></td>'.              '</label></span></td>'.
             '</tr></table>'."\n";              '</tr></table>'."\n";
     }      }
Line 3972  sub is_supplemental_title { Line 4005  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)=@_;
         $supphidden,$suppids,$suppmapid)=@_;      my ($foldertitle,$renametitle,$oldtitle,$encodedtitle);
     my ($foldertitle,$renametitle,$oldtitle);  
     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 4205  END Line 4239  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 4223  END Line 4258  END
                 $url='/adm/supplemental?';                  $url='/adm/supplemental?';
             }              }
  } else {   } else {
     &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);      $plainurl = $url;
  }   }
     }      }
   
Line 4273  END Line 4308  END
                     $nomodal = 1;                      $nomodal = 1;
                 }                  }
             }              }
             my ($checkencrypt,$shownurl);              my $checkencrypt;
             if (!$env{'request.role.adv'}) {              if (!$env{'request.role.adv'}) {
                 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)) {
Line 4293  END Line 4328  END
                 my $currenc = $env{'request.enc'};                  my $currenc = $env{'request.enc'};
                 $env{'request.enc'} = 1;                  $env{'request.enc'} = 1;
                 $shownsymb = &Apache::lonenc::encrypted($symb);                  $shownsymb = &Apache::lonenc::encrypted($symb);
                 $shownurl = &Apache::lonenc::encrypted($url);                  my $shownurl = &Apache::lonenc::encrypted($url);
                 if (&Apache::lonnet::symbverify($symb,$url)) {                  if (&Apache::lonnet::symbverify($symb,$url)) {
                     $url = $shownurl;                      $url = $shownurl;
                 } else {                  } else {
Line 4308  END Line 4343  END
                         $url = &Apache::lonnet::clutter($url);                          $url = &Apache::lonnet::clutter($url);
                     }                      }
                 }                  }
                 $shownurl = $url;              } else {
                   $url = '';
             }              }
             unless ($env{'request.role.adv'}) {              unless ($env{'request.role.adv'}) {
                 if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {                  if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
Line 4319  END Line 4355  END
                     $hiddenres = 1;                      $hiddenres = 1;
                 }                  }
             }              }
             if ($url ne '') {              if (($url ne '') && ($shownsymb ne '')) {
                 $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);                  $url .= (($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
             }              }
  }   }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
Line 4349  END Line 4385  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 4360  END Line 4412  END
         if (!$allowed && $supplementalflag) {          if (!$allowed && $supplementalflag) {
             $folderpath.=$containerarg.'&'.$foldername;              $folderpath.=$containerarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);              $url.='folderpath='.&escape($folderpath);
             if (ref($supphidden) eq 'HASH') {              if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                 if ($supphidden->{$suppmapid.':'.$residx}) {                  $hiddenfolder = 1;
                     $hiddenfolder = 1;  
                 }  
             }              }
         } else {          } else {
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,              my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
Line 4450  $form_end; Line 4500  $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 4458  $form_end; Line 4508  $form_end;
         if ($anchor ne '') {          if ($anchor ne '') {
             $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');              $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');
         }          }
         if (ref($supphidden) eq 'HASH') {  
             if ($supphidden->{$suppmapid.':'.$residx}) {  
                 $hiddenres = 1;  
             }  
         }  
     }      }
     my ($tdalign,$tdwidth);      my ($tdalign,$tdwidth);
     if ($allowed) {      if ($allowed) {
Line 4521  $form_end; Line 4566  $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 4538  $form_end; Line 4592  $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 4550  $form_end; Line 4611  $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) {         if (!$allowed && $supplementalflag && $canedit && $isfolder) {
            my $editicon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';             my $editicon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';
            my $editurl = $url;             my $editurl = $url;
Line 4563  $form_end; Line 4628  $form_end;
            $line.= ' <span class="LC_warning">('.&mt('hidden').')</span> ';             $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 4582  $form_end; Line 4649  $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 ($uploaded && $url && !$isfolder && !$ispage) {
           if (($plainurl ne '') && ($env{'request.role.adv'} || $allowed || !$hiddenres)) {
               &Apache::lonnet::allowuploaded('/adm/coursedoc',$plainurl);
           }
       }
     if ($allowed) {      if ($allowed) {
         my %lt=&Apache::lonlocal::texthash(          my %lt=&Apache::lonlocal::texthash(
                               'hd' => 'Hidden',                                'hd' => 'Hidden',
Line 4589  $form_end; Line 4661  $form_end;
         my ($enctext,$hidtext,$formhidden,$formurlhidden);          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->{'hiddenresource'}) eq 'ARRAY')) {
                 push(@{$filtersref->{'hiddenresource'}},$orderidx);                  push(@{$filtersref->{'hiddenresource'}},$orderidx);
             }              }
         }          }
Line 5644  sub handler { Line 5716  sub handler {
     if ($env{'form.tools'}) { $toolsflag=1; }      if ($env{'form.tools'}) { $toolsflag=1; }
   
     if ($env{'form.folderpath'} ne '') {      if ($env{'form.folderpath'} ne '') {
         &validate_folderpath($supplementalflag);          &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
     }      }
   
       my $backto_supppath;
     if ($env{'form.supppath'} ne '') {      if ($env{'form.supppath'} ne '') {
         &validate_suppath();          if ($supplementalflag && $allowed) {
               $backto_supppath = &validate_supppath($coursenum,$coursedom);
           }
     }      }
   
     my $script='';      my $script='';
Line 5658  sub handler { Line 5733  sub handler {
     my $containertag;      my $containertag;
     my $pathitem;      my $pathitem;
     my %ltitools;      my %ltitools;
       my $posslti;
     my $hiddentop;      my $hiddentop;
     my $navmap;      my $navmap;
     my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };      my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };
Line 5669  sub handler { Line 5745  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 5708  sub handler { Line 5784  sub handler {
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         }          }
         if ($env{'form.folderpath'} ne '') {          if ($env{'form.folderpath'} ne '') {
             &validate_folderpath($supplementalflag);              &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
         }          }
     }      }
         
Line 5724  sub handler { Line 5800  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 '') {
Line 5739  sub handler { Line 5815  sub handler {
             } 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 5838  sub handler { Line 5967  sub handler {
                 }                  }
             }              }
             my $tabidstr = join("','",@tabids);              my $tabidstr = join("','",@tabids);
             %ltitools = &Apache::lonnet::get_domain_lti($coursedom,'consumer');              my (%domtools,%crstools);
             my $posslti = keys(%ltitools);              my %tooltypes = &Apache::loncommon::usable_exttools();
               if ($tooltypes{'dom'}) {
                   %domtools = &Apache::lonnet::get_domain_lti($coursedom,'consumer');
               }
               if ($tooltypes{'crs'}) {
                   %crstools = &Apache::lonnet::get_course_lti($coursenum,$coursedom,'consumer');
               }
               %ltitools = (
                             dom => \%domtools,
                             crs => \%crstools,
                           );
               $posslti = scalar(keys(%domtools)) + scalar(keys(%crstools));
             my $hostname = $r->hostname();              my $hostname = $r->hostname();
     $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,      $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,
                                    $londocroot,$canedit,$hostname,\$navmap).                                     $londocroot,$canedit,$hostname,\$navmap).
Line 5847  sub handler { Line 5987  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 5872  sub handler { Line 6018  sub handler {
     if ($showdoc) {      if ($showdoc) {
         my $args;          my $args;
         if ($supplementalflag) {          if ($supplementalflag) {
             my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$env{'form.title'},1);              my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');
               my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
             $args = {'bread_crumbs' => $brcrum};              $args = {'bread_crumbs' => $brcrum};
         } else {          } else {
             $args = {'force_register' => $showdoc};              $args = {'force_register' => $showdoc};
Line 5931  sub handler { Line 6078  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 5942  sub handler { Line 6090  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 6010  sub handler { Line 6162  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 6030  sub handler { Line 6183  sub handler {
                 'dire' => 'Directory:',                  'dire' => 'Directory:',
                 'cate' => 'Category:',                  'cate' => 'Category:',
                 'tmpl' => 'Template:',                  'tmpl' => 'Template:',
                   'empd' => 'No resources found',
                 'comment' => 'Comment',                  'comment' => 'Comment',
                 'parse' => 'Upload embedded images/multimedia files if HTML file',                  'parse' => 'Upload embedded images/multimedia files if HTML file',
                 'bb5'      => 'Blackboard 5',                  'bb5'      => 'Blackboard 5',
Line 6168  FUFORM Line 6322  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;">
         <legend>$lt{'imcr'}</legend>          <legend>$lt{'imcr'}</legend>
           <div id="importcrsrescontent" style="display: none;">
         <input type="hidden" name="active" value="bb" />          <input type="hidden" name="active" value="bb" />
         $pickfile          $pickfile
         <p>          <p>
         $lt{'title'}: <input type="textbox" name="crsrestitle" value="" $disabled />          $lt{'title'}: <input type="text" 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 />
           </div>
           <div id="importcrsresempty" style="display: none;">
           <p>
           $lt{'empd'}
           </p>
           </div>
         </fieldset>          </fieldset>
         </form>          </form>
 CRSFORM  CRSFORM
Line 6204  CRSFORM Line 6365  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 6406  NROSTFORM Line 6567  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 6575  NWEBFORM Line 6665  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 6583  NWEBFORM Line 6673  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;
         <label><input type="radio" name="newsubdir" value="1" onclick="toggleNewsubdir(this.form);" $disabled />Yes</label>          <label><input type="radio" name="newsubdir" value="1" onclick="toggleNewsubdir(this.form);" $disabled />Yes</label>
         </span><span id="newsubdir"></span>          </span><span id="newsubdir"></span>
         <input type="hidden" name="newsubdirname" id="newsubdirname" value="" autocomplete="off" />          <input type="hidden" name="newsubdirname" id="newsubdirname" value="" autocomplete="off" />
           </div>
         </p>          </p>
         $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 6618  NWEBFORM Line 6710  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 6694  NGFFORM Line 6791  NGFFORM
         my @external = (          my @external = (
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleExternal(\'ext\');" />'=>$extresourcesform}          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleExternal(\'ext\');" />'=>$extresourcesform}
         );          );
         if (keys(%ltitools)) {          if ($posslti) {
             push(@external,              push(@external,
                  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleExternal(\'tool\');" />'=>$exttoolform},                   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleExternal(\'tool\');" />'=>$exttoolform},
             );              );
Line 6716  NGFFORM Line 6813  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 6766  unless ($container eq 'page') { Line 6863  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 6798  unless ($container eq 'page') { Line 6895  unless ($container eq 'page') {
  $pathitem   $pathitem
  <input type="hidden" name="cmd" value="upload_supplemental" />   <input type="hidden" name="cmd" value="upload_supplemental" />
         <input type='submit' value="$lt{'upld'}" />          <input type='submit' value="$lt{'upld'}" />
           </fieldset>
         </form>          </form>
 SUPDOCFORM  SUPDOCFORM
   
Line 6877  my @specialdocs = ( Line 6975  my @specialdocs = (
         my @supexternal = (          my @supexternal = (
             {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleExternal(\'suppext\')" />'              {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleExternal(\'suppext\')" />'
              =>$supextform});               =>$supextform});
         if (keys(%ltitools)) {          if ($posslti) {
             push(@supexternal,              push(@supexternal,
                  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleExternal(\'supptool\')" />'                   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleExternal(\'supptool\')" />'
             =>$supexttoolform});              =>$supexttoolform});
Line 6903  my %suporderhash = ( Line 7001  my %suporderhash = (
                 $r->print('<p><span class="LC_error">'.$error.'</span></p>');                  $r->print('<p><span class="LC_error">'.$error.'</span></p>');
             }              }
             if ($suppchanges) {              if ($suppchanges) {
                 my %servers = &Apache::lonnet::internet_dom_servers($coursedom);                  &Apache::lonnet::update_supp_caches($coursedom,$coursenum);
                 my @ids=&Apache::lonnet::current_machine_ids();  
                 foreach my $server (keys(%servers)) {  
                     next if (grep(/^\Q$server\E$/,@ids));  
                     my $hashid=$coursenum.':'.$coursedom;  
                     my $cachekey = &escape('showsupp').':'.&escape($hashid);  
                     &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);  
                 }  
                 &Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom,1);  
                 &Apache::lonnet::count_supptools($coursenum,$coursedom,1);  
                 my $now = time;  
                 if ($env{'request.course.id'} eq $coursedom.'_'.$coursenum) {  
                     &Apache::lonnet::appenv({'request.course.suppupdated' => $now});  
                 }  
                 &Apache::lonnet::put('environment',{'internal.supplementalchange' => $now},  
                                      $coursedom,$coursenum);  
                 &Apache::lonnet::appenv(  
                     {'course.'.$coursedom.'_'.$coursenum.'.internal.supplementalchange' => $now});  
                 &Apache::lonnet::do_cache_new('suppchange',$coursedom.'_'.$coursenum,$now,600);  
                 undef($suppchanges);                  undef($suppchanges);
             }              }
         }          }
Line 7092  sub remove_archive { Line 7172  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 7366  sub editing_js { Line 7450  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 7377  sub editing_js { Line 7463  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 7729  function toggleMap(caller) { Line 7817  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 7803  function toggleNewsubdir(form) { Line 7885  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 7890  function getExample(width,height,scrolli Line 7986  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,0);
                     select1res_changed();                  if ((document.getElementById('importcrsrescontent')) &&
                       (document.getElementById('importcrsresempty'))) {
                       var selelem = document.crsresimportform.elements['coursepath'];
                       var numdirs = 0;
                       if (selelem.options.length) {
                           numdirs = selelem.options.length - 1;
                       }
                       if (numdirs) {
                           document.getElementById('importcrsrescontent').style.display='block';
                           document.getElementById('importcrsresempty').style.display='none';
                       } else {
                           document.getElementById('importcrsrescontent').style.display='none';
                           document.getElementById('importcrsresempty').style.display='block';
                       }
                 }                  }
             }              }
         }          }
Line 7908  function toggleImportCrsres(caller,dirco Line 8016  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+"&addtop=1";
               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;
                               if (len == 1) {
                                   toggleCrsResTitle();
                               }
                           }
                       }
                   }
               }
               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)) {

Removed from v.1.683  
changed lines
  Added in v.1.700


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