Diff for /loncom/interface/londocs.pm between versions 1.692 and 1.705

version 1.692, 2023/01/18 18:10:26 version 1.705, 2023/09/27 14:52:26
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 719  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 728  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 741  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'}) {
                         if ($toolhash{'roster'}) {                                  my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                             my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4);                                  $toolhash{'rostersecret'} = $rostersecret;
                             $toolhash{'rostersecret'} = $rostersecret;                                  $toolhash{'rostersecretdate'} = time;
                             $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]))) {                              my $changegradable;
                                 $changegradable = 1;                              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 1207  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 1405  sub print_paste_buffer { Line 1419  sub print_paste_buffer {
     }      }
   
     my @currpaste = split(/,/,$env{'docs.markedcopies'});      my @currpaste = split(/,/,$env{'docs.markedcopies'});
     my ($pasteitems,@pasteable);      my ($pasteitems,@pasteable,$same_institution,$checkedsameinst);
     my $clipboardcount = 0;      my $clipboardcount = 0;
   
 # Construct identifiers for current contents of user's paste buffer  # Construct identifiers for current contents of user's paste buffer
Line 1418  sub print_paste_buffer { Line 1432  sub print_paste_buffer {
             ($url ne '')) {              ($url ne '')) {
             $clipboardcount ++;              $clipboardcount ++;
             my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,              my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,
                 $canpaste,$nopaste,$othercrs,$areachange,$is_exttool);                  $canpaste,$nopaste,$othercrs,$areachange,$is_exttool,$toolcdom,
                   $toolcnum,$marker);
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];              my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
             if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {              if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {
                 $is_external = 1;                  $is_external = 1;
             } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {              } elsif ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
                   ($toolcdom,$toolcnum,$marker) = ($1,$2,$3);
                 $is_exttool = 1;                  $is_exttool = 1;
             }              }
             if ($folder =~ /^supplemental/) {              if ($folder =~ /^supplemental/) {
Line 1460  sub print_paste_buffer { Line 1476  sub print_paste_buffer {
                     if ($cid ne $env{'request.course.id'}) {                      if ($cid ne $env{'request.course.id'}) {
                         my ($srcdom,$srcnum) = split(/_/,$cid);                          my ($srcdom,$srcnum) = split(/_/,$cid);
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {                          if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                             if (($is_exttool) && ($srcdom ne $coursedom)) {                              if ($is_exttool) {
                                 $canpaste = 0;                                  if ($toolcdom ne $coursedom) {
                                 $nopaste = &mt('Paste from another domain unavailable.');                                      $canpaste = 0;
                             } else {                                      $nopaste = &mt('Paste from another domain unavailable.');
                                 $othercrs = '<br />'.&mt('(from another course)');                                  } elsif ($toolcnum ne $coursenum) {
                                       my %toolsettings =
                                           &Apache::lonnet::dump('exttool_'.$marker,$toolcdom,$toolcnum);
                                       my %tooltypes = &Apache::loncommon::usable_exttools();
                                       if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) ||
                                           (($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) {
                                           $canpaste = 0;
                                           $nopaste = &mt('Paste from another course unavailable.');
                                       } elsif ($toolsettings{'id'} =~ /^c\d+$/) {
                                           unless ($checkedsameinst) {
                                               my $primary_id = &Apache::lonnet::domain($coursedom,'primary');
                                               my $intdom = &Apache::lonnet::internet_dom($primary_id);
                                               if ($intdom ne '') {
                                                   my $internet_names =
                                                       &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'});
                                                   if (ref($internet_names) eq 'ARRAY') {
                                                       if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                                                           $same_institution = 1;
                                                       }
                                                   }
                                               }
                                               $checkedsameinst = 1;
                                           }
                                           if ($same_institution) {
                                               $othercrs = '<br />'.&mt('(from another course)');
                                           } else {
                                               $nopaste = &mt('Paste from another course unavailable.');
                                           }
                                       } else {
                                           $othercrs = '<br />'.&mt('(from another course)');
                                       }
                                   }
                             }                              }
                         } else {                          } else {
                             $canpaste = 0;                              $canpaste = 0;
                             $nopaste = &mt('Paste from another course unavailable.');                              $nopaste = &mt('Paste from another course unavailable.');
                         }                          }
                     }                      }
                   } elsif ($url =~ m{/res/($match_domain)/($match_username)/}) {
                       my ($audom,$auname) = ($1,$2);
                       unless (($auname eq $coursenum) && ($audom eq $coursedom)) {
                           if (&Apache::lonnet::is_course($audom,$auname)) {
                               $canpaste = 0;
                               $nopaste = &mt('Paste from another course unavailable.');
                           }
                       }
                 }                  }
                 if ($canpaste) {                  if ($canpaste) {
                     push(@pasteable,$suffix);                      push(@pasteable,$suffix);
Line 1763  sub do_paste_from_buffer { Line 1818  sub do_paste_from_buffer {
         return();          return();
     }      }
   
     my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom,%duplicate,      my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom,
         %prefixchg,%srcdom,%srcnum,%srcmapidx,%marktomove,$save_err,$lockerrors,$allresult);          %othcrstool,%othcrsres,%duplicate,%prefixchg,%srcdom,%srcnum,%srcmapidx,
           %marktomove,$save_err,$lockerrors,$allresult,%currcrsltitools,
           %currltititles,$currltimax,$gotcrsltitools);
       $currltimax = 0;
       $gotcrsltitools = 0;
     foreach my $suffix (@topaste) {      foreach my $suffix (@topaste) {
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});          my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
         my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});          my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});
Line 1804  sub do_paste_from_buffer { Line 1862  sub do_paste_from_buffer {
                 }                  }
             }              }
 # When buffer was populated using an active role in a different course  # When buffer was populated using an active role in a different course
 # disallow pasting of External Tool if course is in a different domain.  # disallow pasting of External Tool if course is in a different domain,
             if (($url =~ m{/ext\.tool$}) && ($srcd ne $coursedom)) {  # or if External Tool use is not permitted in this course.
                 $notindom{$suffix} = 1;              if ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
                 next;                  my ($toolcdom,$toolcnum,$marker) = ($1,$2,$3);
                   if ($toolcdom ne $coursedom) {
                       $notindom{$suffix} = 1;
                       next;
                   } elsif ($toolcnum ne $coursenum) {
                       my %toolsettings =
                           &Apache::lonnet::dump('exttool_'.$marker,$toolcdom,$toolcnum);
                       my %tooltypes = &Apache::loncommon::usable_exttools();
                       if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) ||
                           (($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) {
                           $othcrstool{$suffix} = 1;
                           next;
                       }
                       if ($toolsettings{'id'} =~ /^c\d+$/) {
                           unless ($gotcrsltitools) {
                               %currcrsltitools =
                                   &Apache::lonnet::get_course_lti($coursenum,$coursedom,'consumer');
                               foreach my $item (sort(keys(%currcrsltitools))) {
                                   if (ref($currcrsltitools{$item}) eq 'HASH') {
                                       $currltimax ++;
                                       if (ref($currltititles{$currcrsltitools{$item}{'title'}}) eq 'ARRAY') {
                                           push(@{$currltititles{$currcrsltitools{$item}{'title'}}},$item);
                                       } else {
                                           $currltititles{$currcrsltitools{$item}{'title'}} = [$item];
                                       }
                                   }
                               }
                               $gotcrsltitools = 1;
                           }
                       }
                   }
             }              }
             $srcdom{$suffix} = $srcd;              $srcdom{$suffix} = $srcd;
             $srcnum{$suffix} = $srcn;              $srcnum{$suffix} = $srcn;
           } elsif ($url =~ m{^/res/($match_domain)/($match_courseid)/}) {
               my ($audom,$auname) = ($1,$2);
   # When buffer was populated using an active role in a different course
   # disallow pasting of published resources from Course Authoring Space
               unless (($auname eq $coursenum) && ($audom eq $coursedom)) {
                   if (&Apache::lonnet::is_course($audom,$auname)) {
                       $othcrsres{$suffix} = 1;
                       next;
                   }
               }
         }          }
         $srcmapidx{$suffix} = $mapidx;          $srcmapidx{$suffix} = $mapidx;
         push(@dopaste,$suffix);          push(@dopaste,$suffix);
Line 1862  sub do_paste_from_buffer { Line 1960  sub do_paste_from_buffer {
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',                  notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',                  notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
                 notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',                  notindom  => 'Paste failed: Item is an external tool from a course in a different domain.',
                   othcrstool => 'Paste failed: Item is an external tool from a different course, for which use is not allowed in this course.',
                   othcrsres => 'Paste failed: Item is a course-authored resource from a different course',
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',                  duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
             );              );
   
Line 1890  sub do_paste_from_buffer { Line 1990  sub do_paste_from_buffer {
 # Retrieve information about all course maps in main content area   # Retrieve information about all course maps in main content area 
   
     my $allmaps = {};      my $allmaps = {};
     my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk);      my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk,
           @updatetoolsenc,$updatetoolscache,$checkedsameinst,
           $same_institution);
   
 # Loop over the items to paste  # Loop over the items to paste
     foreach my $suffix (@dopaste) {      foreach my $suffix (@dopaste) {
Line 1989  sub do_paste_from_buffer { Line 2091  sub do_paste_from_buffer {
                     $fromothercrs = 1;                      $fromothercrs = 1;
                     $info{'cdom'} = $srcdom{$suffix};                      $info{'cdom'} = $srcdom{$suffix};
                     $info{'cnum'} = $srcnum{$suffix};                      $info{'cnum'} = $srcnum{$suffix};
                       unless ($checkedsameinst) {
                           my $primary_id = &Apache::lonnet::domain($coursedom,'primary');
                           my $intdom = &Apache::lonnet::internet_dom($primary_id);
                           if ($intdom ne '') {
                               my $internet_names =
                                   &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'});
                               if (ref($internet_names) eq 'ARRAY') {
                                   if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                                       $same_institution = 1;
                                   }
                               }
                           }
                           $checkedsameinst = 1;
                       }
                 }                  }
             }              }
             unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) {              unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) {
                 my (%lockerr,$msg);                  my (%lockerr,$msg);
                 my ($newurl,$result,$errtext) =                  my ($newurl,$result,$errtext) =
                     &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);                      &dbcopy(\%info,$coursedom,$coursenum,\%lockerr,\%currltititles,
                               \$currltimax,\@updatetoolsenc,\$updatetoolscache,$same_institution);
                 if ($result eq 'ok') {                  if ($result eq 'ok') {
                     $url = $newurl;                      $url = $newurl;
                     $title=&mt('Copy of').' '.$title;                      $title=&mt('Copy of').' '.$title;
Line 2163  sub do_paste_from_buffer { Line 2280  sub do_paste_from_buffer {
             }              }
         }          }
     }      }
       if (($updatetoolscache) || (@updatetoolsenc)) {
           &update_ltitools_caches($coursedom,$coursenum,$updatetoolscache,
                                   \@updatetoolsenc);
       }
     &clear_from_buffer(\@toclear,\@currpaste);      &clear_from_buffer(\@toclear,\@currpaste);
     my $msgsarray;      my $msgsarray;
     foreach my $suffix (keys(%msgs)) {      foreach my $suffix (keys(%msgs)) {
Line 2211  sub clear_from_buffer { Line 2332  sub clear_from_buffer {
     return $numdel;      return $numdel;
 }  }
   
   sub update_ltitools_caches {
       my ($coursedom,$coursenum,$updatetoolscache,$updatetoolsenc) = @_;
       my $hashid=$coursedom.'_'.$coursenum;
       if ($updatetoolscache) {
           &Apache::lonnet::devalidate_cache_new('courseltitools',$hashid);
       }
       if ((ref($updatetoolsenc) eq 'ARRAY') &&
           (@{$updatetoolsenc})) {
           my @ids=&Apache::lonnet::current_machine_ids();
           my $updatedone;
           foreach my $lonhost (@{$updatetoolsenc}) {
               if (grep(/^\Q$lonhost\E$/,@ids)) {
                   unless ($updatedone) {
                       &Apache::lonnet::devalidate_cache_new('crsltitoolsenc',$hashid);
                   }
                   $updatedone = 1;
               } else {
                   &Apache::lonnet::remote_devalidate_cache($lonhost,["crsltitoolsenc:$hashid"]);
               }
           }
       }
       return;
   }
   
 sub get_newmap_url {  sub get_newmap_url {
     my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,      my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,
         $titleref,$allmaps,$newurls) = @_;          $titleref,$allmaps,$newurls) = @_;
Line 2272  sub get_newmap_url { Line 2417  sub get_newmap_url {
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;      my ($dbref,$coursedom,$coursenum,$lockerrorsref,$currltititles,
           $currltimax,$updatetoolsenc,$updatetoolscache,$same_institution) = @_;
     my ($url,$result,$errtext);      my ($url,$result,$errtext);
     if (ref($dbref) eq 'HASH') {      if (ref($dbref) eq 'HASH') {
         $url = $dbref->{'src'};          $url = $dbref->{'src'};
Line 2316  sub dbcopy { Line 2462  sub dbcopy {
                     my %contents=&Apache::lonnet::dump($db_name,                      my %contents=&Apache::lonnet::dump($db_name,
                                                        $dbref->{'cdom'},                                                         $dbref->{'cdom'},
                                                        $dbref->{'cnum'});                                                         $dbref->{'cnum'});
                       my ($toolcopyerror,$toolpassback,$toolroster,%toolinfo,$oldtoolid,$defincrs);
                       if ($url eq '/adm/'.$dbref->{'cdom'}.'/'.$dbref->{'cnum'}."/$marker/ext.tool") {
                           if ($contents{'id'} =~ /^(|c)(\d+)$/) {
                               $oldtoolid = $2;
                               if ($1 eq 'c') {
                                   $defincrs = 1;
                                   %toolinfo =
                                       &Apache::lonnet::get('ltitools',[$oldtoolid],$dbref->{'cdom'},$dbref->{'cnum'});
                               } else {
                                   %toolinfo= &Apache::lonnet::get_domain_lti($dbref->{'cdom'},'consumer');
                               }
                               if (ref($toolinfo{$oldtoolid}) eq 'HASH') {
                                   if ($toolinfo{$oldtoolid}{'passback'}) {
                                       $toolpassback = 1;
                                   }
                                   if ($toolinfo{$oldtoolid}{'roster'}) {
                                       $toolroster = 1;
                                   }
                               } else {
                                   $toolcopyerror = 1;
                                   $errtext = &mt('Could not retrieve original settings for pasted external tool.');
                               }
                           }
                           unless (($dbref->{'cnum'} eq $coursenum) && ($dbref->{'cdom'} eq $coursedom)) {
                               $url = "/adm/$coursedom/$coursenum/$marker/ext.tool";
                               if ($contents{'crstitle'} ne '') {
                                   $contents{'crstitle'} = $env{'course.'.$coursedom.'_'.$coursenum.'.description'};
                               }
                               if (($defincrs) && (!$toolcopyerror)) {
                                   my %newtool;
                                   my $oldcdom = $dbref->{'cdom'};
                                   my $oldcnum = $dbref->{'cnum'};
                                   my $title = $toolinfo{$oldtoolid}{'title'};
                                   if (ref($currltititles) eq 'HASH') {
                                       if (exists($currltititles->{$title})) {
                                           $title .= ' (copied from another course)';
                                       }
                                   }
                                   my ($newid,$iderror) =
                                       &Apache::lonnet::get_ltitools_id('course',$coursedom,$coursenum,$title);
                                   if ($newid =~ /^\d+$/) {
                                       %{$newtool{$newid}} = %{$toolinfo{$oldtoolid}};
                                       $newtool{$newid}{'title'} = $title;
                                       if (ref($currltimax)) {
                                           $newtool{$newid}{'order'} = $$currltimax;
                                       }
                                       if ($newtool{$newid}{'image'} =~ m{^\Q/uploaded/$oldcdom/$oldcnum/toollogo/$oldtoolid/\E([^/]+)$}) {
                                           my $fname = $1;
                                           my $content = &Apache::lonnet::getfile($newtool{$newid}{'image'});
                                           if ($content eq '-1') {
                                               delete($newtool{$newid}{'image'});
                                           } else {
                                               $env{'form.'.$suffix.'.image'} = $content;
                                               my $newlogo =
                                                   &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.image',"toollogo/$newid/$fname");
                                               delete($env{'form.'.$suffix.'.image'});
                                               if ($newlogo =~ m{^/uploaded/}) {
                                                   $newtool{$newid}{'image'} = $newlogo;
                                               } else {
                                                   delete($newtool{$newid}{'image'});
                                               }
                                           }
                                       }
                                       my $newusable;
                                       if ($same_institution) {
                                           my %oldtoolsenc = &Apache::lonnet::eget('nohist_toolsenc',[$oldtoolid],$oldcdom,$oldcnum);
                                           if (ref($oldtoolsenc{$oldtoolid}) eq 'HASH') {
                                               my %newtoolsenc;
                                               %{$newtoolsenc{$newid}} = %{$oldtoolsenc{$oldtoolid}};
                                               my $putres = &Apache::lonnet::put('nohist_toolsenc',\%newtoolsenc,$coursedom,$coursenum,1);
                                               if ($putres eq 'ok') {
                                                   if (ref($updatetoolsenc) eq 'ARRAY') {
                                                       my $newhome = &Apache::lonnet::homeserver($coursenum,$coursedom);
                                                       unless (grep(/^\Q$newhome\E$/,@{$updatetoolsenc})) {
                                                           push(@{$updatetoolsenc},$newhome);
                                                       }
                                                   }
                                                   $newusable = 1;
                                               }
                                           }
                                       }
                                       if ($newtool{$newid}{'usable'}) {
                                           unless ($newusable) {
                                               delete($newtool{$newid}{'usable'});
                                           }
                                       }
                                       my $putres = &Apache::lonnet::put('ltitools',\%newtool,$coursedom,$coursenum);
                                       if ($putres eq 'ok') {
                                           $contents{'id'} = "c$newid";
                                           if (ref($updatetoolscache)) {
                                               $$updatetoolscache ++;
                                           }
                                           if (ref($currltititles->{$title}) eq 'ARRAY') {
                                               push(@{$currltititles->{$title}},$newid);
                                           } else {
                                               $currltititles->{$title} = [$newid];
                                           }
                                           if (ref($currltimax)) {
                                               $$currltimax ++;
                                           }
                                       } else {
                                           $toolcopyerror = 1;
                                           $errtext = &mt('Unable to save external tool definition in Course Settings.');
                                       }
                                   } else {
                                       $toolcopyerror = 1;
                                       $errtext = &mt('Unable to retrieve new tool ID when adding external tool definition to Course Settings.');
                                   }
                               }
                           }
                       }
                     if (exists($contents{'uploaded.photourl'})) {                      if (exists($contents{'uploaded.photourl'})) {
                         my $photo = $contents{'uploaded.photourl'};                          my $photo = $contents{'uploaded.photourl'};
                         my ($subdir,$fname) =                          my ($subdir,$fname) =
Line 2335  sub dbcopy { Line 2592  sub dbcopy {
                         }                          }
                     }                      }
                     $db_name =~ s{_\d*$ }{_$suffix}x;                      $db_name =~ s{_\d*$ }{_$suffix}x;
                     if (($prefix eq 'exttool') && ($dbref->{'delgradable'}) && ($contents{'gradable'})) {                      if ($prefix eq 'exttool') {
                         delete($contents{'gradable'});                          unless ($toolcopyerror) {
                               foreach my $key ('oldgradesecret','gradesecret','gradesecretdate','oldrostersecret','rostersecret','rostersecretdate') {
                                   if (exists($contents{$key})) {
                                       delete($contents{$key});
                                   }
                               }
                               if ($dbref->{'delgradable'}) {
                                   if (exists($contents{'gradable'})) {
                                       delete($contents{'gradable'});
                                   }
                               }
                               if ($toolpassback) {
                                   if ($contents{'gradable'}) {
                                       my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                                       $contents{'gradesecret'} = $gradesecret;
                                       $contents{'gradesecretdate'} = time;
                                   }
                               }
                               if ($toolroster) {
                                   my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4);
                                   $contents{'rostersecret'} = $rostersecret;
                                   $contents{'rostersecretdate'} = time;
                               }
                           }
                     }                      }
                     $result=&Apache::lonnet::put($db_name,\%contents,                      if (($prefix eq 'exttool') && ($toolcopyerror)) {
                                                  $coursedom,$coursenum);                          $result = 'error';
                     if ($result eq 'ok') {                      } else {
                         $url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x;                          $result=&Apache::lonnet::put($db_name,\%contents,
                                                        $coursedom,$coursenum);
                           if ($result eq 'ok') {
                               $url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x;
                           }
                     }                      }
                 }                  }
                 if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {                  if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
Line 2496  sub contained_map_check { Line 2780  sub contained_map_check {
             if ($token->[1] eq 'resource') {              if ($token->[1] eq 'resource') {
                 next if ($token->[2]->{'type'} eq 'zombie');                  next if ($token->[2]->{'type'} eq 'zombie');
                 my $ressrc = $token->[2]->{'src'};                  my $ressrc = $token->[2]->{'src'};
                 if ($ressrc =~ m{^/adm/($match_domain)/$match_courseid/\d+/ext\.tool$}) {                  if ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) {
                     my $srcdom = $1;                      my ($srcdom,$srcnum,$marker) = ($1,$2,$3);
                     unless ($srcdom eq $coursedom) {                      unless ($srcdom eq $coursedom) {
                         $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                          $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         next;                          next;
                     }                      }
                       unless ($srcnum eq $coursenum) {
                           my %toolsettings =
                               &Apache::lonnet::dump('exttool_'.$marker,$srcdom,$srcnum);
                           my %tooltypes = &Apache::loncommon::usable_exttools();
                           if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) ||
                               (($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) {
                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                               next;
                           }
                       }
                 } elsif ($folder =~ /^supplemental/) {                  } elsif ($folder =~ /^supplemental/) {
                     unless (&supp_pasteable($ressrc)) {                      unless (&supp_pasteable($ressrc)) {
                         $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                          $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         next;                          next;
                     }                      }
                 }                  }
                   if ($ressrc =~ m{^/res/($match_domain)/($match_courseid)/}) {
                       my ($srcdom,$srcnum) = ($1,$2);
                       unless (($srcnum eq $coursenum) && ($srcdom eq $coursedom)) {
                           if (&Apache::lonnet::is_course($srcdom,$srcnum)) {
                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                               next;
                           }
                       }
                   }
                 if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) {                  if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) {
                     if ($1 eq 'uploaded') {                      if ($1 eq 'uploaded') {
                         $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc;                          $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc;
Line 2642  sub url_paste_fixups { Line 2945  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 2702  sub apply_fixups { Line 3005  sub apply_fixups {
         $oldurl,$url,$caller) = @_;          $oldurl,$url,$caller) = @_;
     my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,      my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,
         %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,          %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,
         %resdatacopy,%lockerrors,$lockmsg);          %resdatacopy,%lockerrors,$lockmsg,%currcrsltitools,$gotcrsltitools,
           %currltititles,$currltimax);
       $currltimax = 0;
     if (ref($updated) eq 'HASH') {      if (ref($updated) eq 'HASH') {
         if (ref($updated->{'rewrites'}) eq 'HASH') {          if (ref($updated->{'rewrites'}) eq 'HASH') {
             %rewrites = %{$updated->{'rewrites'}};              %rewrites = %{$updated->{'rewrites'}};
Line 2853  sub apply_fixups { Line 3158  sub apply_fixups {
                 }                  }
             }              }
         }          }
           my ($updatetoolscache,@updatetoolsenc,$same_institution,$checkedsameinst);
         foreach my $key (keys(%updates)) {          foreach my $key (keys(%updates)) {
             my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);              my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb);
             if (ref($rewrites{$key}) eq 'HASH') {              if (ref($rewrites{$key}) eq 'HASH') {
Line 2873  sub apply_fixups { Line 3179  sub apply_fixups {
             if (ref($dbcopies{$key}) eq 'HASH') {              if (ref($dbcopies{$key}) eq 'HASH') {
                 foreach my $idx (keys(%{$dbcopies{$key}})) {                  foreach my $idx (keys(%{$dbcopies{$key}})) {
                     if (ref($dbcopies{$key}{$idx}) eq 'HASH') {                      if (ref($dbcopies{$key}{$idx}) eq 'HASH') {
                           my $oldurl = $dbcopies{$key}{$idx}{'src'};
                           my $oldcdom = $dbcopies{$key}{$idx}{'cdom'};
                           my $oldcnum = $dbcopies{$key}{$idx}{'cnum'};
                           my $oldmarker;
                           if ($oldurl =~ m{^\Q/adm/$oldcdom/$oldcnum/\E(\d+)/ext\.tool$}) {
                               $oldmarker = $1;
                               unless (($gotcrsltitools) ||
                                       (($oldcnum eq $cnum) && ($oldcdom eq $cdom))) {
                                   my %oldtoolsettings=&Apache::lonnet::dump('exttool_'.$oldmarker,$oldcdom,$oldcnum);
                                   if ($oldtoolsettings{'id'} =~ /^c\d+$/) {
                                       unless ($gotcrsltitools) {
                                           %currcrsltitools =
                                               &Apache::lonnet::get_course_lti($cnum,$cdom,'consumer');
                                           foreach my $item (sort(keys(%currcrsltitools))) {
                                               if (ref($currcrsltitools{$item}) eq 'HASH') {
                                                   $currltimax ++;
                                                   if (ref($currltititles{$currcrsltitools{$item}{'title'}}) eq 'ARRAY') {
                                                       push(@{$currltititles{$currcrsltitools{$item}{'title'}}},$item);
                                                   } else {
                                                       $currltititles{$currcrsltitools{$item}{'title'}} = [$item];
                                                   }
                                               }
                                           }
                                           $gotcrsltitools = 1;
                                       }
                                       unless ($checkedsameinst) {
                                           my $primary_id = &Apache::lonnet::domain($cdom,'primary');
                                           my $intdom = &Apache::lonnet::internet_dom($primary_id);
                                           if ($intdom ne '') {
                                               my $internet_names =
                                                   &Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'});
                                               if (ref($internet_names) eq 'ARRAY') {
                                                   if (grep(/^\Q$intdom\E$/,@{$internet_names})) {
                                                       $same_institution = 1;
                                                   }
                                               }
                                           }
                                           $checkedsameinst = 1;
                                       }
                                   }
                               }
                           }
                         my ($newurl,$result,$errtext) =                          my ($newurl,$result,$errtext) =
                             &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors);                              &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors,\%currltititles,
                                       \$currltimax,\@updatetoolsenc,\$updatetoolscache,$same_institution);
                         if ($result eq 'ok') {                          if ($result eq 'ok') {
                             $newdb{$idx} = $newurl;                              $newdb{$idx} = $newurl;
                               if ($newurl =~ /ext\.tool$/) {
                                   if ($torewrite{$idx} eq "/adm/$oldcdom/$oldcnum/$oldmarker/ext.tool") {
                                       if ($newurl =~ m{^\Q/adm/$cdom/$cnum/\E(\d+)/ext.tool$}) {
                                           my $newmarker = $1;
                                           unless ($oldmarker eq $newmarker) {
                                               $torewrite{$idx} = "/adm/$oldcdom/$oldcnum/$newmarker/ext.tool";
                                           }
                                       }
                                   }
                               }
                         } elsif (ref($errors) eq 'HASH') {                          } elsif (ref($errors) eq 'HASH') {
                             $errors->{$key} = 1;                              $errors->{$key} = 1;
                         }                          }
Line 3015  sub apply_fixups { Line 3374  sub apply_fixups {
                 }                  }
             }              }
         }          }
           if (($updatetoolscache) || (@updatetoolsenc)) {
               &update_ltitools_caches($cdom,$cnum,$updatetoolscache,
                                       \@updatetoolsenc);
           }
     }      }
     return ('ok',\@msgs,$lockmsg);      return ('ok',\@msgs,$lockmsg);
 }  }
Line 3739  sub multiple_check_form { Line 4102  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 3777  sub multiple_check_form { Line 4140  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 4294  END Line 4657  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 4314  END Line 4677  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 4329  END Line 4692  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 4340  END Line 4704  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 4370  END Line 4734  END
                 }                  }
                 $nomodal = 1;                  $nomodal = 1;
             }              }
         } elsif (($uploaded) && (!$allowed) && ($url ne '/adm/supplemental?')) {          } elsif (($uploaded) && ($url ne '/adm/supplemental?') && ($url ne '/adm/coursedocs?')) {
             my $embstyle=&Apache::loncommon::fileembstyle($extension);              my $embstyle=&Apache::loncommon::fileembstyle($extension);
             unless ($embstyle eq 'ssi') {              unless ($embstyle eq 'ssi') {
                 if (($embstyle eq 'img')                  if (($embstyle eq 'img')
Line 4476  $form_common."\n". Line 4840  $form_common."\n".
 '<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'.  '<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'.
 $form_end;   $form_end; 
         }          }
     } elsif ($supplementalflag && !$allowed) {      } elsif ($supplementalflag) {
         my $isexttool;          my $isexttool;
         if ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {          if ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {
             $url='/adm/wrapper'.$url;              $url='/adm/wrapper'.$url;
Line 4539  $form_end; Line 4903  $form_end;
     } else {      } else {
         $reinit = &mt('(re-initialize course to access)');          $reinit = &mt('(re-initialize course to access)');
     }      }
     $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;      $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink.'</span>';
     if ($orig_url =~ /$LONCAPA::assess_re/) {      if ($orig_url =~ /$LONCAPA::assess_re/) {
         $line.= '<br />';          $line.= '<br />';
         if ($curralias ne '') {          if ($curralias ne '') {
Line 4550  $form_end; Line 4914  $form_end;
                    $lt{'sa'}.'</a></span>';                     $lt{'sa'}.'</a></span>';
         }          }
     }      }
     $line.='</td><td>';      $line.='</td><td><span class="LC_nobreak">';
     my ($link,$nolink);      my ($link,$nolink);
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
         if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) {          if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) {
Line 4571  $form_end; Line 4935  $form_end;
                $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&');                 $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&');
            }             }
        }         }
        if ((!$supplementalflag) && ($nomodal) && ($hostname ne '')) {         if (($nomodal) && ($hostname ne '')) {
            $link = 'http://'.$hostname.$url;             $link = 'http://'.$hostname.$url;
        } else {         } else {
            $link = $url;             $link = $url;
        }         }
        $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.$anchor);         my $inhibitmenu;
          if ((($supplementalflag) && ($allowed) && ($url =~ m{^/adm/wrapper/})) ||
              (($allowed) && (($url =~ m{^/adm/(viewclasslist|$match_domain/$match_username/aboutme)(\?|$)}) ||
                              ($url =~ m{^/public/$match_domain/$match_courseid/syllabus(\?|$)})))) {
              $inhibitmenu = 'only_body=1';
          } else {
              $inhibitmenu = 'inhibitmenu=yes';
          }
          $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').$inhibitmenu.$anchor);
        if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) {         if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) {
            if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {             if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                $nolink = 1;                 $nolink = 1;
Line 4646  $form_end; Line 5018  $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 5695  sub handler { Line 6067  sub handler {
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
     if ($env{'form.forcestandard'})   { $supplementalflag=0; }      if ($env{'form.forcestandard'})   { $supplementalflag=0; }
     unless ($allowed) { $supplementalflag=1; }      unless (($supplementalflag) ||
     unless ($standard) { $supplementalflag=1; }              ($r->uri =~ m{^/adm/coursedocs/showdoc/uploaded/\Q$coursedom\E/\Q$coursenum\E/docs/})) {
           unless ($allowed) { $supplementalflag=1; }
           unless ($standard) { $supplementalflag=1; }
       }
     my $toolsflag=0;      my $toolsflag=0;
     if ($env{'form.tools'}) { $toolsflag=1; }      if ($env{'form.tools'}) { $toolsflag=1; }
   
Line 5718  sub handler { Line 6093  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 5771  sub handler { Line 6147  sub handler {
             &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);              &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
         }          }
     }      }
       
 # If we are not allowed to make changes, all we can see are supplemental docs  # If we are not allowed to make changes and this is supplemental content set folderpath  
     if (!$allowed) {      if ((!$allowed) && ($supplementalflag)) {
         unless ($env{'form.folderpath'} =~ /^supplemental/) {          unless ($env{'form.folderpath'} =~ /^supplemental/) {
             $env{'form.folderpath'} = &supplemental_base();              $env{'form.folderpath'} = &supplemental_base();
         }          }
Line 5951  sub handler { Line 6327  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 5993  sub handler { Line 6380  sub handler {
         if ($supplementalflag) {          if ($supplementalflag) {
             my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');              my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');
             my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);              my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
             $args = {'bread_crumbs' => $brcrum};              $args = {'bread_crumbs' => $brcrum,
                        'bread_crumbs_nomenu' => 1};
         } else {          } else {
             $args = {'force_register' => $showdoc};              $args = {'force_register' => $showdoc};
         }          }
Line 6022  sub handler { Line 6410  sub handler {
             }              }
         }          }
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
           my $args = {'bread_crumbs' => $brcrum};
           unless (($env{'form.folderpath'} eq '') ||
                   ($env{'form.folder'} eq 'supplemental')) {
               $args->{'bread_crumbs_nomenu'} = 1;
           }
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,          $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
                                                 {'bread_crumbs' => $brcrum,}));                                                   $args));
     } else {      } else {
         my ($breadtext,$breadtitle,$helpitem);          my ($breadtext,$breadtitle,$helpitem);
         $breadtext = "$crstype Editor";          $breadtext = "$crstype Editor";
Line 6156  sub handler { Line 6549  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 6205  sub handler { Line 6599  sub handler {
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
         $quotainfo          $quotainfo
  $lt{'file'}:<br />   $lt{'file'}:<br />
  <input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled />  
         <input type="hidden" id="LC_free_space" value="$free_space" />  
 FIUP  FIUP
   
  my $checkbox=(<<CHBO);   my $checkbox=(<<CHBO);
  <!-- <label>$lt{'parse'}?   <!-- <label>$lt{'parse'}?
  <input type="checkbox" name="parserflag" />   <input type="checkbox" name="parserflag" />
Line 6228  CHBO Line 6619  CHBO
         <fieldset id="uploadimsform" style="display: none;">          <fieldset id="uploadimsform" style="display: none;">
         <legend>$lt{'imsf'}</legend>          <legend>$lt{'imsf'}</legend>
         $fileupload          $fileupload
           <input type="file" name="uploaddoc" id="uploaddocims" class="LC_flUpload LC_uploaddoc" size="40" $disabled />
           <input type="hidden" id="LC_free_space_ims" value="$free_space" />
         <br />          <br />
         <p>          <p>
         $lt{'cms'}:&nbsp;           $lt{'cms'}:&nbsp; 
Line 6254  IMSFORM Line 6647  IMSFORM
         <legend>$lt{'upfi'}</legend>          <legend>$lt{'upfi'}</legend>
  <input type="hidden" name="active" value="aa" />   <input type="hidden" name="active" value="aa" />
     $fileupload      $fileupload
           <input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled />
           <input type="hidden" id="LC_free_space" value="$free_space" />
  <br />   <br />
  $lt{'title'}:<br />   $lt{'title'}:<br />
  <input type="text" size="60" name="comment" $disabled />   <input type="text" size="60" name="comment" $disabled />
Line 6304  SEDFFORM Line 6699  SEDFFORM
         <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 /><br />          <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 6530  NROSTFORM Line 6932  NROSTFORM
         $help{'Web_Page'}          $help{'Web_Page'}
         </form>          </form>
 NWEBFORM  NWEBFORM
           my $showpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
         my @ids=&Apache::lonnet::current_machine_ids();          my @ids=&Apache::lonnet::current_machine_ids();
         my $machines_str = "'".join("','",@ids)."'";          my $machines_str = "'".join("','",@ids)."'";
         my (%is_home,%toppath,$rolehomes);          my (%is_home,%toppath,$rolehomes);
Line 6628  NWEBFORM Line 7030  NWEBFORM
                                                                 "resize_scrollbox('contentscroll','1','0');",                                                                  "resize_scrollbox('contentscroll','1','0');",
                                                                 "toggleExampleText();",'template').'<br />';                                                                  "toggleExampleText();",'template').'<br />';
         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');">          <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">
         $lt{'stpr'}</a>$help{'Course_Resource'}          $lt{'stpr'}</a>$help{'Course_Resource'}
Line 6638  NWEBFORM Line 7040  NWEBFORM
         <input type="hidden" name="active" value="bb" />          <input type="hidden" name="active" value="bb" />
         <p>          <p>
         $pickdir          $pickdir
           </p>
         <div id="newstdproblem" style="display:none;">          <div id="newstdproblem" style="display:none;">
           <p>
         <span class="LC_nobreak">$lt{'news'}?&nbsp;          <span class="LC_nobreak">$lt{'news'}?&nbsp;
         <label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label>          <label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label>
         &nbsp;          &nbsp;
Line 6646  NWEBFORM Line 7050  NWEBFORM
         </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" />
         </p>          </p>
           </div>
         $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>  
         <div id="newresource" style="display:none">          <div id="newresource" style="display:none">
           <p>
         $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 6657  NWEBFORM Line 7062  NWEBFORM
         $lt{'yes'}</label>          $lt{'yes'}</label>
         <span id="newrestitle"></span>          <span id="newrestitle"></span>
         <input type="hidden" size="20" name="newresourcetitle" id="newresourcetitle" autocomplete="off" $disabled />          <input type="hidden" size="20" name="newresourcetitle" id="newresourcetitle" autocomplete="off" $disabled />
         </div>  
         </p>          </p>
           </div>
         <p>          <p>
         $lt{'uste'}          $lt{'uste'}
         <label><input type="radio" name="newresusetemp" value="0" checked="checked" onclick="toggleWithTemplate(this.form);" $disabled />          <label><input type="radio" name="newresusetemp" value="0" checked="checked" onclick="toggleWithTemplate(this.form);" $disabled />
         $lt{'no'}</label>&nbsp;&nbsp;          $lt{'no'}</label>&nbsp;&nbsp;
         <label><input type="radio" name="newresusetemp" value="1" onclick="toggleWithTemplate(this.form);" $disabled />          <label><input type="radio" name="newresusetemp" value="1" onclick="toggleWithTemplate(this.form);" $disabled />
         $lt{'yes'}</label>          $lt{'yes'}</label>
           </p>
         <div id="newrestemplate" style="display:none">          <div id="newrestemplate" style="display:none">
         $templates          $templates
         $templatepreview          $templatepreview
         </div>          </div>
         </p>  
         <span class="LC_nobreak">          <span class="LC_nobreak">
         <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />          <input type="hidden" name="folderpath" value="$showpath" />
         <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;">          <div id="stdprobswitch" style="display:none;">
         $rolehomes          $rolehomes
         <input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" />          <input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" />
Line 6755  NGFFORM Line 7159  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 6794  my %orderhash = ( Line 7198  my %orderhash = (
                 'aa' => ['Upload',$fileuploadform],                  'aa' => ['Upload',$fileuploadform],
                 'bb' => ['Import',$importpubform],                  'bb' => ['Import',$importpubform],
                 'cc' => ['External',$externalform],                  'cc' => ['External',$externalform],
                 'dd' => ['Grading',$gradingform],                  'dd' => ['Assessment',$gradingform],
                 'ff' => ['Other',$specialdocumentsform],                  'ff' => ['Other',$specialdocumentsform],
                 );                  );
 unless ($container eq 'page') {  unless ($container eq 'page') {
Line 6847  unless ($container eq 'page') { Line 7251  unless ($container eq 'page') {
         <legend>$lt{'upfi'}</legend>          <legend>$lt{'upfi'}</legend>
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="ee" />
  $fileupload   $fileupload
           <input type="file" name="uploaddoc" id="uploaddocsupp" class="LC_flUpload LC_uploaddoc" size="40" $disabled />
           <input type="hidden" id="LC_free_space_supp" value="$free_space" />
  <br />   <br />
  <br />   <br />
  <span class="LC_nobreak">   <span class="LC_nobreak">
Line 6859  unless ($container eq 'page') { Line 7265  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 6938  my @specialdocs = ( Line 7345  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 7956  function toggleImportCrsres(caller) { Line 8363  function toggleImportCrsres(caller) {
             var curr = document.getElementById('importcrsresform').style.display;              var curr = document.getElementById('importcrsresform').style.display;
             if (curr == 'none') {              if (curr == 'none') {
                 disp='block';                  disp='block';
                 populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1);                  populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1,0);
                   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';
                       }
                   }
             }              }
         }          }
         document.getElementById('importcrsresform').style.display=disp;          document.getElementById('importcrsresform').style.display=disp;
Line 8020  function populateDirSelects(form,locsel, Line 8442  function populateDirSelects(form,locsel,
             }              }
             var http = new XMLHttpRequest();              var http = new XMLHttpRequest();
             var url = "/adm/courseauthor";              var url = "/adm/courseauthor";
             var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir;              var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir+"&addtop=1";
             http.open("POST", url, true);              http.open("POST", url, true);
             http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");              http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
             http.onreadystatechange = function() {              http.onreadystatechange = function() {
Line 8039  function populateDirSelects(form,locsel, Line 8461  function populateDirSelects(form,locsel,
                                 selelem.options[selelem.options.length] = new Option(data.dirs[j],data.dirs[j]);                                  selelem.options[selelem.options.length] = new Option(data.dirs[j],data.dirs[j]);
                             }                              }
                             selelem.selectedIndex = 0;                              selelem.selectedIndex = 0;
                               if (len == 1) {
                                   toggleCrsResTitle();
                               }
                         }                          }
                     }                      }
                 }                  }
Line 9089  END Line 9514  END
 <sourceavail></sourceavail>  <sourceavail></sourceavail>
 <standards></standards>  <standards></standards>
 <subject></subject>  <subject></subject>
 <title></title>  <title>Course Authoring Rights</title>
 END  END
                                     close($fh);                                      close($fh);
                                 }                                  }

Removed from v.1.692  
changed lines
  Added in v.1.705


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