Diff for /loncom/interface/londocs.pm between versions 1.665 and 1.722

version 1.665, 2019/08/16 14:22:49 version 1.722, 2025/01/07 21:01:37
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;
   use HTML::LCParser;
 use GDBM_File;  use GDBM_File;
 use File::MMagic;  use File::MMagic;
 use File::Copy;  use File::Copy;
Line 91  sub storemap { Line 91  sub storemap {
   
     if ($map =~ /^default/) {      if ($map =~ /^default/) {
         $hadchanges=1;          $hadchanges=1;
     } else {      } elsif ($contentchg) {
         $suppchanges=1;          $suppchanges=1;
     }      }
     return ($errtext,0);      return ($errtext,0);
Line 103  sub authorhosts { Line 103  sub authorhosts {
     my %outhash=();      my %outhash=();
     my $home=0;      my $home=0;
     my $other=0;      my $other=0;
       my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
  if ($key=~/^user\.role\.(au|ca)\.(.+)$/) {   if ($key=~/^user\.role\.(au|ca)\.(.+)$/) {
     my $role=$1;      my $role=$1;
Line 119  sub authorhosts { Line 120  sub authorhosts {
     }      }
     my $allowed=0;      my $allowed=0;
     my $myhome=&Apache::lonnet::homeserver($ca,$cd);      my $myhome=&Apache::lonnet::homeserver($ca,$cd);
     my @ids=&Apache::lonnet::current_machine_ids();  
     foreach my $id (@ids) {      foreach my $id (@ids) {
                 if ($id eq $myhome) {                  if ($id eq $myhome) {
                     $allowed=1;                      $allowed=1;
Line 183  sub default_folderpath { Line 183  sub default_folderpath {
     }      }
 }  }
   
   sub validate_supppath {
       my ($coursenum,$coursedom) = @_;
       my $backto;
       if ($env{'form.supppath'} ne '') {
           my @items = split(/\&/,$env{'form.supppath'});
           my ($badpath,$got_supp,$supppath,%supphidden,%suppids);
           for (my $i=0; $i<@items; $i++) {
               my $odd = $i%2;
               if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {
                   $badpath = 1;
                   last;
               } elsif ($odd) {
                   my $suffix;
                   my $idx = $i-1;
                   if ($items[$i] =~ /^([^:]*)::(|1):::$/) {
                       $backto .= '&'.$1;
                   } elsif ($items[$idx] eq 'supplemental') {
                       $backto .= '&'.$items[$i];
                   } else {
                       $backto .= '&'.$items[$i];
                       my $is_hidden;
                       unless ($got_supp) {
                           my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
                           if (ref($supplemental) eq 'HASH') {
                               if (ref($supplemental->{'hidden'}) eq 'HASH') {
                                   %supphidden = %{$supplemental->{'hidden'}};
                               }
                               if (ref($supplemental->{'ids'}) eq 'HASH') {
                                   %suppids = %{$supplemental->{'ids'}};
                               }
                           }
                           $got_supp = 1;
                       }
                       if (ref($suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}) eq 'ARRAY') {
                           my $mapid = $suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}->[0];
                           if ($supphidden{$mapid}) {
                               $is_hidden = 1;
                           }
                       }
                       $suffix = '::'.$is_hidden.':::';
                   }
                   $supppath .= '&'.$items[$i].$suffix;
               } else {
                   $supppath .= '&'.$items[$i];
                   $backto .= '&'.$items[$i];
               }
           }
           if ($badpath) {
               delete($env{'form.supppath'});
           } else {
               $supppath =~ s/^\&//;
               $backto =~ s/^\&//;
               $env{'form.supppath'} = $supppath;
           }
       }
       return $backto;
   }
   
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 206  ENDJS Line 264  ENDJS
                          add_entries => {'onload' => "hide_searching();"},                           add_entries => {'onload' => "hide_searching();"},
                      };                       };
     }      }
     $r->print(&Apache::loncommon::start_page('Copy '.$crstype.' Content to Authoring Space',$js,$starthash)."\n".      $r->print(&Apache::loncommon::start_page('Copy uploaded content to Authoring Space',$js,$starthash)."\n".
               &Apache::lonhtmlcommon::breadcrumbs('Copy '.$crstype.' Content to Authoring Space')."\n");                &Apache::lonhtmlcommon::breadcrumbs('Copy uploaded content to Authoring Space')."\n");
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) {      unless ($home) {
           $r->print('<p class="LC_info">'.&mt('No author or co-author roles on this server.').'</p>'); 
         $r->print(&endContentScreen());          $r->print(&endContentScreen());
         return '';          return '';
     }      }
Line 219  ENDJS Line 278  ENDJS
     if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {      if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
 # Do the dumping  # Do the dumping
  unless ($outhash{'home_'.$env{'form.authorspace'}}) {   unless ($outhash{'home_'.$env{'form.authorspace'}}) {
             $r->print(&endContentScreen());              $r->print('<p class="LC_info">'.&mt('Selected Authoring Space is not on this server.').'</p>'.
                         &endContentScreen());
             return '';              return '';
         }          }
  my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});   my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
Line 515  $contents{webreferences}.' Line 575  $contents{webreferences}.'
         if (!ref($navmap)) {          if (!ref($navmap)) {
             $r->print($errormsg);              $r->print($errormsg);
         } else {          } else {
             $r->print('<div id="searching">'.&mt('Searching ...').'</div>');  
             $r->rflush();  
             my ($preamble,$formname);  
             $formname = 'dumpdoc';  
     unless ($home==1) {  
         $preamble = '<div class="LC_left_float">'.  
             '<fieldset><legend>'.  
                             &mt('Select the Authoring Space').  
                             '</legend><select name="authorspace">';  
     }  
             my @orderspaces = ();  
     foreach my $key (sort(keys(%outhash))) {  
                 if ($key=~/^home_(.+)$/) {  
                     if ($1 eq $env{'user.name'}.':'.$env{'user.domain'}) {  
                         unshift(@orderspaces,$1);  
                     } else {  
                         push(@orderspaces,$1);  
                     }  
                 }   
             }  
             if ($home>1) {  
                 $preamble .= '<option value="" selected="selected">'.&mt('Select').'</option>';  
             }  
             foreach my $user (@orderspaces) {  
  if ($home==1) {  
     $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />';  
  } else {  
     $preamble .= '<option value="'.$user.'">'.$user.' - '.  
          &Apache::loncommon::plainname(split(/\:/,$user)).'</option>';  
         }  
     }  
     unless ($home==1) {  
         $preamble .= '</select></fieldset></div>'."\n";  
     }  
     my $title=$origcrsdata{'description'};      my $title=$origcrsdata{'description'};
     $title=~s/[\/\s]+/\_/gs;      $title=~s/[\/\s]+/\_/gs;
     $title=&clean($title);      $title=&clean($title);
     $preamble .= '<div class="LC_left_float">'.      my $formname = 'dumpdoc';
                          '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.      my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
                          '<input type="text" size="50" name="authorfolder" value="'.                             '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
                          $title.'" />'.      my %uploadedfiles;
                          '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";  
             my %uploadedfiles;  
     &tiehash();      &tiehash();
     foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {      foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
         my ($ext)=($file=~/\.(\w+)$/);          my ($ext)=($file=~/\.(\w+)$/);
Line 583  $contents{webreferences}.' Line 607  $contents{webreferences}.'
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
 }  }
   
   sub authorspace_selector {
       my ($r,$formname,$home,$title,%outhash) = @_;
       $r->print('<div id="searching">'.&mt('Searching ...').'</div>'."\n");
       $r->rflush();
       my $preamble;
       unless ($home==1) {
           $preamble = '<div class="LC_left_float">'.
                       '<fieldset><legend>'.
                       &mt('Select the Authoring Space').
                       '</legend><select name="authorspace">';
       }
       my @orderspaces = ();
       foreach my $key (sort(keys(%outhash))) {
           if ($key=~/^home_(.+)$/) {
               if ($1 eq $env{'user.name'}.':'.$env{'user.domain'}) {
                   unshift(@orderspaces,$1);
               } else {
                   push(@orderspaces,$1);
               }
           }
       }
       if ($home>1) {
           $preamble .= '<option value="" selected="selected">'.&mt('Select').'</option>';
       }
       foreach my $user (@orderspaces) {
           if ($home==1) {
               $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />';
           } else {
               $preamble .= '<option value="'.$user.'">'.$user.' - '.
                            &Apache::loncommon::plainname(split(/\:/,$user)).'</option>';
           }
       }
       unless ($home==1) {
           $preamble .= '</select></fieldset></div>'."\n";
       }
       $preamble .= '<div class="LC_left_float">'.
                    '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                    '<input type="text" size="30" name="authorfolder" value="'.$title.'" />'."\n".
                    '</fieldset></div>'."\n";
       return $preamble;
   }
   
 sub recurse_html {  sub recurse_html {
     my ($mm,$prefix,$currdirpath,$currurlpath,$container,$item,$replacehash,$deps) = @_;      my ($mm,$prefix,$currdirpath,$currurlpath,$container,$item,$replacehash,$deps) = @_;
     return unless ((ref($replacehash) eq 'HASH') && (ref($deps) eq 'HASH'));      return unless ((ref($replacehash) eq 'HASH') && (ref($deps) eq 'HASH'));
Line 627  sub recurse_html { Line 693  sub recurse_html {
     return;      return;
 }  }
   
   sub copycrsauthored {
       my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;
       my ($starthash,$js,$title,$formname);
       my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});
       $title=$origcrsdata{'description'};
       $title=~s/[\/\s]+/\_/gs;
       $title=&clean($title);
       my ($home,$other,%outhash)=&authorhosts();
       unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
           my %js_lt;
           $formname = 'copycrsauthored';
           if ($home) {
               %js_lt =
                   &Apache::lonlocal::texthash(
                       yomu => 'You must select an Authoring Space',
                       whco => 'When Copyright set to "custom", URL of a published rights file is needed.',
               );
               &js_escape(\%js_lt);
           }
           if ($home > 1) {
               $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function validCrsCopy() {
       var dest = document.$formname.authorspace.options[document.$formname.authorspace.selectedIndex].value;
       if (dest == '') {
           alert("$js_lt{'yomu'}");
           return false;
       }
       var dist = document.$formname.copyright.options[document.$formname.copyright.selectedIndex].value;
       if (dist == 'custom') {
           if (document.$formname.customrights.value == '') {
               alert("$js_lt{'whco'}");
               return false;
           }
       }
       return true;
   }
   
   function init_copycrs_form() {
       document.$formname.authorspace.selectedIndex = "0";
       document.$formname.authorfolder.value = '$title';
       document.$formname.copyright.selectedIndex = "0";
   }
   
   // ]]>
   </script>
   
   ENDJS
           } elsif ($home) {
               $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function init_copycrs_form() {
       document.$formname.authorfolder.value = '$title';
       document.$formname.copyright.selectedIndex = "0";
   }
   
   // ]]>
   </script>
   
   ENDJS
           }
           $js .= <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function hide_searching() {
       if (document.getElementById('searching')) {
           document.getElementById('searching').style.display = 'none';
       }
       return;
   }
   
   function showHideCustom(caller,divid) {
       if (document.getElementById(divid)) {
           if (caller.options[caller.selectedIndex].value == 'custom') {
               document.getElementById(divid).style.display="inline-block";
           } else {
               document.getElementById(divid).style.display="none";
           }
       }
       return;
   }
   
   // ]]>
   </script>
   ENDJS
   
           $js .= "\n".&Apache::lonhtmlcommon::scripttag(&Apache::loncommon::browser_and_searcher_javascript())."\n";
           $starthash = {
                            add_entries => {'onload' => "hide_searching(); init_copycrs_form();"},
                        };
       }
       $r->print(&Apache::loncommon::start_page('Copy from Course Authoring to User Authoring',$js,$starthash)."\n".
                 &Apache::lonhtmlcommon::breadcrumbs('Copy from Course Authoring Space')."\n");
       $r->print(&startContentScreen('tools'));
       unless ($home) {
           $r->print('<p class="LC_info">'.&mt('No author or co-author roles on this server.').'</p>');
           $r->print(&endContentScreen());
           return '';
       }
       my $docroot = $r->dir_config('lonDocRoot');
       my $is_course_home;
       my @ids=&Apache::lonnet::current_machine_ids();
       if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/,@ids))) {
           $is_course_home = 1;
       }
       my $exclude = &Apache::lonnet::priv_exclude();
       my $srcurl = "/priv/$coursedom/$coursenum";
       my $srctop = $docroot.$srcurl;
       my $resurl = "/res/$coursedom/$coursenum";
       my $res_exclude = &Apache::lonnet::res_exclude();
       if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
           $r->print('<h3>'.&mt('Copying Files and/or Sub-directories').'</h3>');
           if ($readonly) {
               $r->print('<p class="LC_info">'.
                         &mt('You do not have permission to copy files and/or directories from Course Authoring Space.').
                         '</p>'.
                         &endContentScreen());
               return '';
           }
           unless ($outhash{'home_'.$env{'form.authorspace'}}) {
               $r->print('<p class="LC_info">'.&mt('Selected Authoring Space is not on this server.').'</p>'.
                         &endContentScreen());
               return '';
           }
           my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
           my $desturl = "/priv/$cd/$ca";
           my $destresurl = "/res/$cd/$ca";
           my $desttop = $docroot.$desturl;
           my $subdir = &clean($env{'form.authorfolder'});
           $subdir = &cleandir($subdir);
           if ($subdir eq '') {
               $r->print('<p class="LC_info">'.&mt('After removal of disallowed characters target sub-directory name was blank.').'</p>'.
                         &endContentScreen());
               return '';
           } elsif ($subdir =~/^_+$/) {
               $r->print('<p class="LC_info">'.&mt('After replacement of non-alphanumeric characters with _ in target sub-directory name, nothing but underscores was left.').'</p>'.
                         &endContentScreen());
               return '';
           }
           my (%tocopy,%dirs_to_make,%files_to_copy);
           map { $tocopy{&unescape($_)} = 1; } &Apache::loncommon::get_env_multiple('form.copytouser');
           if (keys(%tocopy)) {
               my (%subdirs,%files);
               &Apache::lonnet::recursedirs($is_course_home,1,undef,$exclude,0,0,$srcurl,'',\%subdirs,\%files);
               foreach my $possible (sort(keys(%tocopy))) {
                   if ($possible =~ m{/$}) {
                       my $possdir = $possible;
                       $possdir =~ s{^/+|/+$}{}g;
                       if (exists($subdirs{$possdir})) {
                           $dirs_to_make{$possdir} = 1;
                       } else {
                           delete($tocopy{$possible});
                       }
                   } else {
                       my ($path,$fname) = ($possible =~ m{(.*/)([^/]+)$});
                       my $found = 0;
                       if ($path eq '/') {
                           if (ref($files{$path}) eq 'HASH') {
                               if (exists($files{$path}{$fname})) {
                                   $found = 1;
                                   $files_to_copy{$fname} = 1;
                               }
                           }
                       } else {
                           $path =~ s{^/+|/+$}{}g;
                           if (ref($files{$path}) eq 'HASH') {
                               if (exists($files{$path}{$fname})) {
                                   $dirs_to_make{$path} = 1;
                                   $files_to_copy{"$path/$fname"} = 1;
                                   $found = 1;
                               }
                           }
                       }
                       unless ($found) {
                           delete($tocopy{$possible});
                       }
                   }
               }
           } else {
               $r->print('<p>'.&mt('No files or directories selected for copying').'</p>');
               $r->print(&endContentScreen());
               return '';
           }
           if (keys(%tocopy)) {
               my (%resdirs,%resfiles);
               &Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
               my ($notopdir,%newdir,%newfile,%checkdeps,%newresfile);
               $r->print('<p>'.&mt('Copy to: [_1]',
                                   '<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                         '</p>'."\n");
               if (keys(%dirs_to_make)) {
                   unless (-e $desttop.'/'.$subdir) {
                       mkdir($desttop.'/'.$subdir,0755);
                   }
                   if (-e $desttop.'/'.$subdir) {
                       foreach my $dir (sort(keys(%dirs_to_make))) {
                           my @dirs=split(/\//,$dir);
                           my $path="$desttop/$subdir";
                           my $makepath=$path;
                           my $fail;
                           for (my $i=0;$i<@dirs;$i++) {
                               $makepath.='/'.$dirs[$i];
                               unless (-e $makepath) {
                                   unless (mkdir($makepath,0755)) {
                                       $fail = 1;
                                       last;
                                   }
                                   if (($i == scalar(@dirs)-1) && (!$fail))  {
                                       $newdir{$dir} = 1;
                                   }
                               }
                           }
                           if ($fail) {
                               $r->print('<p class="LC_warning">'.&mt('Target directory: [_1] does not exist, and could not be created.',
                                                                      '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$dir.'</span>').
                                         '</p>'."\n");
                           }
                       }
                   } else {
                       $notopdir = 1;
                   }
               }
               if (keys(%files_to_copy)) {
                   unless (-e $desttop.'/'.$subdir) {
                       mkdir($desttop.'/'.$subdir,0755);
                   }
                   if (-e $desttop.'/'.$subdir) {
                       my $num = 0;
                       my ($copyright,$customdistfile);
                       if ($env{'form.copyright'} eq 'default' || $env{'form.copyright'} eq 'domain' || $env{'form.copyright'} eq 'public') {
                           $copyright = $env{'form.copyright'};
                       } elsif ($env{'form.copyright'} eq 'custom') {
                           if ($env{'form.customrights'} =~ m{^/res/$match_domain/$match_username/.+\.rights$}) {
                               my ($rightsdom,$rightsuname) = ($1,$2);
                               my $rightshome = &Apache::lonnet::homeserver($rightsdom,$rightsuname);
                               if (($rightshome eq 'no_host') || ($rightshome eq '')) {
                                   $copyright = 'default';
                               } elsif (grep(/^\Q$rightshome\E$/,@ids)) {
                                   if (-e $docroot.$env{'form.customrights'}) {
                                       $copyright = 'custom';
                                       $customdistfile = $env{'form.customrights'};
                                   } else {
                                       $copyright = 'default';
                                   }
                               } else {
                                   my $rightsfile = &Apache::lonnet::filelocation('',$env{'form.customrights'});
                                   unless (&Apache::lonnet::getfile($rightsfile) eq '-1') {
                                       $customdistfile = $env{'form.customrights'};
                                   }
                               }
                           }
                       }
                       my $sourceavail;
                       if ($env{'form.sourceavail'} =~ /^(open|closed)$/) {
                           $sourceavail = $env{'form.sourceavail'};
                       }
                       my $respublish;
                       if ($env{'form.respublish'}) {
                           $respublish = 1;
                       }
                       my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
                       foreach my $file (keys(%files_to_copy)) {
                           my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname);
                           if ($file =~ m{/}) {
                               ($path,$fname) = ($file =~ m{^(.+)/([^/]+)$});
                               if (-d "$desttop/$subdir/$path") {
                                   if (-e "$desttop/$subdir/$path/$fname") {
                                       $dup = 1;
                                   } else {
                                       $src = "$srctop/$path/$fname";
                                       $dest = "$desttop/$subdir/$path/$fname";
                                   }
                               } elsif (-f "$desttop/$subdir/$path") {
                                   $dir_is_file = 1;
                               } else {
                                   $fail = 1;
                               }
                           } elsif (-e "$desttop/$subdir/$file") {
                               $dup = 1;
                           } else {
                               $src = "$srctop/$file";
                               $dest = "$desttop/$subdir/$file";
                               $fname = $file;
                           }
                           if ($fail) {
                               $r->print('<p class="LC_warning">'.&mt('Target directory: [_1] does not exist, and could not be created.',
                                                                      '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$path.'</span>').
                                         '</p>'."\n");
                           } elsif ($dup) {
                               $r->print('<p class="LC_warning">'.&mt('Target file: [_1] already exists -- not overwriting.',
                                                                      '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$file.'</span>').
                                         '</p>'."\n");
                           } elsif ($dir_is_file) {
                               $r->print('<p class="LC_warning">'.&mt('Target directory: [_1] name is already in a use for a file -- not overwriting.',
                                                                      '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$file.'</span>').
                                         '</p>'."\n");
                           } elsif (($src ne '') && ($dest ne '')) {
                               my $ressrc = $docroot.$resurl.'/'.$file;
                               my $ressrcmeta = $ressrc.'.meta';
                               my ($ext) = ($file =~ /\.(\w+)$/);
                               my $embstyle=&Apache::loncommon::fileembstyle($ext);
                               my ($getres,$getresmeta);
                               if ($respublish) {
                                   if ($path eq '') {
                                       if ((ref($resfiles{'/'}) eq 'HASH') &&
                                           (exists($resfiles{'/'}{$fname}))) {
                                           $getres = 1;
                                           $getresmeta = 1;
                                       }
                                   } elsif ((ref($resfiles{$path}) eq 'HASH') &&
                                            (exists($resfiles{$path}{$fname}))) {
                                       $getres = 1;
                                       $getresmeta = 1;
                                   }
                               }
                               if ($is_course_home) {
                                   my ($needpriv,$needprivmeta);
                                   if ($respublish) {
                                       if ($getres) {
                                           if (&Apache::londiff::are_different_files($src,$ressrc)) {
                                               $needpriv = 1;
                                               if (&File::Copy::copy($ressrc,$dest)) {
                                                   if ($embstyle eq 'ssi') {
                                                       &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd);
                                                   }
                                               }
                                           } else {
                                               if (&File::Copy::copy($src,$dest)) {
                                                   $newfile{$file} = $desturl.'/'.$subdir.'/'.$file;
                                                   if ($embstyle eq 'ssi') {
                                                       &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir);
                                                   }
                                               }
                                           }
                                       } else {
                                           $needpriv = 1;
                                       }
                                       if ($getresmeta) {
                                           if ((-e $src.'.meta') && (!-e $dest.'.meta')) {
                                               if (&Apache::londiff::are_different_files($src.'.meta',$ressrc.'.meta')) {
                                                   if (&File::Copy::copy($ressrc.'.meta',$dest.'.meta')) {
                                                       &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                                          $customdistfile,$sourceavail,\%checkdeps);
                                                   }
                                                   $needprivmeta = 1;
                                               } else {
                                                   if (&File::Copy::copy($src.'.meta',$dest.'.meta')) {
                                                       &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                                          $customdistfile,$sourceavail,\%checkdeps);
                                                   }
                                               }
                                           }
                                       }
                                       if ($getres) {
                                           my $destresfile = $docroot.$destresurl.'/'.$subdir.'/'.$file;
                                           if (-e $dest) {
                                               my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
                                               if (-e $destresfile) {
                                                   $newresfile{$file} = $destresurl.'/'.$subdir.'/'.$file;
                                               }
                                           }
                                       }
                                   } else {
                                       $needpriv = 1;
                                       if ((-e $src.'.meta') && (!-e $dest.'.meta')) {
                                           $needprivmeta = 1;
                                       }  
                                   }
                                   if ($needpriv) {
                                       if (&File::Copy::copy($src,$dest)) {
                                           $newfile{$file} = $desturl.'/'.$subdir.'/'.$file;
                                           if ($embstyle eq 'ssi') {
                                               &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir);
                                           }
                                       }
                                   }
                                   if ($needprivmeta) {
                                       if (&File::Copy::copy($src.'.meta',$dest.'.meta')) {
                                            &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                               $customdistfile,$sourceavail,\%checkdeps);
                                       }
                                   }
                               } else {
                                   my ($needpriv,$needprivmeta);
                                   if ($respublish) {
                                       if ($getres) {
                                           &Apache::lonnet::repcopy($docroot.$resurl.'/'.$file);
                                       }
                                       if ($getresmeta) {
                                           &Apache::lonnet::repcopy($docroot.$resurl.'/'.$file.'.meta');
                                       }
                                       if (-e $docroot.$resurl.'/'.$file) {
                                           if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file,$dest) eq 'ok') {
                                               if (&Apache::londiff::are_different_files($docroot.$resurl.'/'.$file,$dest)) {
                                                   $needpriv = 1;
                                                   if (&File::Copy::copy($docroot.$resurl.'/'.$file,$dest)) {
                                                       if ($embstyle eq 'ssi') {
                                                           &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd);
                                                       }
                                                   }
                                               } else {
                                                   if ($embstyle eq 'ssi') {
                                                       &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir);
                                                   }
                                                   $newfile{$file} = $desturl.'/'.$subdir.'/'.$file;
                                               }
                                           }
                                       } else {
                                           $needpriv = 1;
                                       }
                                       if (-e $docroot.$resurl.'/'.$file.'.meta') {
                                           if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file.'.meta',$dest.'.meta') eq 'ok') {
                                               if (&Apache::londiff::are_different_files($docroot.$resurl.'/'.$file.'.meta',$dest.'.meta')) {
                                                   $needprivmeta = 1;
                                                   if (&File::Copy::copy($docroot.$resurl.'/'.$file.'.meta',$dest.'.meta')) {
                                                       &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                                          $customdistfile,$sourceavail,\%checkdeps);
                                                   }
                                               } else {
                                                   &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                                      $customdistfile,$sourceavail,\%checkdeps);
                                               }
                                           }
                                       } else {
                                           if (!-e $dest.'.meta') {
                                               $needprivmeta = 1;
                                           }
                                       }
                                       if ($getres) {
                                           my $destresfile = $docroot.$destresurl.'/'.$subdir.'/'.$file;
                                           if (-e $dest) {
                                               my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
                                               if (-e $destresfile) {
                                                   $newresfile{$file} = $destresurl.'/'.$subdir.'/'.$file;
                                               }
                                           }
                                       }
                                   } else {
                                       $needpriv = 1;
                                       if (!-e $dest.'.meta') {
                                           $needprivmeta = 1;
                                       }
                                   }
                                   if ($needpriv) {
                                       if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file,$dest) eq 'ok') {
                                           if ($embstyle eq 'ssi') {
                                               &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir);
                                           }
                                           $newfile{$file} = $desturl.'/'.$subdir.'/'.$file;
                                       }
                                   }
                                   if ($needprivmeta) {
                                       if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file.'.meta',$dest.'.meta') eq 'ok') {
                                           &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                              $customdistfile,$sourceavail,\%checkdeps);
                                       }
                                   }
                               }
                           }
                       }
                   } else {
                       $notopdir = 1;
                   }
               }
               if ($notopdir) {
                   $r->print('<p><span class="LC_info">'.&mt('No files or sub-directories copied').'</span><br />'."\n".
                             '<span class="LC_warning">'.&mt('Target directory: [_1] does not exist, and could not be created.',
                                                             '<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                             '</span></p>'."\n");
               }
               if (keys(%newdir)) {
                    $r->print('<p>'.&mt('Created the following directories in [_1]:','<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                              '</p>'."\n".
                              '<ul><li>'.join('</li><li>',sort(keys(%newdir))).'</li></ul></p>'."\n");
               }
               if (keys(%newfile)) {
                   $r->print('<p>'.&mt('Copied the following files to [_1]:','<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                             '</p>'."\n".
                             '<ul><li>'.join('</li><li>',sort(keys(%newfile))).'</li></ul></p>'."\n");
                   foreach my $file (keys(%newfile)) {
                       my %storehash = (
                                         'priv' => $newfile{$file},
                                         'who'  => $env{'user.name'}.':'.$env{'user.domain'},
                                       );
                       if (exists($newresfile{$file})) {
                           $storehash{'res'} = 1;
                       }
                       &Apache::lonnet::store_userdata(\%storehash,$file,'copycourseauthor',$coursedom,$coursenum);
                   }
               }
               if (keys(%checkdeps)) {
                   my %missingdep;
                   foreach my $depfile (sort(keys(%checkdeps))) {
                       unless (-e "$desttop/$depfile") {
                           $missingdep{$depfile} = 1;
                       }
                   }
                   if (keys(%missingdep)) {
                       $r->print('<p>'.&mt('You may also need to copy the following missing dependencies for files copied to [_1]:',
                                           '<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                             '</p>'."\n".
                             '<ul><li>'.join('</li><li>',sort(keys(%missingdep))).'</li></ul></p>'."\n");
                   }
               }
           } else {
               $r->print('<p>'.&mt('No currently existing files or directories in Course Authoring Space selected for copying').'</p>');
               $r->print(&endContentScreen());
               return '';
           }
       } else {
           my $chkname = 'copytouser';
           my $context = 'crsauthored';
           my (%subdirs,%files,@dirs_by_depth,@files_by_depth,%parent,%children,%hierarchy,@checked_maps);
           &Apache::lonnet::recursedirs($is_course_home,1,undef,$exclude,0,0,$srcurl,'',\%subdirs,\%files,1);
           foreach my $key (keys(%subdirs)) {
               next if (($key eq '/') || ($key eq ''));
               my @items = split(/\//,$key);
               my $dir = pop(@items);
               my $depth = scalar(@items);
               my $path;
               if (!$depth) {
                   $path = '/';
               } else {
                   $path = join('/',@items);
               }
               $dirs_by_depth[$depth]{$path}{$dir} = 1;
           }
           foreach my $path (keys(%files)) {
               next if ($path eq '');
               my $depth;
               if ($path eq '/') {
                   $depth = 0;
               } else {
                   $depth = scalar(split(/\//,$path));
               }
               if (ref($files{$path}) eq 'HASH') {
                   foreach my $file (keys(%{$files{$path}})) {
                       $files_by_depth[$depth]{$path}{$file} = $files{$path}{$file};
                   }
               }
           }
           my ($info,$display,$onsubmit,$togglebuttons,$disabled);
           my (%resdirs,%resfiles);
           &Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
           my $numpub = 0;
           if (keys(%resfiles)) {
               foreach my $dir (keys(%resfiles)) {
                   if (ref($resfiles{$dir}) eq 'HASH') {
                       foreach my $file (keys(%{$resfiles{$dir}})) {
                           if (exists($files{$dir}{$file})) {
                               $numpub ++;
                           }
                       }
                   }
               }
           }
           if ($readonly) {
               $disabled = ' disabled="disabled"';
           }
           if ($disabled) {
               $togglebuttons = '<br />';
           } else {
               $togglebuttons = '<input type="button" value="'.&mt('check all').'" '.
                                'onclick="javascript:checkAll(document.'.$formname.'.'.$chkname.')" />'.
                                '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
                                ' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />';
           }
           my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
                          &courseresource_options($formname,$numpub).
                          '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
           my $display = '<form name="'.$formname.'" action="" method="post" onsubmit="return validCrsCopy();">'."\n".
                         $preamble."\n".
                         '<div class="LC_float_left">'."\n".
                         '<fieldset>'."\n".
                         '<legend>'.&mt('Content to copy').('&nbsp;'x4).$togglebuttons.'</legend>'."\n".
                         '<span class="LC_fontsize_medium">'.
                         &mt('Choose the files and/or folders to copy from Course Authoring to User Authoring').
                         '</span><br /><br />'."\n";
           my $count = 0;
   #
   # Warning to developers:
   #
   # If you add or remove form elements which precede the table of items to copy
   # you will need to modify the value for startcount. Form elements include both:
   # <input> and <fieldset> tags.
   # $startcount (set to 9) contains the following:
   # fieldsets with following legends: (a) Folder in Authoring Space, (b) Distribution to set in metadata
   # (c) Content to copy
   # inputs: textbox for destination folder; dropdown lists: (a) Copyright, (b) Source
   # hidden: customrights file;  buttons: (a) check all, (b) uncheck all.
   # authorspace: if more than 1: a fieldset with legend: Select the Authoring Space,
   # or if 1: an input (hidden) with available author/coauthor role.
   # if there are multiple possible author/coauthor roles (i.e., $home > 1),
   # incerement startcount by 1 for the dropdown list uses to select the target.
   #
   # If there are published files, increment startcount by 3:
   # fieldset (legend: Published Resources), and two radio buttons (Yes/No).
   #
           my $startcount = 9;
           if ($home > 1) {
               $startcount ++;
           }
           if ($numpub) {
               $startcount += 3;
           }
           my $lastcontainer = $startcount;
           $display .= &Apache::loncommon::start_data_table()."\n".
                       &Apache::loncommon::start_data_table_header_row().
                       '<th>'.&mt('Copy?').'</th>'.
                       '<th>'.&mt('Name').'</th>'.
                       '<th>'.&mt('Last modified').'</th>'.
                       '<th>'.&mt('Published?').'</th>'.
                       &Apache::loncommon::end_data_table_header_row()."\n";
           $count = &recurse_crsauthored(0,\@dirs_by_depth,\@files_by_depth,'/',$startcount,
                                         $count,\$display,\%parent,\%children,$readonly,
                                         $formname,$chkname,\$lastcontainer,\%resfiles);
           $display .= &Apache::loncommon::end_data_table().'</fieldset>';
           unless ($readonly) {
               $display .= '</div><div style="padding:0;clear:both;margin:0;border:0"></div>'.
                           '<div>'.
                           '<input type="submit" name="copyauthored" value="'.&mt("Copy Selected Content").'" />'.
                           '</div>';
           }
           $display .= &Apache::loncourserespicker::respicker_javascript($startcount,$count,$context,$formname,\%children,
                                                                         \%hierarchy,\@checked_maps,$home,$chkname);
           $r->print($display);
       }
       $r->print(&endContentScreen());
   }
   
   sub recurse_crsauthored {
       my ($currdepth,$dirs_by_depth,$files_by_depth,$currpath,$startcount,$count,$displayref,
           $parent,$children,$readonly,$formname,$chkname,$lastcontainerref,$resfilesref) = @_;
       return $count unless ((ref($dirs_by_depth) eq 'ARRAY') && (ref($files_by_depth) eq 'ARRAY') &&
                             (ref($resfilesref) eq 'HASH'));
       my ($disabled,$hasdirs,$hasfiles,%unique,%dirs,%files);
       if ((ref($dirs_by_depth->[$currdepth]) eq 'HASH') &&
           (ref($dirs_by_depth->[$currdepth]{$currpath}) eq 'HASH')) {
           $hasdirs = 1;
           %dirs = %{$dirs_by_depth->[$currdepth]{$currpath}};
           map { $unique{$_} = 1; } keys(%dirs);
       }
       if ((ref($files_by_depth->[$currdepth]) eq 'HASH') &&
           (ref($files_by_depth->[$currdepth]{$currpath}) eq 'HASH')) {
           $hasfiles = 1;
           %files = %{$files_by_depth->[$currdepth]{$currpath}};
           map { $unique{$_} = 1; } keys(%files);
       }
       if ($readonly) {
           $disabled = ' disabled="disabled"';
       }
       my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
       my $whitespace =
           '<img src="'.$location.'/whitespace_21.gif" class="LC_docs_spacer" alt="" />';
       $parent->{$currdepth} = $$lastcontainerref;
       foreach my $item (sort { lc($a) cmp lc($b) } (keys(%unique))) {
           next if ($item eq '');
           my $currelem;
           if ($hasdirs && exists($dirs{$item})) {
               $count ++;
               my $deeper = $currdepth+1;
               my ($newpath,$showpath);
               if ($currpath eq '/') {
                   $newpath = $item;
                   $showpath = $currpath.$item.'/';
               } else {
                   $newpath = $currpath.'/'.$item;
                   $showpath = '/'.$currpath.'/'.$item.'/';
               }
               $currelem = $count+$startcount;
               $$lastcontainerref = $currelem;
               $children->{$parent->{$currdepth}} .= $currelem.':';
               my $icon = 'src="'.$location.'/navmap.folder.open.gif" alt="'.&mt('Folder').'"';
               $$displayref .= &Apache::loncommon::start_data_table_row().
                               '<td><input type="checkbox" name="'.$chkname.'" value="'.&escape($showpath).'" '.
                               'onclick="javascript:checkFolder(document.'.$formname.','."'$currelem'".')" '.
                               $disabled.' /></td><td>';
               for (my $i=0; $i<$currdepth; $i++) {
                   $$displayref .= "$whitespace\n";
               }
               $$displayref .= '<img '.$icon.' />&nbsp;'.$item.'</td><td>&nbsp;</td><td>&nbsp;</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
               $count = &recurse_crsauthored($deeper,$dirs_by_depth,$files_by_depth,$newpath,
                                             $startcount,$count,$displayref,$parent,$children,
                                             $readonly,$formname,$chkname,$lastcontainerref,$resfilesref);
           }
           if ($hasfiles && exists($files{$item})) {
               $count ++;
               $currelem = $count+$startcount;
               $children->{$parent->{$currdepth}} .= $currelem.':';
               my $icon = 'src="'.&Apache::loncommon::icon($item).'"';
               my ($ext) = ($item =~ /\.([^.]+)$/);
               my $alttext;
               if (lc($ext) eq 'problem') {
                   $alttext = ' alt="'.&mt('Problem Icon').'"';
               } elsif ($ext =~ /^x?html?$/i) {
                   $alttext = ' alt="'.&mt('Web Page Icon').'"';
               } elsif ($ext =~ /^(jpg|gif|png|svg|jpeg)$/) {
                   $alttext = ' alt="'.&mt('Image Icon').'"';
               } else {
                   $alttext = ' alt="'.&mt('Resource Icon').'"';
               }
               my $showpath;
               if ($currpath eq '/') {
                   $showpath = $currpath;
               } else {
                   $showpath = "/$currpath/";
               }
               my ($published,$lastmod);
               if ((ref($resfilesref->{$currpath})) && (exists($resfilesref->{$currpath}{$item}))) {
                   $published = '<img src="'.$location.'/navmap.correct.gif" alt="'.&mt('yes').'" />';
               } else {
                   $published = '<img src="'.$location.'/navmap.wrong.gif" alt="'.&mt('no').'" />';
               }
               $$displayref .= &Apache::loncommon::start_data_table_row().
                               '<td><input type="checkbox" name="'.$chkname.'" value="'.&escape($showpath.$item).'" '.
                               'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '.
                               $disabled.' /></td><td>';
               for (my $i=0; $i<$currdepth; $i++) {
                   $$displayref .= "$whitespace\n";
               }
               $$displayref .= '<img '.$icon.$alttext.' />&nbsp;'.$item.'</td>'.
                               '<td>'.&Apache::lonlocal::locallocaltime($files{$item}).'</td>'.
                               '<td style="text-align: center;">'.$published.'</td>'.
                               &Apache::loncommon::end_data_table_row()."\n";
           }
       }
       $$lastcontainerref = $parent->{$currdepth};
       return $count;
   }
   
   sub courseresource_options {
       my ($formname,$numpub) = @_;
       my %lt = &Apache::lonlocal::texthash(
                                             'default' => 'System wide - can be used for any courses system wide',
                                             'domain'  => 'Domain only - use limited to courses in the domain',
                                             'custom'  => 'Customized right of use ...',
                                             'public'  => 'Public - no authentication or authorization required for use',
                                             'closed'  => 'Closed - XML source is closed to everyone',
                                             'open'    => 'Open - XML source is open to people who want to use it',
                                             'sel'     => 'Select',
                                           );
       my $output;
       if ($numpub) {
           $output .= '<div class="LC_left_float">'.
                      '<fieldset><legend>'.&mt('Published Resources').'</legend>'.
                      &mt('[quant,_1,file] in Course Authoring Space also exist in Resource Space.',
                          $numpub).'</br />'.
                      &mt('Publish copied files in selected Authoring Space?').': '."\n".
                      '<label><input type="radio" name="respublish" checked="checked" value="1" />'.
                      &mt('Yes').'</label>'."\n".
                      '<label><input type="radio" name="respublish" value="0" />'.
                      &mt('No').'</label>'."\n".
                      '</fieldset></div>'."\n";
       }
       $output .= '<div class="LC_left_float">'.
                  '<fieldset><legend>'.&mt('Distribution to set in metadata').'</legend>'.
                  &mt('Copyright').': '.
                  '<select name="copyright" onchange="showHideCustom(this,'."'LC_customfile'".');">'."\n".
                  '<option value="default" selected="selected">'.$lt{'default'}.'</option>'."\n".
                  '<option value="domain">'.$lt{'domain'}.'</option>'."\n".
                  '<option value="public">'.$lt{'public'}.'</option>'."\n".
                  '<option value="custom">'.$lt{'custom'}.'</option>'."\n".
                  '</select><div id="LC_customfile" style="padding:0;clear:both;margin:0;border:0;display:none">'."\n".
                  '<input type="text" name="customrights" size="60" value="" />'.
                  '<a href="javascript:openbrowser('."'$formname','customrights','rights'".');">'.
                  $lt{'sel'}.'</a></div><br />'."\n".
                  &mt('Source').' :'.
                  '<select name="sourceavail">'."\n".
                  '<option value="closed" selected="selected">'.$lt{'closed'}.'</option>'."\n".
                  '<option value="open">'.$lt{'open'}.'</option>'."\n".
                  '</select><br />'."\n".
                  '</fieldset></div>'."\n";
       return $output;
   }
   
   sub crsres_fixup_meta {
       my ($dest,$coursenum,$coursedom,$ca,$cd,$copyright,$customdistfile,$sourceavail,$checkdeps) = @_;
       return unless (ref($checkdeps) eq 'HASH');
       if (open(my $fh,'<',$dest.'.meta')) {
           my ($output,$now,$setsourceavail);
           $now = time;
           if (($dest =~ /\.(xml|html|htm|xhtml|xhtm)$/i) || ($dest =~ /$LONCAPA::assess_re/)) {
               $setsourceavail = 1;
           }
           while (my $line=<$fh>) {
               chomp($line);
               if ($line eq "<authorspace>$coursenum:$coursedom</authorspace>") {
                   $output .= "<authorspace>$ca:$cd</authorspace>\n";
               } elsif ($line eq '<copyright>custom</copyright>') {
                   $output .= "<copyright>$copyright</copyright>\n";
               } elsif ($line =~ m{^<creationdate>\d+</creationdate>$}) {
                   $output .= "<creationdate>$now</creationdate>\n";
               } elsif ($line eq "<customdistributionfile>/res/$coursedom/$coursenum/default.rights</customdistributionfile>") {
                   $output .= "<customdistributionfile>$customdistfile</customdistributionfile>\n";
               } elsif ($line =~ m{^<sourceavail>(open|closed)</sourceavail>$}) {
                   if ($setsourceavail) {
                       $output .= "<sourceavail>$sourceavail</sourceavail>\n";
                   }
               } elsif ($line eq "<domain>$coursedom</domain>") {
                   $output .= "<domain>$cd</domain>\n";
               } elsif ($line =~ m{^<lastrevisiondate>\d+</lastrevisiondate>$}) {
                   $output .= "<lastrevisiondate>$now</lastrevisiondate>\n";
               } elsif ($line =~ m{^<modifyinguser>$match_username:$match_domain</modifyinguser>$}) {
                   $output .= "<modifyinguser>$env{'user.name'}:$env{'user.domain'}</modifyinguser>\n";
               } elsif ($line eq "<owner>$coursenum:$coursedom</owner>") {
                   $output .= "<owner>$ca:$cd</owner>\n";
               } elsif ($line =~ m{^<dependencies>(.+)</dependencies>$}) {
                   my @deps = split(/\s*,\s*/,$1);
                   my @newdeps;
                   my $changed = 0;
                   foreach my $dep (@deps) {
                       if ($dep =~ m{^/res/$coursedom/$coursenum/(.+)$}) {
                           my $rest = $1;
                           push(@newdeps,"/res/$cd/$ca/$rest");
                           $checkdeps->{$rest} = 1;
                           $changed ++;
                       } else {
                           push(@newdeps,$dep);
                       }
                   }
                   if ($changed) {
                       $output .= '<dependencies>'.join(',',@newdeps).'</dependencies>'."\n";
                   }
               } else {
                   $output .= "$line\n";
               }
           }
           close($fh);
           if (open(my $fh,'>',$dest.'.meta')) {
               print $fh $output;
               close($fh);
           }
       }
   }
   
   sub crsres_fixup {
       my ($dest,$coursenum,$coursedom,$ca,$cd,$subdir) = @_;
       my $outstring='';
       my $changes = 0;
       my @parser;
       $parser[0]=HTML::LCParser->new($dest);
       $parser[-1]->xml_mode(1);
       my $token;
       while (@parser) {
           while ($token=$parser[-1]->get_token) {
               if ($token->[0] eq 'S') {
                   my $tag=$token->[1];
                   my $lctag=lc($tag);
                   my %parms=%{$token->[2]};
                   foreach my $type ('src','href','background','bgimg') {
                       foreach my $key (keys(%parms)) {
                           if ($key =~ /^$type$/i) {
                               next if (($lctag eq 'img') && ($type eq 'src') &&
                                        ($parms{$key} =~ m{^data\:image/gif;base64,}));
                               if ($parms{$key} =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                                   $parms{$key} =~ s{^\Q/res/$coursedom/$coursenum/\E}{/res/$cd/$ca/$subdir/}si;
                                   $changes ++;
                               }
                           }
                       }
                   }
                   # probably a <randomlabel> image type <label>
                   # or a <image> tag inside <imageresponse> or <drawimage>
                   if (($lctag eq 'label' && defined($parms{'description'}))
                       || ($lctag eq 'image') || ($lctag eq 'import')) {
                       my $next_token=$parser[-1]->get_token();
                       if ($next_token->[0] eq 'T') {
                           $next_token->[1] =~ s/[\n\r\f]+//g;
                           if ($next_token->[1] =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                               $next_token->[1] =~ s{^\Q/res/$coursedom/$coursenum/\E}{/res/$cd/$ca/$subdir/}si;
                               $changes ++;
                           }
                       }
                       $parser[-1]->unget_token($next_token);
                   }
                   if ($lctag eq 'applet') {
                       my $havecodebase=0;
                       foreach my $key (keys(%parms)) {
                           if (lc($key) eq 'codebase') {
                               if ($parms{$key} =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                                   $parms{$key} =~ s{^\Q/res/$coursedom/$coursenum/\E}{/res/$cd/$ca/$subdir/}si;
                                   $changes ++;
                               }
                               $havecodebase = 1;
                           }
                       }
                       unless ($havecodebase) {
                           foreach my $key (keys(%parms)) {
                               if ($key =~ /(archive|code|object)/i) {
                                   if ($parms{$key} =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                                       $parms{$key} =~ s{^\Q/res/$coursedom/$coursenum/\E}{/res/$cd/$ca/$subdir/si};
                                       $changes ++;
                                   }
                               }
                           }
                       }
                   }
                   my $newparmstring='';
                   my $endtag='';
                   foreach my $parkey (keys(%parms)) {
                       if ($parkey eq '/') {
                           $endtag=' /';
                       } else {
                           my $quote=($parms{$parkey}=~/\"/?"'":'"');
                           $newparmstring.=' '.$parkey.'='.$quote.$parms{$parkey}.$quote;
                       }
                   }
                   if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; }
                   $outstring.='<'.$tag.$newparmstring.$endtag.'>';
                   if ($lctag eq 'm' || $lctag eq 'answer' || $lctag eq 'display' ||
                       $lctag eq 'tex') {
                       $outstring.=&Apache::lonxml::get_all_text_unbalanced('/'.$lctag,\@parser);
                   } elsif ($lctag eq 'script') {
                       if ($parms{'type'} eq 'loncapa/perl') {
                           $outstring.=&Apache::lonxml::get_all_text_unbalanced('/'.$lctag,\@parser);
                       } else {
                           my $needsupdate;
                           my $script = &Apache::lonxml::get_all_text_unbalanced('/'.$lctag,\@parser);
                           if ($script =~ m{\.addMediaSrc\((["'])((?!\1).+)\1\);}) {
                               my $src = $2;
                               if ($src =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                                   $needsupdate = 1;
                               }
                           }
                           if ($script =~ /\(document,\s*(['"])script\1,\s*\[([^\]]+)\]\);/s) {
                               my $scriptslist = $2;
                               my @srcs = split(/\s*,\s*/,$scriptslist);
                               foreach my $src (@srcs) {
                                   if ($src =~ /(["'])(?:(?!\1).)+\.js\1/) {
                                       my $quote = $1;
                                       my ($url) = ($src =~ m/\Q$quote\E([^$quote]+)\Q$quote\E/);
                                       if ($url =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                                           $needsupdate = 1;
                                       }
                                   }
                               }
                           }
                           if ($script =~ m{loadScript\(\s*(['"])((?:(?!\1).)+\.js)\1,\s*function}is) {
                               my $src = $2;
                               if ($src =~ m{^\Q/res/$coursedom/$coursenum/\E}si) {
                                   $needsupdate = 1;
                               }
                           }
                           if ($needsupdate) {
                               $script =~ s{^\Q/res/$coursedom/$coursenum/\E}{/res/$cd/$ca/$subdir/gsi};
                               $changes ++;
                           }
                           $outstring .= $script;
                       }
                   }
               } elsif ($token->[0] eq 'E') {
                   if ($token->[2]) {
                       unless ($token->[1] eq 'allow') {
                           $outstring.='</'.$token->[1].'>';
                       }
                   }
               } else {
                   $outstring.=$token->[1];
               }
           }
           pop(@parser);
       }
       if ($changes) {
           if (open(my $fh,'>',$dest)) {
               print $fh $outstring;
               close($fh);
           }
       }
   }
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, $ltitoolsref, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, $ltitoolsref, @files) = @_;
     my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,      my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
Line 661  sub group_import { Line 1703  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 670  sub group_import { Line 1712  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 683  sub group_import { Line 1731  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 833  sub group_import { Line 1884  sub group_import {
     }      }
     my $ext = 'false';      my $ext = 'false';
     if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }      if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
     $name = &LONCAPA::map::qtunescape($name);  
             if ($name eq '') {  
                 $name = &LONCAPA::map::qtunescape(&mt('Web Page'));  
             }  
             if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {              if ($url =~ m{^/uploaded/$coursedom/$coursenum/((?:docs|supplemental)/(?:default|\d+))/new\.html$}) {
                 my $filepath = $1;                  my $filepath = $1;
                 my $fname = $name;                  my $fname;
                 if ($fname =~ /^\W+$/) {                  if ($name eq '') {
                       $name = &mt('Web Page');
                     $fname = 'web';                      $fname = 'web';
                 } else {                  } else {
                     $fname =~ s/\W/_/g;                      $fname = $name;
                 }                      $fname=&Apache::lonnet::clean_filename($fname);
                 if (length($fname) > 15) {                      if ($fname eq '') {
                     $fname = substr($fname,0,14);                          $fname = 'web';
                       } elsif (length($fname) > 15) {
                           $fname = substr($fname,0,14);
                       }
                 }                  }
                   my $title = &Apache::loncommon::cleanup_html($name);
                 my $initialtext = &mt('Replace with your own content.');                  my $initialtext = &mt('Replace with your own content.');
                 my $newhtml = <<END;                  my $newhtml = <<END;
 <html>  <html>
 <head>  <head>
 <title>$name</title>  <title>$title</title>
 </head>  </head>
 <body bgcolor="#ffffff">  <body bgcolor="#ffffff">
 $initialtext  $initialtext
Line 874  END Line 1926  END
                     return (&mt('Failed to save new web page.'),1);                      return (&mt('Failed to save new web page.'),1);
                 }                  }
             }              }
               $name = &LONCAPA::map::qtunescape($name);
             $url  = &LONCAPA::map::qtunescape($url);              $url  = &LONCAPA::map::qtunescape($url);
     $LONCAPA::map::resources[$residx] =      $LONCAPA::map::resources[$residx] =
  join(':', ($name, $url, $ext, 'normal', 'res'));   join(':', ($name, $url, $ext, 'normal', 'res'));
Line 914  END Line 1967  END
         &storemap($coursenum, $coursedom, $folder.'.'.$container,1);          &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
     unless ($fatal) {      unless ($fatal) {
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
             &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);  
             my ($errtext,$fatal) = &mapread($coursenum,$coursedom,              my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                             $folder.'.'.$container);                                              $folder.'.'.$container);
         }          }
Line 1148  sub docs_change_log { Line 2200  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 1217  sub update_paste_buffer { Line 2275  sub update_paste_buffer {
 # Construct identifiers for current contents of user's paste buffer  # Construct identifiers for current contents of user's paste buffer
     if (@currpaste) {      if (@currpaste) {
         foreach my $suffix (@currpaste) {          foreach my $suffix (@currpaste) {
              my $cid = $env{'docs.markedcopy_crs_'.$suffix};              my $cid = $env{'docs.markedcopy_crs_'.$suffix};
              my $url = $env{'docs.markedcopy_url_'.$suffix};              my $url = $env{'docs.markedcopy_url_'.$suffix};
              my $mapidx = $env{'docs.markedcopy_map_'.$suffix};              my $mapidx = $env{'docs.markedcopy_map_'.$suffix};
              if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&              if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
                  ($url ne '')) {                  ($url ne '')) {
                  $pasteurls{$cid.'_'.$url.'_'.$mapidx} = 1;                  if ($url eq '/res/lib/templates/simpleproblem.problem') {
              }                      $pasteurls{$cid.'_'.$mapidx} = 1;
                   } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {
                       $pasteurls{$url} = 1;
                   } else {
                       $pasteurls{$cid.'_'.$url} = 1;
                   }
               }
         }          }
     }      }
   
Line 1232  sub update_paste_buffer { Line 2296  sub update_paste_buffer {
   
     my @pathitems = split(/\&/,$env{'form.folderpath'});      my @pathitems = split(/\&/,$env{'form.folderpath'});
     my @folderconf = split(/\:/,$pathitems[-1]);      my @folderconf = split(/\:/,$pathitems[-1]);
     my $ispage = $folderconf[4];      my $ispage = $folderconf[5];
   
     foreach my $item (@possibles) {      foreach my $item (@possibles) {
         my ($orderidx,$cmd) = split(/:/,$item);          my ($orderidx,$cmd) = split(/:/,$item);
Line 1245  sub update_paste_buffer { Line 2309  sub update_paste_buffer {
                                           $env{'form.folderpath'},\%curr_groups);                                            $env{'form.folderpath'},\%curr_groups);
         next if ($denied{'copy'});          next if ($denied{'copy'});
         $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};          $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
         next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));          if ($url eq '/res/lib/templates/simpleproblem.problem') {
               next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));
           } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {
               next if (exists($pasteurls{$url}));
           } else {
               next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));
           }
         my ($suffix,$errortxt,$locknotfreed) =          my ($suffix,$errortxt,$locknotfreed) =
             &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');              &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');
         if ($suffix ne '') {          if ($suffix ne '') {
Line 1334  sub print_paste_buffer { Line 2404  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 1347  sub print_paste_buffer { Line 2417  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 1389  sub print_paste_buffer { Line 2461  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 1442  sub print_paste_buffer { Line 2553  sub print_paste_buffer {
             }              }
             $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';              $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';
             if ($nopaste) {              if ($nopaste) {
                  $pasteitems .= $nopaste;                      $pasteitems .= ' <span class="LC_cusr_emph">'.$nopaste.'</span>';   
             } else {              } else {
                 if ($othercrs) {                  if ($othercrs) {
                     $pasteitems .= $othercrs;                      $pasteitems .= $othercrs;
Line 1692  sub do_paste_from_buffer { Line 2803  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 1733  sub do_paste_from_buffer { Line 2847  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 1791  sub do_paste_from_buffer { Line 2945  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 1819  sub do_paste_from_buffer { Line 2975  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 1918  sub do_paste_from_buffer { Line 3076  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 2092  sub do_paste_from_buffer { Line 3265  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 2140  sub clear_from_buffer { Line 3317  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 2201  sub get_newmap_url { Line 3402  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 2245  sub dbcopy { Line 3447  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 2264  sub dbcopy { Line 3577  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 2425  sub contained_map_check { Line 3765  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 2571  sub url_paste_fixups { Line 3930  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 2631  sub apply_fixups { Line 3990  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 2747  sub apply_fixups { Line 4108  sub apply_fixups {
             $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;              $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
         }          }
         my $mapcontent = &Apache::lonnet::getfile($key);          my $mapcontent = &Apache::lonnet::getfile($key);
           if (($mapcontent eq '-1') && ($before{'map'} eq 'supplemental') &&
               ($after{'map'} eq 'default') &&
               ($key =~ m{^/uploaded/$match_domain/$match_courseid/supplemental_\d+\.sequence$})) {
               $mapcontent = '<map>'."\n".
                             '<resource id="1" src="" type="start" />'."\n".
                             '<link from="1" to="2" index="1" />'."\n".
                             '<resource id="2" src="" type="finish" />'."\n".
                             '</map>';
           }
         if ($mapcontent eq '-1') {          if ($mapcontent eq '-1') {
             if (ref($errors) eq 'HASH') {              if (ref($errors) eq 'HASH') {
                 $errors->{$key} = 1;                  $errors->{$key} = 1;
Line 2773  sub apply_fixups { Line 4143  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 2793  sub apply_fixups { Line 4164  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 2935  sub apply_fixups { Line 4359  sub apply_fixups {
                 }                  }
             }              }
         }          }
           if (($updatetoolscache) || (@updatetoolsenc)) {
               &update_ltitools_caches($cdom,$cnum,$updatetoolscache,
                                       \@updatetoolsenc);
           }
     }      }
     return ('ok',\@msgs,$lockmsg);      return ('ok',\@msgs,$lockmsg);
 }  }
Line 3029  sub update_parameter { Line 4457  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 3481  sub editor { Line 4909  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 3504  sub editor { Line 4947  sub editor {
             push(@allmapidx,$res);              push(@allmapidx,$res);
         }          }
   
           if (($supplementalflag) && (!$allowed) && (!$env{'request.role.adv'})) {
               if (($ishidden) || ((&LONCAPA::map::getparameter($res,'parameter_hiddenresource'))[0]=~/^yes$/i)) {
                   $idx++;
                   next;
               }
           }
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,          $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
                               $coursenum,$coursedom,$crstype,                                $coursenum,$coursedom,$crstype,
                               $pathitem,$supplementalflag,$container,                                $pathitem,$supplementalflag,$container,
                               \%filters,\%curr_groups,$ltitoolsref,$canedit,                                \%filters,\%curr_groups,$ltitoolsref,$canedit,
                               $isencrypted,$navmapref,$hostname);                                $isencrypted,$ishidden,$navmapref,$hostname);
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
Line 3517  sub editor { Line 4966  sub editor {
     my $need_save;      my $need_save;
     if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {      if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {
         my $toolslink;          my $toolslink;
         if ($allowed) {          if ($allowed || $canedit) {
               my $helpitem = 'Navigation_Screen';
               if (!$allowed) {
                   $helpitem = 'Supplemental_Navigation';
               }
             $toolslink = '<table><tr><td>'              $toolslink = '<table><tr><td>'
                        .&Apache::loncommon::help_open_menu('Navigation Screen',                         .&Apache::loncommon::help_open_menu('Navigation Screen',
                                                            'Navigation_Screen',undef,'RAT')                                                             $helpitem,undef,'RAT')
                        .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'                         .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'
                        .'<td align="left"><ul id="LC_toolbar">'                         .'<td align="left"><ul id="LC_toolbar">'
                        .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '                         .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '
Line 3536  sub editor { Line 4989  sub editor {
                           .&Apache::loncommon::start_data_table_header_row()                            .&Apache::loncommon::start_data_table_header_row()
                           .'<th colspan="2">'.&mt('Move').'</th>'                            .'<th colspan="2">'.&mt('Move').'</th>'
                           .'<th colspan="3">'.&mt('Actions').'</th>'                            .'<th colspan="3">'.&mt('Actions').'</th>'
                           .'<th>'.&mt('Document').'</th>';                            .'<th>'.&mt('Document').'</th>'
                 if ($folder !~ /^supplemental/) {                            .'<th colspan="2">'.&mt('Settings').'</th>'
                     $to_show .= '<th colspan="2">'.&mt('Settings').'</th>';                            .&Apache::loncommon::end_data_table_header_row();
                 }  
                 $to_show .= &Apache::loncommon::end_data_table_header_row();  
                 if ($folder !~ /^supplemental/) {                  if ($folder !~ /^supplemental/) {
                     $lists{'canhide'} = join(',',@allidx);                      $lists{'canhide'} = join(',',@allidx);
                     $lists{'canrandomlyorder'} = join(',',@allmapidx);                      $lists{'canrandomlyorder'} = join(',',@allmapidx);
Line 3636  sub multiple_check_form { Line 5087  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 3674  sub multiple_check_form { Line 5125  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 3888  sub is_supplemental_title { Line 5339  sub is_supplemental_title {
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,          $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,
         $ltitoolsref,$canedit,$isencrypted,$navmapref,$hostname)=@_;          $ltitoolsref,$canedit,$isencrypted,$ishidden,$navmapref,$hostname)=@_;
     my ($foldertitle,$renametitle,$oldtitle);      my ($foldertitle,$renametitle,$oldtitle,$encodedtitle);
     if (&is_supplemental_title($title)) {      if (&is_supplemental_title($title)) {
  ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);   ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
           $encodedtitle=$title;
     } else {      } else {
  $title=&HTML::Entities::encode($title,'"<>&\'');   $title=&HTML::Entities::encode($title,'"<>&\'');
           $encodedtitle=$title;
  $renametitle=$title;   $renametitle=$title;
  $foldertitle=$title;   $foldertitle=$title;
     }      }
Line 3915  sub entryline { Line 5368  sub entryline {
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end,$form_common,$form_param);      my ($form_start,$form_end,$form_common,$form_param);
 # Edit commands  # Edit commands
     my ($esc_path, $path, $symb, $curralias);      my ($esc_path, $path, $symb, $shownsymb, $curralias);
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
  $esc_path=&escape($env{'form.folderpath'});   $esc_path=&escape($env{'form.folderpath'});
  $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
Line 4120  END Line 5573  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 4138  END Line 5592  END
                 $url='/adm/supplemental?';                  $url='/adm/supplemental?';
             }              }
  } else {   } else {
     &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);      $plainurl = $url;
  }   }
     }      }
   
     my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);      my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);
     my $orig_url = $url;      my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
     $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};      if ($container eq 'page') {
           $url=~s{^http(|s)(&colon;|:)//}{/ext/};
       } else {
           $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
       }
     if (!$supplementalflag && $residx && $symb) {      if (!$supplementalflag && $residx && $symb) {
         if ((!$isfolder) && (!$ispage)) {          if ((!$isfolder) && (!$ispage)) {
     (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);      (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
     $url=&Apache::lonnet::clutter($url);              if (($url =~ m{^ext/}) && ($container eq 'page')) {
                   $url=&Apache::lonnet::clutter_with_no_wrapper($url);
               } else {
                   $url=&Apache::lonnet::clutter($url);
               } 
     if ($url=~/^\/*uploaded\//) {      if ($url=~/^\/*uploaded\//) {
         $url=~/\.(\w+)$/;          $url=~/\.(\w+)$/;
         my $embstyle=&Apache::loncommon::fileembstyle($1);          my $embstyle=&Apache::loncommon::fileembstyle($1);
Line 4163  END Line 5625  END
     } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {      } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {
                 my $wrapped = $1;                  my $wrapped = $1;
                 my $exturl = $2;                  my $exturl = $2;
                 if ($wrapped eq '') {                  if (($wrapped eq '') && ($container ne 'page')) { 
                     $url='/adm/wrapper'.$url;                      $url='/adm/wrapper'.$url;
                 }                  }
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {                  if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {
Line 4174  END Line 5636  END
             } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {              } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {
                 if (($ENV{'SERVER_PORT'} == 443) &&                  if (($ENV{'SERVER_PORT'} == 443) &&
                     ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {                      ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                     unless (&Apache::lonnet::uses_sts()) {                      unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                         $url .= '?usehttp=1';                          $url .= '?usehttp=1';
                     }                      }
                     $nomodal = 1;                      $nomodal = 1;
                 }                  }
             }              }
             if (&Apache::lonnet::symbverify($symb,$url)) {              my $checkencrypt;
                 my $shownsymb = $symb;              if (!$env{'request.role.adv'}) {
                 if ($isexternal) {  
                     if ($url =~ /^([^#]+)#([^#]+)$/) {  
                         $url = $1;  
                         $anchor = $2;  
                         my $escan = &escape('#');  
                         $shownsymb =~ s/^([^\#]+)#([^\#]+)$/$1$escan$2/;  
                     }  
                 }  
                 unless ($env{'request.role.adv'}) {  
                     if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {  
                         $url = '';  
                     }  
                     if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) {  
                         $url = '';  
                         $hiddenres = 1;  
                     }  
                 }  
                 if ($url ne '') {  
                     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);  
                 }  
             } elsif (!$env{'request.role.adv'}) {  
                 my $checkencrypt;  
                 if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||                  if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||
                       $isencrypted || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {                      ($isencrypted) || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {
                     $checkencrypt = 1;                      $checkencrypt = 1;
                 } elsif (ref($navmapref)) {                  } elsif (ref($navmapref)) {
                     unless (ref($$navmapref)) {                      unless (ref($$navmapref)) {
Line 4213  END Line 5653  END
                     }                      }
                     if (ref($$navmapref)) {                      if (ref($$navmapref)) {
                         if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') {                          if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') {
                             $checkencrypt = 1;                                     $checkencrypt = 1;
                         }                          }
                     }                      }
                 }                  }
                 if ($checkencrypt) {              }
                     my $shownsymb = &Apache::lonenc::encrypted($symb);              if ($checkencrypt) {
                     my $shownurl = &Apache::lonenc::encrypted($url);                  my $currenc = $env{'request.enc'};
                     if (&Apache::lonnet::symbverify($shownsymb,$shownurl)) {                  $env{'request.enc'} = 1;
                         $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);                  $shownsymb = &Apache::lonenc::encrypted($symb);
                         if ($env{'request.enc'} ne '') {                  my $shownurl = &Apache::lonenc::encrypted($url);
                             delete($env{'request.enc'});                  if (&Apache::lonnet::symbverify($symb,$url)) {
                         }                      $url = $shownurl;
                     } else {  
                         $url='';  
                     }  
                 } else {                  } else {
                     $url='';                      $url = '';
                   }
                   $env{'request.enc'} = $currenc;
               } elsif (&Apache::lonnet::symbverify($symb,$url)) {
                   $shownsymb = $symb;
                   if ($isexternal) {
                       $url =~ s/\#[^#]+$//;
                       if ($container eq 'page') {
                           $url = &Apache::lonnet::clutter($url);
                       }
                 }                  }
             } else {              } else {
                 $url='';                  $url = '';
               }
               unless ($env{'request.role.adv'}) {
                   if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                       $url = '';
                   }
                   if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) {
                       $url = '';
                       $hiddenres = 1;
                   }
               }
               if (($url ne '') && ($shownsymb ne '')) {
                   $url .= (($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
             }              }
  }   }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
Line 4241  END Line 5699  END
                 $url = $1;                  $url = $1;
                 $anchor = $2;                  $anchor = $2;
                 if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {                  if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {
                     unless (&Apache::lonnet::uses_sts()) {                      unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                         if ($hostname ne '') {                          if ($hostname ne '') {
                             $url = 'http://'.$hostname.$url;                              $url = 'http://'.$hostname.$url;
                         }                          }
Line 4253  END Line 5711  END
         } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {          } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {
             if (($ENV{'SERVER_PORT'} == 443) &&              if (($ENV{'SERVER_PORT'} == 443) &&
                 ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {                  ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                 unless (&Apache::lonnet::uses_sts()) {                  unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                     if ($hostname ne '') {                      if ($hostname ne '') {
                         $url = 'http://'.$hostname.$url;                          $url = 'http://'.$hostname.$url;
                     }                      }
Line 4261  END Line 5719  END
                 }                  }
                 $nomodal = 1;                  $nomodal = 1;
             }              }
           } elsif (($uploaded) && ($url ne '/adm/supplemental?') && ($url ne '/adm/coursedocs?')) {
               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 4272  END Line 5746  END
         if (!$allowed && $supplementalflag) {          if (!$allowed && $supplementalflag) {
             $folderpath.=$containerarg.'&'.$foldername;              $folderpath.=$containerarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);              $url.='folderpath='.&escape($folderpath);
               if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
                   $hiddenfolder = 1;
               }
         } else {          } else {
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,              my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
                                                         'parameter_randompick'))[0];                                                          'parameter_randompick'))[0];
Line 4348  $form_common."\n". Line 5825  $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 4357  $form_end; Line 5834  $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 4392  $form_end; Line 5869  $form_end;
                     &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,                      &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,
                                                             $switchserver,                                                              $switchserver,
                                                             $forceedit,                                                              $forceedit,
                                                             undef,$symb,                                                              undef,$symb,$shownsymb,
                                                             &escape($env{'form.folderpath'}),                                                              &escape($env{'form.folderpath'}),
                                                             $renametitle,$hostname,                                                              $renametitle,$hostname,
                                                             '','',1,$suppanchor);                                                              '','',1,$suppanchor);
Line 4411  $form_end; Line 5888  $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 4422  $form_end; Line 5899  $form_end;
                    $lt{'sa'}.'</a></span>';                     $lt{'sa'}.'</a></span>';
         }          }
     }      }
     $line.='</td><td>';      $line.='</td><td><span class="LC_nobreak">';
     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 4434  $form_end; Line 5920  $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 ($nomodal) {         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 ((&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 4452  $form_end; Line 5953  $form_end;
     }      }
     $line.='</span></td><td'.$tdwidth.'>';      $line.='</span></td><td'.$tdwidth.'>';
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'">'.$title.'</a>';         if ($nolink) {
              $line.=$title;
          } else {
              $line.='<a href="'.$url.'">'.$title.'</a>';
          }
          if (!$allowed && $supplementalflag && $canedit && $isfolder) {
              my $editicon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';
              my $editurl = $url;
              $editurl =~ s{^\Q/adm/supplemental?\E}{/adm/coursedocs?command=direct&amp;forcesupplement=1&amp;};
              $line .= '&nbsp;'.'<a href="'.$editurl.'">'.
                       '<img src="'.$editicon.'" alt="'.&mt('Edit Content').'" title="'.&mt('Edit Content').'" />'.
                       '</a>';
          }
          if ((($hiddenfolder) || ($hiddenres)) && (!$allowed) && ($supplementalflag))  {
              $line.= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
          }
     } elsif ($url) {      } elsif ($url) {
        if ($nomodal) {         if ($nolink) {
              $line.=$title;
          } elsif ($nomodal) {
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.             $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.
                   $title.'</a>';                    $title.'</a>';
        } else {         } else {
Line 4473  $form_end; Line 5991  $form_end;
     $line .= '</td>';      $line .= '</td>';
     $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');      $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');
     $rand_order_text = '&nbsp;' if ($rand_order_text eq '');      $rand_order_text = '&nbsp;' if ($rand_order_text eq '');
     if (($allowed) && ($folder!~/^supplemental/)) {      if ($uploaded && $url && !$isfolder && !$ispage) {
   my %lt=&Apache::lonlocal::texthash(          if (($plainurl ne '') && ($env{'request.role.adv'} || $allowed || !$hiddenres)) {
        'hd' => 'Hidden',              &Apache::lonnet::allowuploaded('/adm/coursedoc',$plainurl);
        'ec' => 'URL hidden');  
         my ($enctext,$hidtext);  
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {  
             $enctext = ' checked="checked"';  
             if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {  
                 push(@{$filtersref->{'encrypturl'}},$orderidx);  
             }  
         }          }
       }
       if ($allowed) {
           my %lt=&Apache::lonlocal::texthash(
                                 'hd' => 'Hidden',
                                 'ec' => 'URL hidden');
           my ($enctext,$hidtext,$formhidden,$formurlhidden);
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {          if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
             $hidtext = ' checked="checked"';              $hidtext = ' checked="checked"';
             if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {              if (($ishash) && (ref($filtersref->{'hiddenresource'}) eq 'ARRAY')) {
                 push(@{$filtersref->{'hiddenresource'}},$orderidx);                  push(@{$filtersref->{'hiddenresource'}},$orderidx);
             }              }
         }          }
         my $formhidden = 'edit_hiddenresource_'.$orderidx;          $formhidden = 'edit_hiddenresource_'.$orderidx;
         my $formurlhidden = 'edit_encrypturl_'.$orderidx;          $line.=(<<ENDPARMS);
  $line.=(<<ENDPARMS);  
   <td class="LC_docs_entry_parameter">    <td class="LC_docs_entry_parameter">
     <form action="/adm/coursedocs" method="post" name="$formhidden">      <form action="/adm/coursedocs" method="post" name="$formhidden">
     $form_param      $form_param
     $form_common      $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $disabled /> $lt{'hd'}</label>      <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $disabled /> $lt{'hd'}</label>
     $form_end      $form_end
   ENDPARMS
           if ($folder =~/^supplemental/) {
               $line.= "\n    <td>";
           } else {
               if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {
                   $enctext = ' checked="checked"';
                   if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {
                       push(@{$filtersref->{'encrypturl'}},$orderidx);
                   }
               }
               $formurlhidden = 'edit_encrypturl_'.$orderidx;
       $line.=(<<ENDPARMS);
     <br />      <br />
     <form action="/adm/coursedocs" method="post" name="$formurlhidden">      <form action="/adm/coursedocs" method="post" name="$formurlhidden">
     $form_param      $form_param
Line 4509  $form_end; Line 6037  $form_end;
   <td class="LC_docs_entry_parameter">$rand_pick_text<br />    <td class="LC_docs_entry_parameter">$rand_pick_text<br />
                                       $rand_order_text</td>                                        $rand_order_text</td>
 ENDPARMS  ENDPARMS
           }
     }      }
     $line.=&Apache::loncommon::end_data_table_row();      $line.=&Apache::loncommon::end_data_table_row();
     return $line;      return $line;
Line 4842  sub short_urls { Line 6371  sub short_urls {
         $r->rflush();          $r->rflush();
         my $readonly;          my $readonly;
         if ($canedit) {          if ($canedit) {
             my ($numnew,$errors) = &Apache::loncommon::make_short_symbs($cdom,$cnum,$navmap);              my ($numnew,$errors) = &Apache::loncommon::get_requested_shorturls($cdom,$cnum,$navmap);
             if ($numnew) {              if ($numnew) {
                 $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');                  $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');
             }              }
Line 4858  sub short_urls { Line 6387  sub short_urls {
         }          }
         my %currtiny = &Apache::lonnet::dump('tiny',$cdom,$cnum);          my %currtiny = &Apache::lonnet::dump('tiny',$cdom,$cnum);
         $r->print(&Apache::loncourserespicker::create_picker($navmap,'shorturls',$formname,$crstype,undef,          $r->print(&Apache::loncourserespicker::create_picker($navmap,'shorturls',$formname,$crstype,undef,
                                                              undef,undef,undef,undef,undef,\%currtiny,$readonly));                                                               undef,undef,undef,undef,undef,\%currtiny,undef,$readonly));
     }      }
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
 }  }
Line 4877  sub contentverifyform { Line 6406  sub contentverifyform {
               &mt('No').'</label>'.('&nbsp;'x2).                &mt('No').'</label>'.('&nbsp;'x2).
               '<label><input type="radio" name="checkstale" value="1" />'.                '<label><input type="radio" name="checkstale" value="1" />'.
               &mt('Yes').'</label></span></p><p>'.                &mt('Yes').'</label></span></p><p>'.
               '<input type="submit" value="'.&mt('Verify content').' "/>'.                '<input type="submit" value="'.&mt('Verify Content').' "/>'.
               '<input type="hidden" value="1" name="tools" />'.                '<input type="hidden" value="1" name="tools" />'.
               '<input type="hidden" value="1" name="verify" /></p></form>');                '<input type="hidden" value="1" name="verify" /></p></form>');
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
Line 5333  sub handler { Line 6862  sub handler {
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};      my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};      my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
       my $coursehome=$env{'course.'.$env{'request.course.id'}.'.home'};
   
 # get docroot  # get docroot
     my $londocroot = $r->dir_config('lonDocRoot');      my $londocroot = $r->dir_config('lonDocRoot');
Line 5348  sub handler { Line 6878  sub handler {
                'Load_Map','Supplemental','Score_Upload_Form',                 'Load_Map','Supplemental','Score_Upload_Form',
                'Adding_Pages','Importing_LON-CAPA_Resource',                 'Adding_Pages','Importing_LON-CAPA_Resource',
                'Importing_IMS_Course','Uploading_From_Harddrive',                 'Importing_IMS_Course','Uploading_From_Harddrive',
                        'Course_Roster','Web_Page','Dropbox','Simple_Problem') {                         'Course_Roster','Web_Page','Dropbox','Simple_Problem',
                          'Standard_Problem','Course_Resources',
                          'Search_LON-CAPA_Resource','Import_Stored_Links') {
  $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);   $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }      }
     # Composite help files      # Composite help files
Line 5364  sub handler { Line 6896  sub handler {
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
     
     my ($allowed,$canedit,$canview,$noendpage,$disabled);      my ($allowed,$canedit,$canview,$noendpage,$disabled);
   # does this user have privileges to modify content.
       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
 # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.  # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
     unless ($r->uri eq '/adm/supplemental') {          unless ($r->uri eq '/adm/supplemental') {
         # does this user have privileges to modify content.    
         if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
             $allowed = 1;              $allowed = 1;
             $canedit = 1;          }
             $canview = 1;          $canedit = 1;
         } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) {          $canview = 1;
       } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) {
   # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
           unless ($r->uri eq '/adm/supplemental') {
             $allowed = 1;              $allowed = 1;
             $canview = 1;  
         }          }
           $canview = 1;
     }      }
     unless ($canedit) {      unless ($canedit) {
         $disabled = ' disabled="disabled"';          $disabled = ' disabled="disabled"';
Line 5416  sub handler { Line 6951  sub handler {
       &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');
       &checkversions($r,$canedit);        &checkversions($r,$canedit);
   } elsif ($canedit && $env{'form.dumpcourse'}) {    } elsif ($canedit && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Copy uploaded content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
     } elsif (($canedit || $canview) && ($env{'form.copyauthored'})) {
         &init_breadcrumbs('copyauthored','Copy from Course Authoring to User Authoring');
         my $readonly;
         if (!$canedit) {
             $readonly = 1;
         }
         &copycrsauthored($r,$coursenum,$coursedom,$coursehome,$readonly);
   } elsif ($canedit && $env{'form.exportcourse'}) {    } elsif ($canedit && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
       &Apache::imsexport::exportcourse($r);        &Apache::imsexport::exportcourse($r);
Line 5479  sub handler { Line 7021  sub handler {
 # Get the parameters that may be needed  # Get the parameters that may be needed
 #  #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['folderpath',                                              ['folderpath','title',
                                              'forcesupplement','forcestandard',                                               'forcesupplement','forcestandard',
                                              'tools','symb','command','supppath']);                                               'tools','symb','command','supppath']);
   
Line 5520  sub handler { Line 7062  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; }
   
     if ($env{'form.folderpath'} ne '') {      if ($env{'form.folderpath'} ne '') {
         my @items = split(/\&/,$env{'form.folderpath'});          &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
         my $badpath;  
         for (my $i=0; $i<@items; $i++) {  
             my $odd = $i%2;  
             if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) {  
                 $badpath = 1;  
             } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) {  
                 $badpath = 1;  
             }  
             last if ($badpath);  
         }  
         if ($badpath) {  
             delete($env{'form.folderpath'});  
         }  
     }      }
   
       my $backto_supppath;
     if ($env{'form.supppath'} ne '') {      if ($env{'form.supppath'} ne '') {
         my @items = split(/\&/,$env{'form.supppath'});          if ($supplementalflag && $allowed) {
         my $badpath;              $backto_supppath = &validate_supppath($coursenum,$coursedom);
         for (my $i=0; $i<@items; $i++) {  
             my $odd = $i%2;  
             if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {  
                 $badpath = 1;   
             }  
             last if ($badpath);  
         }  
         if ($badpath) {  
             delete($env{'form.supppath'});  
         }          }
     }      }
   
Line 5564  sub handler { Line 7088  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 5575  sub handler { Line 7100  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 5613  sub handler { Line 7138  sub handler {
         } else {          } else {
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         }          }
           if ($env{'form.folderpath'} ne '') {
               &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
           }
     }      }
      
 # If we are not allowed to make changes, all we can see are supplemental docs  # Set folderpath if we are not allowed to make changes and this is supplemental content
     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 5627  sub handler { Line 7155  sub handler {
                                   .'&'.                                    .'&'.
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
 # If allowed and user's role is not advanced check folderpath is not hidden    # If allowed and user's role is not advanced check folderpath is not hidden
     if (($allowed) && (!$env{'request.role.adv'}) &&       my $hidden_and_empty;
         ($env{'form.folderpath'} ne '') && (!$supplementalflag)) {      if (($allowed) && (!$env{'request.role.adv'}) && ($env{'form.folderpath'} ne '')) {
         my $folderurl;          my ($folderurl,$foldername,$hiddenfolder);
         my @pathitems = split(/\&/,$env{'form.folderpath'});          my @pathitems = split(/\&/,$env{'form.folderpath'});
         my $folder = $pathitems[-2];          my $folder = $pathitems[-2];
         if ($folder eq '') {          if ($folder eq '') {
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         } else {          } else {
             $folderurl = "uploaded/$coursedom/$coursenum/$folder";              $folderurl = "uploaded/$coursedom/$coursenum/$folder";
             if ((split(/\:/,$pathitems[-1]))[4]) {              if ((split(/\:/,$pathitems[-1]))[5]) {
                 $folderurl .= '.page';                  $folderurl .= '.page';
             } else {              } else {
                 $folderurl .= '.sequence';                  $folderurl .= '.sequence';
             }              }
             unless (ref($navmap)) {              if ($supplementalflag) {
                 $navmap = Apache::lonnavmaps::navmap->new();                  ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*)::(|1):::$/);
             }                  $foldername = &HTML::Entities::decode(&unescape($foldername));
             if (ref($navmap)) {                  my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
                 if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {                  if (ref($supplemental) eq 'HASH') {
                     my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);                      my ($suppmap,$suppmapnum);
                     unless (@resources) {                      if ($folder eq 'supplemental') {
                         undef($env{'form.folderpath'});                          $suppmap = 'default';
                           $suppmapnum = 0;
                       } elsif ($folder =~ /^supplemental_(\d+)$/) {
                           $suppmap = $1;
                           $suppmapnum = $suppmap;
                       }
                       if ($hiddenfolder) {
                           my $hascontent;
                           foreach my $key (reverse(sort(keys(%{$supplemental->{'ids'}})))) {
                               if ($key =~ m{^\Q/uploaded/$coursedom/$coursenum/supplemental/$suppmap/\E}) {
                                   $hascontent = 1;
                               } elsif (ref($supplemental->{'ids'}->{$key}) eq 'ARRAY') {
                                   foreach my $id (@{$supplemental->{'ids'}->{$key}}) {
                                       if ($id =~ /^$suppmapnum\:/) {
                                           $hascontent = 1;
                                           last;
                                       }
                                   }
                               }
                               last if ($hascontent);
                           }
                           unless ($hascontent) {
                               if ($foldername ne '') {
                                   $hidden_and_empty = $foldername;
                               } else {
                                   $hidden_and_empty = $folder;
                               }
                           }
                       }
                   }
               } else {
                   unless (ref($navmap)) {
                       $navmap = Apache::lonnavmaps::navmap->new();
                   }
                   ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*):|\d+:|1:(|1):|1:|1$/);
                   $foldername = &HTML::Entities::decode(&unescape($foldername));
                   if (ref($navmap)) {
                       if ($hiddenfolder ||
                           (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes')) {
                           my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);
                           unless (@resources) {
                               if ($foldername ne '') {
                                   $hidden_and_empty = $foldername;
                               } else {
                                   $hidden_and_empty = $folder;
                               }
                           }
                     }                      }
                 }                  }
             }              }
               if ($hidden_and_empty ne '') {
                   splice(@pathitems,-2);
                   if (@pathitems) {
                       $env{'form.folderpath'} = join('&',@pathitems);
                   } else {
                       undef($env{'form.folderpath'});
                   }
               }
         }          }
     }      }
   
   
 # If after all of this, we still don't have any paths, make them  # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {      unless ($env{'form.folderpath'}) {
        if ($supplementalflag) {         if ($supplementalflag) {
Line 5741  sub handler { Line 7322  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 5750  sub handler { Line 7342  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 5773  sub handler { Line 7371  sub handler {
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
   
     if ($showdoc) {      if ($showdoc) {
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,          my $args;
                                                 {'force_register' => $showdoc,}));          if ($supplementalflag) {
               my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');
               my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
               $args = {'bread_crumbs' => $brcrum,
                        'bread_crumbs_nomenu' => 1};
           } else {
               $args = {'force_register' => $showdoc};
           }
           $r->print(&Apache::loncommon::start_page("$crstype documents",undef,$args));
     } elsif ($toolsflag) {      } elsif ($toolsflag) {
         my ($breadtext,$breadtitle);          my ($breadtext,$breadtitle);
         $breadtext = "$crstype Editor";          $breadtext = "$crstype Editor";
Line 5792  sub handler { Line 7398  sub handler {
                      $breadtitle)                       $breadtitle)
                  );                   );
     } elsif ($r->uri eq '/adm/supplemental') {      } elsif ($r->uri eq '/adm/supplemental') {
           unless ($env{'request.role.adv'}) {
               unless (&Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom)) {
                   $r->internal_redirect('/adm/navmaps');
                   return OK;
               }
           }
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
           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 5822  sub handler { Line 7439  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 5833  sub handler { Line 7451  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 5874  sub handler { Line 7496  sub handler {
   
   if ($allowed && $toolsflag) {    if ($allowed && $toolsflag) {
       $r->print(&startContentScreen('tools'));        $r->print(&startContentScreen('tools'));
       $r->print(&generate_admin_menu($crstype,$canedit));        $r->print(&generate_admin_menu($crstype,$canedit,$coursenum,$coursedom));
       $r->print(&endContentScreen());        $r->print(&endContentScreen());
   } elsif ((!$showdoc) && (!$uploadphase)) {    } elsif ((!$showdoc) && (!$uploadphase)) {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
Line 5882  sub handler { Line 7504  sub handler {
  'copm' => 'All documents out of a published map into this folder',   'copm' => 'All documents out of a published map into this folder',
                 'upfi' => 'Upload File',                  'upfi' => 'Upload File',
                 'upld' => 'Upload Content',                  'upld' => 'Upload Content',
                 'srch' => 'Search',                  'srch' => 'Search Repository',
                 'impo' => 'Import',                  'impo' => 'Import from Repository',
  'lnks' => 'Import from Stored Links',   'lnks' => 'Import from Stored Links',
                 'impm' => 'Import from Assembled Map',                  'impm' => 'Import from Assembled Map',
                 'imcr' => 'Import from Course Resources',                  'imcr' => 'Import from Course Resources',
Line 5901  sub handler { Line 7523  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 5921  sub handler { Line 7544  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 5970  sub handler { Line 7594  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 5993  CHBO Line 7614  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 6019  IMSFORM Line 7642  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 6057  FUFORM Line 7682  FUFORM
         </form>          </form>
   
 SEDFFORM  SEDFFORM
         my $importcrsresform;          my ($importcrsresform,$checkcrsres);
         my ($numdirs,$pickfile) =           if ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.crsauthor'}) {
             &Apache::loncommon::import_crsauthor_form('crsresimportform','coursepath','coursefile',              $checkcrsres = 1;
                                                       "resize_scrollbox('contentscroll','1','0');",          } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.crsauthor'} ne '0') {
                                                       undef,'res');              my %domdefs=&Apache::lonnet::get_domain_defaults($coursedom);
         if ($pickfile) {              my $type = lc($env{'course.'.$env{'request.course.id'}.'.type'});
             $importcrsresform=(<<CRSFORM);              unless (($type eq 'community') || ($type eq 'placement')) {
         <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res','$numdirs');">                  $type = 'unofficial';
                   if ($env{'course.'.$env{'request.course.id'}.'internal.coursecode'} ne '') {
                       $type = 'official';
                   } elsif ($env{'course.'.$env{'request.course.id'}.'internal.textbook'} ne '') {
                       $type = 'textbook';
                   } else {
                       $type = 'unofficial';
                   }
               }
               if ($domdefs{$type.'crsauthor'}) {
                   $checkcrsres = 1;
               }
           }
           if ($checkcrsres) {
               my ($numdirs,$pickfile) = 
                   &Apache::loncommon::import_crsauthor_form('coursepath','coursefile',
                                                             "resize_scrollbox('contentscroll','1','0');",
                                                             undef,'res');
               if ($pickfile) {
                   $importcrsresform=(<<CRSFORM);
           <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
               }
         }          }
   
         my $fromstoredjs;          my $fromstoredjs;
Line 6089  CRSFORM Line 7742  CRSFORM
         }          }
   
  my @importpubforma = (   my @importpubforma = (
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>$help{'Search_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>' },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>'.$help{'Import_Stored_Links'} },
         { '<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 ($importcrsresform) {
             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/impcrsau.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 6295  NROSTFORM Line 7948  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 %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);                  $rolehomes .= '<input type="hidden" id="rolehome_coauthor_'.$roletype.'_'.$audom.'/'.$auname.'" '.
                     $select_menus{$key}->{'default'} = '/';                                'name="rolehome_coauthor" value="'.$roletype.'='.$audom.'/'.$auname.'='.$rolehome.'" />'."\n";
                     $select_menus{$key}->{'select2'}->{'/'} = '/';              }
                     my @ordered = ('/');          }
                     foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {          my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};
                         $select_menus{$key}->{'select2'}->{$relpath} = $relpath;          if (grep(/^\Q$crshome\E$/,@ids)) {
                         push(@ordered,$relpath);              $is_home{'course'} = 1;
                     }          }
                     $select_menus{$key}->{'order'} = \@ordered;          $rolehomes .= '<input type="hidden" id="rolehome_course" name="rolehome_course" value="'.$crshome.'" />'."\n";
                 } else {          my $pickdir = $lt{'loca'}.
                     $select_menus{$key}->{'select2'}->{'switch'} = &mt('Switch server required');                     '<select name="authorrole" onchange="populateDirSelects(this.form,'."'authorrole','authorpath'".',1,1,0);">'."\n".
                     $select_menus{$key}->{'default'} = 'switch';                     '<option value="" selected="selected">'.&mt('Select').'</option>'."\n";
                     $select_menus{$key}->{'order'} = ['switch'];          if ($env{'user.author'}) {
                 }              $pickdir .= '<option value="author">'.&Apache::lonnet::plaintext('au').'</option>'."\n";
                 $numauthor ++;          }
             }          if (keys(%by_roletype)) {
         }              foreach my $possrole ('ca','aa') {
         my ($pickdir,$showtitle);                  if (ref($by_roletype{$possrole}) eq 'HASH') {
         if ($numauthor) {                      my $roletitle = &Apache::lonnet::plaintext($possrole);
             my @order;                      foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) {
             my $defrole;                          my ($none,$where,$auname,$audom) = split(/\//,$toppath{$author});
             if ($env{'user.author'}) {                          $pickdir .= '<option value="'.$author.'___'.$possrole.'">'.
                 push(@order,'author');                                       $roletitle." ($audom/$auname)</option>\n";
                 $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);  
                         }  
                     }  
                 }  
             }  
             $select_menus{'course'}->{'text'} = &mt('Course Resource');  
             if (grep(/^\Q$crshome\E$/,@ids)) {  
                 my $is_home = 1;  
                 my %subdirs;  
                 my $toppath="/priv/$coursedom/$coursenum";  
                 &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);  
                 $numcrsdirs = keys(%subdirs);  
                 $select_menus{'course'}->{'default'} = '/';  
                 $select_menus{'course'}->{'select2'}->{'/'} = '/';  
                 my @ordered = ('/');  
                 foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {  
                     $select_menus{'course'}->{'select2'}->{$relpath} = $relpath;  
                     push(@ordered,$relpath);  
                 }  
                 $select_menus{'course'}->{'order'} = \@ordered;  
             } else {  
                 $select_menus{'course'}->{'select2'}->{'switch'} = &mt('Switch server required');  
                 $select_menus{'course'}->{'default'} = 'switch';  
                 $select_menus{'course'}->{'order'} = ['switch'];  
             }  
             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";     
                 }                  }
             }              }
         }          }
           if ($checkcrsres) {
               $pickdir .= '<option value="course">'.&mt('Course Resource').'</option>'."\n";
           }
           $pickdir .= '</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');
         my @noexamplelink = ('blank.problem','blank.library','script.library');          my @noexamplelink = ('blank.problem','blank.library','script.library');
Line 6464  NWEBFORM Line 8047  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;
         <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res','$numauthor','$numcrsdirs');">          if (($env{'user.author'}) || ($checkcrsres)) {
         $lt{'stpr'}</a>$help{'Course_Resource'}              $crsresform=(<<RESFORM);
           <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">
           $lt{'stpr'}</a>$help{'Standard_Problem'}
         <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;">
         <legend>$lt{'stpr'}</legend>          <legend>$lt{'stpr'}</legend>
         <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;">
           <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 6481  NWEBFORM Line 8069  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 />
           <div id="newresource" style="display:none">
         <p>          <p>
         <div id="newresource" style="display:$showtitle">  
         $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 6492  NWEBFORM Line 8081  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 id="stdprobswitch" style="display:none;">
           $rolehomes
           <input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" />
           </div>
         </fieldset>          </fieldset>
         </form>          </form>
   
 RESFORM  RESFORM
           }
   
 my $specialdocumentsform;  my $specialdocumentsform;
 my @specialdocumentsforma;  my @specialdocumentsforma;
Line 6567  NSYLFORM Line 8161  NSYLFORM
  $help{'Group Portfolio'}   $help{'Group Portfolio'}
  </form>   </form>
 NGFFORM  NGFFORM
  @specialdocumentsforma=(          if ($container eq 'page') {
               @specialdocumentsforma=(
           {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
               );
           } else {
       @specialdocumentsforma=(
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
         );              );
           }
         $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));          $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
   
         my @external = (          my @external = (
         {'<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 6600  NGFFORM Line 8200  NGFFORM
         @gradingforma=(          @gradingforma=(
         {'<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},  
         );          );
           if ($crsresform) {
               push(@gradingforma,
                    {'<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));
   
         @communityforma=(          @communityforma=(
Line 6616  NGFFORM Line 8220  NGFFORM
   
 my %orderhash = (  my %orderhash = (
                 'aa' => ['Upload',$fileuploadform],                  'aa' => ['Upload',$fileuploadform],
                 'bb' => ['Import',$importpubform],                  'bb' => ['External',$externalform],
                 'cc' => ['External',$externalform],                  'cc' => ['Import',$importpubform],
                 'dd' => ['Grading',$gradingform],                  'dd' => ['Assessment',$gradingform],
                   'ff' => ['Other',$specialdocumentsform],
                 );                  );
 unless ($container eq 'page') {  unless ($container eq 'page') {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
     $orderhash{'ee'} = ['Collaboration',$communityform];      $orderhash{'ee'} = ['Collaboration',$communityform];
     $orderhash{'ff'} = ['Other',$specialdocumentsform];  
 }  }
   
  $hadchanges=0;   $hadchanges=0;
Line 6651  unless ($container eq 'page') { Line 8255  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 6671  unless ($container eq 'page') { Line 8275  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 6683  unless ($container eq 'page') { Line 8289  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 6762  my @specialdocs = ( Line 8369  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 6780  my %suporderhash = ( Line 8387  my %suporderhash = (
                 'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]                  'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]
                 );                  );
         if ($supplementalflag) {          if ($supplementalflag) {
            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,              $suppchanges = 0;
                                $supplementalflag,\%suporderhash,$iconpath,$pathitem,              my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                \%ltitools,$canedit,$hostname);                                  $supplementalflag,\%suporderhash,$iconpath,$pathitem,
            if ($error) {                                  \%ltitools,$canedit,$hostname);
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');              if ($error) {
            } else {                  $r->print('<p><span class="LC_error">'.$error.'</span></p>');
                if ($suppchanges) {              }
                    my %servers = &Apache::lonnet::internet_dom_servers($coursedom);              if ($suppchanges) {
                    my @ids=&Apache::lonnet::current_machine_ids();                  &Apache::lonnet::update_supp_caches($coursedom,$coursenum);
                    foreach my $server (keys(%servers)) {                  undef($suppchanges);
                        next if (grep(/^\Q$server\E$/,@ids));              }
                        my $hashid=$coursenum.':'.$coursedom;  
                        my $cachekey = &escape('suppcount').':'.&escape($hashid);  
                        &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);  
                    }  
                    &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);  
                    undef($suppchanges);  
                }  
            }  
         }          }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                             $supplementalflag,'',$iconpath,$pathitem,'','',$hostname);                              $supplementalflag,'',$iconpath,$pathitem,'',$canedit,
                               $hostname);
         if ($error) {          if ($error) {
             $r->print('<p><span class="LC_error">'.$error.'</span></p>');              $r->print('<p><span class="LC_error">'.$error.'</span></p>');
         }          }
Line 6966  sub remove_archive { Line 8566  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 6997  sub remove_archive { Line 8601  sub remove_archive {
 }  }
   
 sub generate_admin_menu {  sub generate_admin_menu {
     my ($crstype,$canedit) = @_;      my ($crstype,$canedit,$coursenum,$coursedom) = @_;
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     my %lt= ( # do not translate here      my %lt= ( # do not translate here
Line 7005  sub generate_admin_menu { Line 8609  sub generate_admin_menu {
                                          'cv'   => 'Check/Set Resource Versions',                                           'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',                                           'ls'   => 'List Resource Identifiers',
                                          'ct'   => 'Display/Set Shortened URLs for Deep-linking',                                           'ct'   => 'Display/Set Shortened URLs for Deep-linking',
                                            'ca'   => "Enter $crstype Authoring Space",
                                          'imse' => 'Export contents to IMS Archive',                                           'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Copy $crstype Content to Authoring Space",                                           'dcd'  => 'Copy uploaded content to Authoring Space',
                                            'cpc'  => 'Copy from Course Authoring to User Authoring',
             );              );
     my ($candump,$dumpurl);      my ($candump,$dumpurl,$exportcrsurl);
     if ($home + $other > 0) {      if ($home + $other > 0) {
         $candump = 'F';          $candump = 'F';
         if ($home) {          if ($home) {
             $dumpurl = "javascript:injectData(document.courseverify,'dummy','dumpcourse','$lt{'dcd'}')";              $dumpurl = "javascript:injectData(document.courseverify,'dummy','dumpcourse','$lt{'dcd'}')";
               $exportcrsurl = "javascript:injectData(document.courseverify,'dummy','copyauthored','$lt{'cpc'}')";
         } else {          } else {
             my @hosts;              my @hosts;
             foreach my $aurole (keys(%outhash)) {              foreach my $aurole (keys(%outhash)) {
Line 7026  sub generate_admin_menu { Line 8633  sub generate_admin_menu {
                                &HTML::Entities::encode($env{'request.role'},'"<>&').'&amp;origurl='.                                 &HTML::Entities::encode($env{'request.role'},'"<>&').'&amp;origurl='.
                                &HTML::Entities::encode('/adm/coursedocs?dumpcourse=1','"<>&');                                 &HTML::Entities::encode('/adm/coursedocs?dumpcourse=1','"<>&');
                 $dumpurl = "javascript:dump_needs_switchserver('$switchto')";                  $dumpurl = "javascript:dump_needs_switchserver('$switchto')";
                   $exportcrsurl = $dumpurl;
             } else {              } else {
                 $dumpurl = "javascript:choose_switchserver_window()";                  $dumpurl = "javascript:choose_switchserver_window()";
                   $exportcrsurl = $dumpurl;
             }              }
         }          }
     }      }
Line 7065  sub generate_admin_menu { Line 8674  sub generate_admin_menu {
                 ]                  ]
         });          });
     if ($canedit) {      if ($canedit) {
           my ($crsauname,$crsaudom,$crshome);
           if (($coursenum ne '') && ($coursedom ne '')) {
               my $crsauthorurl = "/priv/$coursedom/$coursenum/";
               ($crsauname,$crsaudom,$crshome) = &Apache::lonnet::constructaccess($crsauthorurl);
               if (($crsauname eq $coursenum) && ($crsaudom eq $coursedom)) {
                   my @ids=&Apache::lonnet::current_machine_ids();
                   my $linkurl;
                   if (grep(/^\Q$crshome\E$/,@ids)) {
                       $linkurl = $crsauthorurl;
                   } else {
                       my $jscall = &Apache::lonhtmlcommon::jump_to_editres($crsauthorurl,$crshome,1);
                       if ($jscall) {
                           $linkurl = 'javascript:'.$jscall;
                       }
                   }
                   if ((ref($menu[0]) eq 'HASH') && (ref($menu[0]->{'items'}) eq 'ARRAY') && ($linkurl)) {
                        push(@{$menu[0]->{items}},
                        {   linktext   => $lt{'ca'},
                            url        => $linkurl,
                            permission => 'F',
                            help       => 'Docs_Course_Authorspace',
                            icon       => 'impcrsau.png',
                            linktitle  => $lt{'ca'},
                        });
                   }
               }
           }
         push(@menu,          push(@menu,
         {   categorytitle=>'Export',          {   categorytitle=>'Export',
             items =>[              items =>[
Line 7084  sub generate_admin_menu { Line 8720  sub generate_admin_menu {
                 },                  },
                 ]                  ]
         });          });
           if (($crsauname eq $coursenum) && ($crsaudom eq $coursedom)) {
               if ((ref($menu[1]) eq 'HASH') && (ref($menu[1]->{'items'}) eq 'ARRAY')) {
                   push(@{$menu[1]->{items}},
                        {   linktext   => $lt{'cpc'},
                            url        => $exportcrsurl,
                            permission => 'F',
                            help       => 'Docs_Export_Course_Author',
                            icon       => 'res.png',
                            linktitle  => $lt{'cpc'},
                        });
               }
           }
     }      }
     return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".      return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".
            '<input type="hidden" id="dummy" />'."\n".             '<input type="hidden" id="dummy" />'."\n".
Line 7240  sub editing_js { Line 8888  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 7251  sub editing_js { Line 8901  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 7280  sub editing_js { Line 8932  sub editing_js {
                 if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {                  if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {
                     if (($ENV{'SERVER_PORT'} == 443) &&                      if (($ENV{'SERVER_PORT'} == 443) &&
                         ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {                          ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                         unless (&Apache::lonnet::uses_sts()) {                          unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                             if ($hostname ne '') {                              if ($hostname ne '') {
                                 $backtourl = 'http://'.$hostname.$backtourl;                                  $backtourl = 'http://'.$hostname.$backtourl;
                             }                              }
Line 7289  sub editing_js { Line 8941  sub editing_js {
                     }                      }
                 } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) {                  } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) {
                     if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) {                      if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) {
                         unless (&Apache::lonnet::uses_sts()) {                          unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
                             if ($hostname ne '') {                              if ($hostname ne '') {
                                 $backtourl = 'http://'.$hostname.$backtourl;                                  $backtourl = 'http://'.$hostname.$backtourl;
                             }                              }
Line 7308  sub editing_js { Line 8960  sub editing_js {
     } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {      } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {
         $backtourl = '/adm/menu';          $backtourl = '/adm/menu';
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         $backtourl = '/adm/supplemental';          if (($env{'request.role.adv'}) ||
               (&Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom))) {
               $backtourl = '/adm/supplemental';
           } else {
               $backtourl = '/adm/navmaps';
           }
     } else {      } else {
         $backtourl = '/adm/navmaps';          $backtourl = '/adm/navmaps';
     }      }
Line 7335  sub editing_js { Line 8992  sub editing_js {
 function makenewfolder(targetform,folderseq) {  function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}');      var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}');
     if (foldername) {      if (foldername) {
        targetform.importdetail.value=escape(foldername)+"="+folderseq;         targetform.importdetail.value=encodeURIComponent(foldername)+"="+folderseq;
         targetform.submit();          targetform.submit();
     }      }
 }  }
Line 7343  function makenewfolder(targetform,folder Line 9000  function makenewfolder(targetform,folder
 function makenewpage(targetform,folderseq) {  function makenewpage(targetform,folderseq) {
     var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}');      var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}');
     if (pagename) {      if (pagename) {
         targetform.importdetail.value=escape(pagename)+"="+folderseq;          targetform.importdetail.value=encodeURIComponent(pagename)+"="+folderseq;
         targetform.submit();          targetform.submit();
     }      }
 }  }
Line 7352  function makeexamupload() { Line 9009  function makeexamupload() {
    var title=prompt('$js_lt{"p_mxu"}');     var title=prompt('$js_lt{"p_mxu"}');
    if (title) {     if (title) {
     this.document.forms.newexamupload.importdetail.value=      this.document.forms.newexamupload.importdetail.value=
  escape(title)+'=/res/lib/templates/examupload.problem';   encodeURIComponent(title)+'=/res/lib/templates/examupload.problem';
     this.document.forms.newexamupload.submit();      this.document.forms.newexamupload.submit();
    }     }
 }  }
Line 7361  function makesmppage() { Line 9018  function makesmppage() {
    var title=prompt('$js_lt{"p_msp"}');     var title=prompt('$js_lt{"p_msp"}');
    if (title) {     if (title) {
     this.document.forms.newsmppg.importdetail.value=      this.document.forms.newsmppg.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/new/smppg';   encodeURIComponent(title)+'=/adm/$udom/$uname/new/smppg';
     this.document.forms.newsmppg.submit();      this.document.forms.newsmppg.submit();
    }     }
 }  }
Line 7376  function makewebpage(type) { Line 9033  function makewebpage(type) {
    }     }
    if (title) {     if (title) {
        var webpage = formname.importdetail.value;          var webpage = formname.importdetail.value; 
        formname.importdetail.value = escape(title)+'='+webpage;         formname.importdetail.value = encodeURIComponent(title)+'='+webpage;
        formname.submit();         formname.submit();
    }     }
 }  }
Line 7385  function makesmpproblem() { Line 9042  function makesmpproblem() {
    var title=prompt('$js_lt{"p_msb"}');     var title=prompt('$js_lt{"p_msb"}');
    if (title) {     if (title) {
     this.document.forms.newsmpproblem.importdetail.value=      this.document.forms.newsmpproblem.importdetail.value=
  escape(title)+'=/res/lib/templates/simpleproblem.problem';   encodeURIComponent(title)+'=/res/lib/templates/simpleproblem.problem';
     this.document.forms.newsmpproblem.submit();      this.document.forms.newsmpproblem.submit();
    }     }
 }  }
Line 7394  function makedropbox() { Line 9051  function makedropbox() {
    var title=prompt('$js_lt{"p_mdb"}');     var title=prompt('$js_lt{"p_mdb"}');
    if (title) {     if (title) {
     this.document.forms.newdropbox.importdetail.value=      this.document.forms.newdropbox.importdetail.value=
         escape(title)+'=/res/lib/templates/DropBox.problem';          encodeURIComponent(title)+'=/res/lib/templates/DropBox.problem';
     this.document.forms.newdropbox.submit();      this.document.forms.newdropbox.submit();
    }     }
 }  }
Line 7403  function makebulboard() { Line 9060  function makebulboard() {
    var title=prompt('$js_lt{"p_mbb"}');     var title=prompt('$js_lt{"p_mbb"}');
    if (title) {     if (title) {
     this.document.forms.newbul.importdetail.value=      this.document.forms.newbul.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/new/bulletinboard';   encodeURIComponent(title)+'=/adm/$udom/$uname/new/bulletinboard';
     this.document.forms.newbul.submit();      this.document.forms.newbul.submit();
    }     }
 }  }
Line 7593  function toggleMap(caller) { Line 9250  function toggleMap(caller) {
             }              }
         }          }
         document.getElementById('importmapform').style.display=disp;          document.getElementById('importmapform').style.display=disp;
           if (disp == 'block') {
               if (document.getElementById('importcrsresform')) {
                   if (document.getElementById('importcrsresform').style.display == 'block') {
                       document.getElementById('importcrsresform').style.display = 'none';
                   }
               }
           }
         resize_scrollbox('contentscroll','1','1');          resize_scrollbox('contentscroll','1','1');
     }      }
     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 7672  function toggleNewsubdir(form) { Line 9330  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 7759  function getExample(width,height,scrolli Line 9431  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';
                       }
                 }                  }
             }              }
         }          }
         document.getElementById('importcrsresform').style.display=disp;          document.getElementById('importcrsresform').style.display=disp;
           if (disp == 'block') {
               if (document.getElementById('importmapform')) {
                   if (document.getElementById('importmapform').style.display == 'block') {
                       document.getElementById('importmapform').style.display = 'none';
                   }
               }
           }
         resize_scrollbox('contentscroll','1','0');          resize_scrollbox('contentscroll','1','0');
     }      }
     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;
                       }
                   }
               }
           }
           var templateradio = document.courseresform.elements['newresusetemp'];
           if (athome) {
               if (document.getElementById('stdprobswitch')) {
                   document.getElementById('stdprobswitch').style.display = 'none';
               }
               if (document.getElementById('newstdproblem')) {
                   document.getElementById('newstdproblem').style.display = 'none';
               }
               var canedit = '$canedit';
               if (canedit) {
                   if (templateradio.length > 1) {
                       for (var i=0; i<templateradio.length; i++) {
                           templateradio[i].disabled = false;
                       }
                   }
                   document.courseresform.newresourcename.disabled = false;
                   document.courseresform.newcrs.disabled = false;
               }
               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';
               }
               if (templateradio.length > 1) {
                   for (var i=0; i<templateradio.length; i++) {
                       templateradio[i].disabled = true;
                   }
               }
               document.courseresform.newresourcename.disabled = true;
               document.courseresform.newcrs.disabled = true;
           }
       }
       return;
   }
   
   function switchForProb() {
       if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') {
           var url = '/adm/switchserver?otherserver=';
           var newhostid = '';
           var role = '';
           var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value;
           if (selloc == 'author') {
               newhostid = document.courseresform.rolehome_author.value;
               role = "au./&js_escape($env{'user.domain'})/";
           } else if (selloc == 'course') {
               newhostid = document.courseresform.rolehome_course.value;
               role = "&js_escape($env{'request.role'})";
           } else {
               var items = new Array();
               items = selloc.split('___');
               var len = document.courseresform.rolehome_coauthor.length;
               if (null == len) {
                   var currval = document.courseresform.rolehome_coauthor.value;
                   if (null != currval) {
                       var info = new Array();
                       info = currval.split('=');
                       newhostid = info[2];
                       role = info[0]+'./'+info[1];
                   }
               } else {
                   for (var i=0; i<len; i++) {
                       var currval = document.courseresform.rolehome_coauthor[i].value;
                       if (null != currval) {
                           var info = new Array();
                           info = currval.split('=');
                           if ((info[1] == items[1]+'/'+items[0]) && (info[0] == items[2])) {
                               newhostid = info[2];
                               role = info[0]+'./'+info[1];
                               break;
                           }
                       }
                   }
               }
           }
           if (newhostid != '') {
               url += newhostid;
               if (role != '') {
                   url += '&role='+role;
               }
               document.location.href = url;
           }
       }
       return;
   }
   
 function makeims(imsform) {  function makeims(imsform) {
     if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {      if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {
         alert("$js_lt{'imsfile'}");          alert("$js_lt{'imsfile'}");
Line 8527  function validImportCrsRes() { Line 10382  function validImportCrsRes() {
         url += fname;          url += fname;
     }      }
     var title = document.crsresimportform.crsrestitle.value;      var title = document.crsresimportform.crsrestitle.value;
     document.crsresimportform.importdetail.value=escape(title)+'='+escape(url);      document.crsresimportform.importdetail.value=encodeURIComponent(title)+'='+encodeURIComponent(url);
     return true;      return true;
 }  }
   
Line 8574  sub dump_switchserver_js { Line 10429  sub dump_switchserver_js {
     );      );
     my %html_js_lt = &Apache::lonlocal::texthash(      my %html_js_lt = &Apache::lonlocal::texthash(
         swit => 'Switch server?',          swit => 'Switch server?',
         duco => 'Copying Content to Authoring Space',          duco => 'Copying uploaded content to Authoring Space',
         yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',          yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
         chos => 'Choose server',          chos => 'Choose server',
     );      );
Line 8715  sub makenewproblem { Line 10570  sub makenewproblem {
                         if ($redirect) {                          if ($redirect) {
                             my $rightsfile = 'default.rights';                              my $rightsfile = 'default.rights';
                             my $sourcerights = "$path/$rightsfile";                              my $sourcerights = "$path/$rightsfile";
                               &Apache::loncommon::crsauthor_rights($rightsfile,$path,$docroot,$coursenum,$coursedom);
                             my $targetrights = $docroot."/res/$coursedom/$coursenum/$rightsfile";                              my $targetrights = $docroot."/res/$coursedom/$coursenum/$rightsfile";
                             my $now = time;  
                             if (!-e $sourcerights) {  
                                 my $cid = $coursedom.'_'.$coursenum;  
                                 if (open(my $fh,">$sourcerights")) {  
                                     print $fh <<END;  
 <accessrule effect="deny" realm="" type="course" role="" />  
 <accessrule effect="allow" realm="$cid" type="course" role="" />  
 END  
                                     close($fh);  
                                 }  
                             }  
                             if (!-e "$sourcerights.meta") {  
                                 if (open(my $fh,">$sourcerights.meta")) {  
                                     my $author=$env{'environment.firstname'}.' '.  
                                                $env{'environment.middlename'}.' '.  
                                                $env{'environment.lastname'}.' '.  
                                                $env{'environment.generation'};  
                                     $author =~ s/\s+$//;  
                                     print $fh <<"END";  
   
 <abstract></abstract>  
 <author>$author</author>  
 <authorspace>$coursenum:$coursedom</authorspace>  
 <copyright>private</copyright>  
 <creationdate>$now</creationdate>  
 <customdistributionfile></customdistributionfile>  
 <dependencies></dependencies>  
 <domain>$coursedom</domain>  
 <highestgradelevel>0</highestgradelevel>  
 <keywords></keywords>  
 <language>notset </language>  
 <lastrevisiondate>$now</lastrevisiondate>  
 <lowestgradelevel>0</lowestgradelevel>  
 <mime>rights</mime>  
 <modifyinguser>$env{'user.name'}:$env{'user.domain'}</modifyinguser>  
 <notes></notes>  
 <obsolete></obsolete>  
 <obsoletereplacement></obsoletereplacement>  
 <owner>$coursenum:$coursedom</owner>  
 <rule>deny:::course,allow:$cid::course</rule>  
 <sourceavail></sourceavail>  
 <standards></standards>  
 <subject></subject>  
 <title></title>  
 END  
                                     close($fh);  
                                 }  
                             }  
                             if ((-e $sourcerights) && (-e "$sourcerights.meta")) {                              if ((-e $sourcerights) && (-e "$sourcerights.meta")) {
                                 if (!-e "$docroot/res/$coursedom") {                                  if (!-e "$docroot/res/$coursedom") {
                                     mkdir("$docroot/res/$coursedom",0755);                                      mkdir("$docroot/res/$coursedom",0755);

Removed from v.1.665  
changed lines
  Added in v.1.722


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