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

version 1.713, 2024/12/22 03:12:53 version 1.722, 2025/01/07 21:01:37
Line 579  $contents{webreferences}.' Line 579  $contents{webreferences}.'
     $title=~s/[\/\s]+/\_/gs;      $title=~s/[\/\s]+/\_/gs;
     $title=&clean($title);      $title=&clean($title);
     my $formname = 'dumpdoc';      my $formname = 'dumpdoc';
     my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash);      my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
                              '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
     my %uploadedfiles;      my %uploadedfiles;
     &tiehash();      &tiehash();
     foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {      foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
Line 643  sub authorspace_selector { Line 644  sub authorspace_selector {
     }      }
     $preamble .= '<div class="LC_left_float">'.      $preamble .= '<div class="LC_left_float">'.
                  '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.                   '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                  '<input type="text" size="50" name="authorfolder" value="'.$title.'" />'."\n".                   '<input type="text" size="30" name="authorfolder" value="'.$title.'" />'."\n".
                  '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";                   '</fieldset></div>'."\n";
     return $preamble;      return $preamble;
 }  }
   
Line 694  sub recurse_html { Line 695  sub recurse_html {
   
 sub copycrsauthored {  sub copycrsauthored {
     my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;      my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;
     my ($starthash,$js);      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/)) {      unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
         $js = <<"ENDJS";          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">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
   
Line 707  function hide_searching() { Line 769  function hide_searching() {
     return;      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>  </script>
 ENDJS  ENDJS
   
           $js .= "\n".&Apache::lonhtmlcommon::scripttag(&Apache::loncommon::browser_and_searcher_javascript())."\n";
         $starthash = {          $starthash = {
                          add_entries => {'onload' => "hide_searching();"},                           add_entries => {'onload' => "hide_searching(); init_copycrs_form();"},
                      };                       };
     }      }
     $r->print(&Apache::loncommon::start_page('Copy from Course Authoring to User Authoring',$js,$starthash)."\n".      $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");                &Apache::lonhtmlcommon::breadcrumbs('Copy from Course Authoring Space')."\n");
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     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('<p class="LC_info">'.&mt('No author or co-author roles on this server.').'</p>');
         $r->print(&endContentScreen());          $r->print(&endContentScreen());
         return '';          return '';
     }      }
     my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});      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 $exclude = &Apache::lonnet::priv_exclude();
     my $srcurl = "/priv/$coursedom/$coursenum";      my $srcurl = "/priv/$coursedom/$coursenum";
     my $srctop = $r->dir_config('lonDocRoot').$srcurl;      my $srctop = $docroot.$srcurl;
       my $resurl = "/res/$coursedom/$coursenum";
       my $res_exclude = &Apache::lonnet::res_exclude();
     if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {      if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
         $r->print('<h3>'.&mt('Copying Files and/or Sub-directories').'</h3>');          $r->print('<h3>'.&mt('Copying Files and/or Sub-directories').'</h3>');
         if ($readonly) {          if ($readonly) {
Line 743  ENDJS Line 824  ENDJS
         }          }
         my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});          my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
         my $desturl = "/priv/$cd/$ca";          my $desturl = "/priv/$cd/$ca";
         my $desttop = $r->dir_config('lonDocRoot').$desturl;          my $destresurl = "/res/$cd/$ca";
           my $desttop = $docroot.$desturl;
         my $subdir = &clean($env{'form.authorfolder'});          my $subdir = &clean($env{'form.authorfolder'});
         $subdir = &cleandir($subdir);          $subdir = &cleandir($subdir);
         if ($subdir eq '') {          if ($subdir eq '') {
Line 755  ENDJS Line 837  ENDJS
                       &endContentScreen());                        &endContentScreen());
             return '';              return '';
         }          }
         my $is_course_home;  
         my @ids=&Apache::lonnet::current_machine_ids();  
         if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/,@ids))) {  
             $is_course_home = 1;  
         }  
         my (%tocopy,%dirs_to_make,%files_to_copy);          my (%tocopy,%dirs_to_make,%files_to_copy);
         map { $tocopy{&unescape($_)} = 1; } &Apache::loncommon::get_env_multiple('form.copytouser');          map { $tocopy{&unescape($_)} = 1; } &Apache::loncommon::get_env_multiple('form.copytouser');
         if (keys(%tocopy)) {          if (keys(%tocopy)) {
             my (%subdirs,%files);              my (%subdirs,%files);
             &Apache::lonnet::recursedirs($home,1,undef,$exclude,0,0,$srcurl,'',\%subdirs,\%files);              &Apache::lonnet::recursedirs($is_course_home,1,undef,$exclude,0,0,$srcurl,'',\%subdirs,\%files);
             foreach my $possible (sort(keys(%tocopy))) {              foreach my $possible (sort(keys(%tocopy))) {
                 if ($possible =~ m{/$}) {                  if ($possible =~ m{/$}) {
                     my $possdir = $possible;                      my $possdir = $possible;
Line 805  ENDJS Line 882  ENDJS
             return '';              return '';
         }          }
         if (keys(%tocopy)) {          if (keys(%tocopy)) {
             my ($notopdir,%newdir,%newfile,%checkdeps);              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]',              $r->print('<p>'.&mt('Copy to: [_1]',
                                 '<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').                                  '<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                       '</p>'."\n");                        '</p>'."\n");
             unless ($is_course_home) {  
                 $r->print('<p class="LC_info>'.&mt("Session needs to be hosted on course's home server.").  
                           '</p>'.  
                           &endContentScreen());  
                 return '';  
             }  
             if (keys(%dirs_to_make)) {              if (keys(%dirs_to_make)) {
                 if ($is_course_home) {                  unless (-e $desttop.'/'.$subdir) {
                     unless (-e $desttop.'/'.$subdir) {                      mkdir($desttop.'/'.$subdir,0755);
                         mkdir($desttop.'/'.$subdir,0755);                  }
                     }                  if (-e $desttop.'/'.$subdir) {
                     if (-e $desttop.'/'.$subdir) {                      foreach my $dir (sort(keys(%dirs_to_make))) {
                         foreach my $dir (sort(keys(%dirs_to_make))) {                          my @dirs=split(/\//,$dir);
                             my @dirs=split(/\//,$dir);                          my $path="$desttop/$subdir";
                             my $path="$desttop/$subdir";                          my $makepath=$path;
                             my $makepath=$path;                          my $fail;
                             my $fail;                          for (my $i=0;$i<@dirs;$i++) {
                             for (my $i=0;$i<@dirs;$i++) {                              $makepath.='/'.$dirs[$i];
                                 $makepath.='/'.$dirs[$i];                              unless (-e $makepath) {
                                 unless (-e $makepath) {                                  unless (mkdir($makepath,0755)) {
                                     unless (mkdir($makepath,0755)) {                                      $fail = 1;
                                         $fail = 1;                                      last;
                                         last;                                  }
                                     }                                  if (($i == scalar(@dirs)-1) && (!$fail))  {
                                     if (($i == scalar(@dirs)-1) && (!$fail))  {                                      $newdir{$dir} = 1;
                                         $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 {                          if ($fail) {
                         $notopdir = 1;                              $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)) {              if (keys(%files_to_copy)) {
                 if ($is_course_home) {                  unless (-e $desttop.'/'.$subdir) {
                     unless (-e $desttop.'/'.$subdir) {                      mkdir($desttop.'/'.$subdir,0755);
                         mkdir($desttop.'/'.$subdir,0755);                  }
                     }                  if (-e $desttop.'/'.$subdir) {
                     if (-e $desttop.'/'.$subdir) {                      my $num = 0;
                         my $num = 0;                      my ($copyright,$customdistfile);
                         foreach my $file (keys(%files_to_copy)) {                      if ($env{'form.copyright'} eq 'default' || $env{'form.copyright'} eq 'domain' || $env{'form.copyright'} eq 'public') {
                             my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname);                          $copyright = $env{'form.copyright'};
                             if ($file =~ m{/}) {                      } elsif ($env{'form.copyright'} eq 'custom') {
                                 ($path,$fname) = ($file =~ m{^(.+)/([^/]+)$});                          if ($env{'form.customrights'} =~ m{^/res/$match_domain/$match_username/.+\.rights$}) {
                                 if (-d "$desttop/$subdir/$path") {                              my ($rightsdom,$rightsuname) = ($1,$2);
                                     if (-e "$desttop/$subdir/$path/$fname") {                              my $rightshome = &Apache::lonnet::homeserver($rightsdom,$rightsuname);
                                         $dup = 1;                              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 {                                      } else {
                                         $src = "$srctop/$path/$fname";                                          $needpriv = 1;
                                         $dest = "$desttop/$subdir/$path/$fname";                                      }
                                       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;
                                               }
                                           }
                                     }                                      }
                                 } elsif (-f "$desttop/$subdir/$path") {  
                                     $dir_is_file = 1;  
                                 } else {                                  } else {
                                     $fail = 1;                                      $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);
                                       }
                                 }                                  }
                             } elsif (-e "$desttop/$subdir/$file") {  
                                 $dup = 1;  
                             } else {                              } else {
                                 $src = "$srctop/$file";                                  my ($needpriv,$needprivmeta);
                                 $dest = "$desttop/$subdir/$file";                                  if ($respublish) {
                                 $fname = $file;                                      if ($getres) {
                             }                                          &Apache::lonnet::repcopy($docroot.$resurl.'/'.$file);
                             if ($fail) {                                      }
                                 $r->print('<p class="LC_warning">'.&mt('Target directory: [_1] does not exist, and could not be created.',                                      if ($getresmeta) {
                                                                        '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$path.'</span>').                                          &Apache::lonnet::repcopy($docroot.$resurl.'/'.$file.'.meta');
                                           '</p>'."\n");                                      }
                             } elsif ($dup) {                                      if (-e $docroot.$resurl.'/'.$file) {
                                 $r->print('<p class="LC_warning">'.&mt('Target file: [_1] already exists -- not overwriting.',                                          if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file,$dest) eq 'ok') {
                                                                        '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$file.'</span>').                                              if (&Apache::londiff::are_different_files($docroot.$resurl.'/'.$file,$dest)) {
                                           '</p>'."\n");                                                  $needpriv = 1;
                             } elsif ($dir_is_file) {                                                  if (&File::Copy::copy($docroot.$resurl.'/'.$file,$dest)) {
                                 $r->print('<p class="LC_warning">'.&mt('Target directory: [_1] name is already in a use for a file -- not overwriting.',                                                      if ($embstyle eq 'ssi') {
                                                                        '<span class="LC_filename">'.$desturl.'/'.$subdir.'/'.$file.'</span>').                                                          &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd);
                                           '</p>'."\n");  
                             } elsif (($src ne '') && ($dest ne '')) {  
                                 if (&File::Copy::copy($src,$dest)) {  
                                     $newfile{$file} = 1;  
                                     if ((-e $src.'.meta') && (!-e $dest.'.meta')) {  
                                         if (&File::Copy::copy($src.'.meta',$dest.'.meta')) {  
                                             if (open(my $fh,'<',$dest.'.meta')) {  
                                                 my ($output,$now);  
                                                 $now = time;  
                                                 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>default</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></customdistributionfile>\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);                                              } else {
                                                 if (open(my $fh,'>',$dest.'.meta')) {                                                  if ($embstyle eq 'ssi') {
                                                     print $fh $output;                                                      &crsres_fixup($dest,$coursenum,$coursedom,$ca,$cd,$subdir);
                                                     close($fh);  
                                                 }                                                  }
                                                   $newfile{$file} = $desturl.'/'.$subdir.'/'.$file;
                                             }                                              }
                                         }                                          }
                                       } else {
                                           $needpriv = 1;
                                     }                                      }
                                     my ($ext) = ($file =~ /\.(\w+)$/);                                      if (-e $docroot.$resurl.'/'.$file.'.meta') {
                                     my $embstyle=&Apache::loncommon::fileembstyle($ext);                                          if (&Apache::lonnet::repcopy_crsprivfile($srcurl.'/'.$file.'.meta',$dest.'.meta') eq 'ok') {
                                     if ($embstyle eq 'ssi') {                                              if (&Apache::londiff::are_different_files($docroot.$resurl.'/'.$file.'.meta',$dest.'.meta')) {
                                         my $outstring='';                                                  $needprivmeta = 1;
                                         my $changes = 0;                                                  if (&File::Copy::copy($docroot.$resurl.'/'.$file.'.meta',$dest.'.meta')) {
                                         my @parser;                                                      &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                         $parser[0]=HTML::LCParser->new($src);                                                                         $customdistfile,$sourceavail,\%checkdeps);
                                         $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 $needsupdate = 1;  
                                                                 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];  
                                                 }                                                  }
                                               } else {
                                                   &crsres_fixup_meta($dest,$coursenum,$coursedom,$ca,$cd,$copyright,
                                                                      $customdistfile,$sourceavail,\%checkdeps);
                                             }                                              }
                                             pop(@parser);  
                                         }                                          }
                                         if ($changes) {                                      } else {
                                             if (open(my $fh,'>',$dest)) {                                          if (!-e $dest.'.meta') {
                                                 print $fh $outstring;                                              $needprivmeta = 1;
                                                 close($fh);                                          }
                                       }
                                       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;  
                     }                      }
                   } else {
                       $notopdir = 1;
                 }                  }
             }              }
             if ($notopdir) {              if ($notopdir) {
Line 1105  ENDJS Line 1177  ENDJS
                 $r->print('<p>'.&mt('Copied the following files to [_1]:','<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').                  $r->print('<p>'.&mt('Copied the following files to [_1]:','<span class="LC_filename">'.$desturl.'/'.$subdir.'</span>').
                           '</p>'."\n".                            '</p>'."\n".
                           '<ul><li>'.join('</li><li>',sort(keys(%newfile))).'</li></ul></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)) {              if (keys(%checkdeps)) {
                 my %missingdep;                  my %missingdep;
Line 1126  ENDJS Line 1208  ENDJS
             return '';              return '';
         }          }
     } else {      } else {
         my $formname = 'copycrsauthored';  
         my $chkname = 'copytouser';          my $chkname = 'copytouser';
         my $context = 'crsauthored';          my $context = 'crsauthored';
         my (%subdirs,%files,@dirs_by_depth,@files_by_depth,%parent,%children,%hierarchy,@checked_maps);          my (%subdirs,%files,@dirs_by_depth,@files_by_depth,%parent,%children,%hierarchy,@checked_maps);
         &Apache::lonnet::recursedirs($home,1,undef,$exclude,0,0,$srcurl,'',\%subdirs,\%files);          &Apache::lonnet::recursedirs($is_course_home,1,undef,$exclude,0,0,$srcurl,'',\%subdirs,\%files,1);
         foreach my $key (keys(%subdirs)) {          foreach my $key (keys(%subdirs)) {
             next if (($key eq '/') || ($key eq ''));              next if (($key eq '/') || ($key eq ''));
             my @items = split(/\//,$key);              my @items = split(/\//,$key);
Line 1154  ENDJS Line 1235  ENDJS
             }              }
             if (ref($files{$path}) eq 'HASH') {              if (ref($files{$path}) eq 'HASH') {
                 foreach my $file (keys(%{$files{$path}})) {                  foreach my $file (keys(%{$files{$path}})) {
                     $files_by_depth[$depth]{$path}{$file} = 1;                      $files_by_depth[$depth]{$path}{$file} = $files{$path}{$file};
                 }                  }
             }              }
         }          }
         my ($info,$display,$onsubmit,$togglebuttons,$disabled);          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) {          if ($readonly) {
             $disabled = ' disabled="disabled"';              $disabled = ' disabled="disabled"';
         }          }
Line 1170  ENDJS Line 1265  ENDJS
                              '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.                               '&nbsp;&nbsp;<input type="button" value="'.&mt('uncheck all').'"'.
                              ' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />';                               ' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />';
         }          }
         my $title=$origcrsdata{'description'};          my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
         $title=~s/[\/\s]+/\_/gs;                         &courseresource_options($formname,$numpub).
         $title=&clean($title);                         '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
         my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash);          my $display = '<form name="'.$formname.'" action="" method="post" onsubmit="return validCrsCopy();">'."\n".
         my $display = '<form name="'.$formname.'" action="" method="post">'."\n".  
                       $preamble."\n".                        $preamble."\n".
                       '<div class="LC_float_left">'."\n".                        '<div class="LC_float_left">'."\n".
                       '<fieldset>'."\n".                        '<fieldset>'."\n".
Line 1183  ENDJS Line 1277  ENDJS
                       &mt('Choose the files and/or folders to copy from Course Authoring to User Authoring').                        &mt('Choose the files and/or folders to copy from Course Authoring to User Authoring').
                       '</span><br /><br />'."\n";                        '</span><br /><br />'."\n";
         my $count = 0;          my $count = 0;
         my $startcount = 4 + $home;  #
   # 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;          my $lastcontainer = $startcount;
         $display .= &Apache::loncommon::start_data_table()."\n".          $display .= &Apache::loncommon::start_data_table()."\n".
                     &Apache::loncommon::start_data_table_header_row().                      &Apache::loncommon::start_data_table_header_row().
                     '<th>'.&mt('Copy?').'</th>'.                      '<th>'.&mt('Copy?').'</th>'.
                     '<th>'.&mt('Title').'</th>'.                      '<th>'.&mt('Name').'</th>'.
                       '<th>'.&mt('Last modified').'</th>'.
                       '<th>'.&mt('Published?').'</th>'.
                     &Apache::loncommon::end_data_table_header_row()."\n";                      &Apache::loncommon::end_data_table_header_row()."\n";
         $count = &recurse_crsauthored(0,\@dirs_by_depth,\@files_by_depth,'/',$startcount,          $count = &recurse_crsauthored(0,\@dirs_by_depth,\@files_by_depth,'/',$startcount,
                                       $count,\$display,\%parent,\%children,$readonly,                                        $count,\$display,\%parent,\%children,$readonly,
                                       $formname,$chkname,\$lastcontainer);                                        $formname,$chkname,\$lastcontainer,\%resfiles);
         $display .= &Apache::loncommon::end_data_table().'</fieldset>';          $display .= &Apache::loncommon::end_data_table().'</fieldset>';
         unless ($readonly) {          unless ($readonly) {
             $display .= '</div><div style="padding:0;clear:both;margin:0;border:0"></div>'.              $display .= '</div><div style="padding:0;clear:both;margin:0;border:0"></div>'.
Line 1209  ENDJS Line 1330  ENDJS
   
 sub recurse_crsauthored {  sub recurse_crsauthored {
     my ($currdepth,$dirs_by_depth,$files_by_depth,$currpath,$startcount,$count,$displayref,      my ($currdepth,$dirs_by_depth,$files_by_depth,$currpath,$startcount,$count,$displayref,
         $parent,$children,$readonly,$formname,$chkname,$lastcontainerref) = @_;          $parent,$children,$readonly,$formname,$chkname,$lastcontainerref,$resfilesref) = @_;
     return $count unless ((ref($dirs_by_depth) eq 'ARRAY') && (ref($files_by_depth) eq 'ARRAY'));      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);      my ($disabled,$hasdirs,$hasfiles,%unique,%dirs,%files);
     if ((ref($dirs_by_depth->[$currdepth]) eq 'HASH') &&      if ((ref($dirs_by_depth->[$currdepth]) eq 'HASH') &&
         (ref($dirs_by_depth->[$currdepth]{$currpath}) eq 'HASH')) {          (ref($dirs_by_depth->[$currdepth]{$currpath}) eq 'HASH')) {
Line 1256  sub recurse_crsauthored { Line 1378  sub recurse_crsauthored {
             for (my $i=0; $i<$currdepth; $i++) {              for (my $i=0; $i<$currdepth; $i++) {
                 $$displayref .= "$whitespace\n";                  $$displayref .= "$whitespace\n";
             }              }
             $$displayref .= '<img '.$icon.' />&nbsp;'.$item.'</td>'.              $$displayref .= '<img '.$icon.' />&nbsp;'.$item.'</td><td>&nbsp;</td><td>&nbsp;</td>'.
                             &Apache::loncommon::end_data_table_row()."\n";                              &Apache::loncommon::end_data_table_row()."\n";
             $count = &recurse_crsauthored($deeper,$dirs_by_depth,$files_by_depth,$newpath,              $count = &recurse_crsauthored($deeper,$dirs_by_depth,$files_by_depth,$newpath,
                                           $startcount,$count,$displayref,$parent,$children,                                            $startcount,$count,$displayref,$parent,$children,
                                           $readonly,$formname,$chkname,$lastcontainerref);                                            $readonly,$formname,$chkname,$lastcontainerref,$resfilesref);
         }          }
         if ($hasfiles && exists($files{$item})) {          if ($hasfiles && exists($files{$item})) {
             $count ++;              $count ++;
Line 1284  sub recurse_crsauthored { Line 1406  sub recurse_crsauthored {
             } else {              } else {
                 $showpath = "/$currpath/";                  $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().              $$displayref .= &Apache::loncommon::start_data_table_row().
                             '<td><input type="checkbox" name="'.$chkname.'" value="'.&escape($showpath.$item).'" '.                              '<td><input type="checkbox" name="'.$chkname.'" value="'.&escape($showpath.$item).'" '.
                             'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '.                              'onclick="javascript:checkResource(document.'.$formname.','."'$currelem'".')" '.
Line 1292  sub recurse_crsauthored { Line 1420  sub recurse_crsauthored {
                 $$displayref .= "$whitespace\n";                  $$displayref .= "$whitespace\n";
             }              }
             $$displayref .= '<img '.$icon.$alttext.' />&nbsp;'.$item.'</td>'.              $$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";                              &Apache::loncommon::end_data_table_row()."\n";
         }          }
     }      }
Line 1299  sub recurse_crsauthored { Line 1429  sub recurse_crsauthored {
     return $count;      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 8314  sub generate_admin_menu { Line 8684  sub generate_admin_menu {
                 if (grep(/^\Q$crshome\E$/,@ids)) {                  if (grep(/^\Q$crshome\E$/,@ids)) {
                     $linkurl = $crsauthorurl;                      $linkurl = $crsauthorurl;
                 } else {                  } else {
                     $linkurl =                      my $jscall = &Apache::lonhtmlcommon::jump_to_editres($crsauthorurl,$crshome,1);
                         &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')) {                  if ((ref($menu[0]) eq 'HASH') && (ref($menu[0]->{'items'}) eq 'ARRAY') && ($linkurl)) {
                      push(@{$menu[0]->{items}},                       push(@{$menu[0]->{items}},
                      {   linktext   => $lt{'ca'},                       {   linktext   => $lt{'ca'},
                          url        => $linkurl,                           url        => $linkurl,

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


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