Diff for /loncom/interface/londocs.pm between versions 1.484.2.19 and 1.572

version 1.484.2.19, 2012/12/13 04:51:41 version 1.572, 2013/12/18 23:03:43
Line 40  use Apache::lonxml; Line 40  use Apache::lonxml;
 use Apache::lonclonecourse;  use Apache::lonclonecourse;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
 use Apache::lonuserstate();  
 use Apache::lonextresedit();  use Apache::lonextresedit();
   use Apache::lontemplate();
   use Apache::lonsimplepage();
 use HTML::Entities;  use HTML::Entities;
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
Line 57  my $hashtied; Line 58  my $hashtied;
 my %alreadyseen=();  my %alreadyseen=();
   
 my $hadchanges;  my $hadchanges;
   my $suppchanges;
   
   
 my %help=();  my %help=();
Line 80  sub storemap { Line 82  sub storemap {
       $map,1,$report);        $map,1,$report);
     if ($errtext) { return ($errtext,2); }      if ($errtext) { return ($errtext,2); }
   
     $hadchanges=1;      if ($map =~ /^default/) {
           $hadchanges=1;
       } else {
           $suppchanges=1;
       }
     return ($errtext,0);      return ($errtext,0);
 }  }
   
Line 137  sub clean { Line 143  sub clean {
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n".      my ($starthash,$js);
               &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n");      unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
           $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function hide_searching() {
       if (document.getElementById('searching')) {
           document.getElementById('searching').style.display = 'none';
       }
       return;
   }
   
   // ]]>
   </script>
   ENDJS
           $starthash = {
                            add_entries => {'onload' => "hide_searching();"},
                        };
       }
       $r->print(&Apache::loncommon::start_page('Copy '.$crstype.' Content to Authoring Space',$js,$starthash)."\n".
                 &Apache::lonhtmlcommon::breadcrumbs('Copy '.$crstype.' 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) {
Line 153  sub dumpcourse { Line 179  sub dumpcourse {
             $r->print(&endContentScreen());              $r->print(&endContentScreen());
             return '';              return '';
         }          }
  my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});   my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
  $r->print('<h3>'.&mt('Copying Files').'</h3>');   $r->print('<h3>'.&mt('Copying Files').'</h3>');
  my $title=$env{'form.authorfolder'};   my $title=$env{'form.authorfolder'};
  $title=&clean($title);   $title=&clean($title);
  my %replacehash=();          my ($navmap,$errormsg) =
  foreach my $key (keys(%env)) {              &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');
     if ($key=~/^form\.namefor\_(.+)/) {          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
  $replacehash{$1}=$env{$key};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     }          my (%maps,%resources,%titles);
           if (!ref($navmap)) {
               $r->print($errormsg.
                         &endContentScreen());
               return '';
           } else {
               &Apache::loncourserespicker::enumerate_course_contents($navmap,\%maps,\%resources,\%titles,
                                                                      'dumpdocs',$cdom,$cnum);
  }   }
           my @todump = &Apache::loncommon::get_env_multiple('form.archive');
           my (%tocopy,%replacehash,%lookup,%deps,%display,%result,%depresult,%simpleproblems,%simplepages,
               %newcontent,%has_simpleprobs);
           foreach my $item (sort {$a <=> $b} (@todump)) {
               my $name = $env{'form.namefor_'.$item};
               if ($resources{$item}) {
                   my ($map,$id,$res) = &Apache::lonnet::decode_symb($resources{$item});
                   if ($res =~ m{^uploaded/$cdom/$cnum/\E((?:docs|supplemental)/.+)$}) {
                       $tocopy{$1} = $name;
                       $display{$item} = $1;
                       $lookup{$1} = $item; 
                   } elsif ($res eq 'lib/templates/simpleproblem.problem') {
                       $simpleproblems{$item} = {
                                                   symb => $resources{$item},
                                                   name => $name,
                                                };
                       $display{$item} = 'simpleproblem_'.$name;
                       if ($map =~ m{^\Quploaded/$cdom/$cnum/\E(.+)$}) {
                           $has_simpleprobs{$1}{$id} = $item;
                       }
                   } elsif ($res =~ m{^adm/$match_domain/$match_username/(\d+)/smppg}) {
                       my $marker = $1;
                       my $db_name = &Apache::lonsimplepage::get_db_name($res,$marker,$cdom,$cnum);
                       $simplepages{$item} = {
                                               res    => $res,
                                               title  => $titles{$item},
                                               db     => $db_name,
                                               marker => $marker,
                                               symb   => $resources{$item},
                                               name   => $name,
                                             };
                       $display{$item} = '/'.$res;
                   }
               } elsif ($maps{$item}) {
                   if ($maps{$item} =~ m{^\Quploaded/$cdom/$cnum/\E((?:default|supplemental)_\d+\.(?:sequence|page))$}) {
                       $tocopy{$1} = $name;
                       $display{$item} = $1;
                       $lookup{$1} = $item;
                   }
               } else {
                   next;
               }
           }
  my $crs='/uploaded/'.$env{'request.course.id'}.'/';   my $crs='/uploaded/'.$env{'request.course.id'}.'/';
  $crs=~s/\_/\//g;   $crs=~s/\_/\//g;
  foreach my $item (keys(%replacehash)) {          my $mm = new File::MMagic;
     my $newfilename=$title.'/'.$replacehash{$item};          my $prefix = "/uploaded/$cdom/$cnum/";
     $newfilename=~s/\.(\w+)$//;          %replacehash = %tocopy;
     my $ext=$1;          foreach my $item (sort(keys(%simpleproblems))) {
     $newfilename=&clean($newfilename);              my $content = &Apache::imsexport::simpleproblem($simpleproblems{$item}{'symb'});
     $newfilename.='.'.$ext;              $newcontent{$display{$item}} = $content;
     my @dirs=split(/\//,$newfilename);          }
     my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";          my $gateway = Apache::lonhtmlgateway->new('web');
     my $makepath=$path;          foreach my $item (sort(keys(%simplepages))) {
     my $fail=0;              if (ref($simplepages{$item}) eq 'HASH') {
     for (my $i=0;$i<$#dirs;$i++) {                  my $pagetitle = $simplepages{$item}{'title'};
  $makepath.='/'.$dirs[$i];                  my %fields = &Apache::lonnet::dump($simplepages{$item}{'db'},$cdom,$cnum);
  unless (-e $makepath) {                  my %contents;
     unless(mkdir($makepath,0777)) { $fail=1; }                  foreach my $field (keys(%fields)) {
  }                      if ($field =~ /^(?:aaa|bbb|ccc)_(\w+)$/) {
     }                          my $name = $1;
     $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ');                          my $msg = $fields{$field};
     if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {                          if ($name eq 'webreferences') {
  if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {                              if ($msg =~ m{^https?://}) {
     print $fh &Apache::lonclonecourse::rewritefile(                                  $contents{$name} = '<a href="'.$msg.'"><tt>'.$msg.'</tt></a>';
          &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),                              }
      (%replacehash,$crs => '')                          } else {
     );                              $msg = &Encode::decode('utf8',$msg);
  } else {                              $msg = $gateway->process_outgoing_html($msg,1);
     print $fh                              $contents{$name} = $msg;
          &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);                          }
        }                      } elsif ($field eq 'uploaded.photourl') {
  $fh->close();                          my $marker = $simplepages{$item}{marker};
     } else {                          if ($fields{$field} =~ m{^\Q$prefix\E(simplepage/$marker/.+)$}) {
  $fail=1;                              my $filepath = $1;
     }                              my ($relpath,$fname) = ($filepath =~ m{^(.+/)([^/]+)$});
     if ($fail) {                              if ($fname ne '') {
  $r->print('<span class="LC_error">'.&mt('fail').'</span>');                                  $fname=~s/\.(\w+)$//;
     } else {                                  my $ext=$1;
  $r->print('<span class="LC_success">'.&mt('ok').'</span>');                                  $fname = &clean($fname);
     }                                  $fname.='.'.$ext;
  }                                  $contents{image} = '<img src="'.$relpath.$fname.'" alt="Image" />';
                                   $replacehash{$filepath} = $relpath.$fname;
                                   $deps{$item}{$filepath} = 1;
                               }
                           }
                       }
                   }
                   $replacehash{'/'.$simplepages{$item}{'res'}} = $simplepages{$item}{'name'};
                   $lookup{'/'.$simplepages{$item}{'res'}} = $item;
                   my $content = '
   <html>
   <head>
   <title>'.$pagetitle.'</title>
   </head>
   <body bgcolor="#ffffff">';
                   if ($contents{title}) {
                       $content .= "\n".'<h2>'.$contents{title}.'</h2>';
                   }
                   if ($contents{image}) {
                       $content .= "\n".$contents{image};
                   }
                   if ($contents{content}) {
                       $content .= '
   <div class="LC_Box">
   <h4 class="LC_hcell">Content</h4>'.
   $contents{content}.'
   </div>';
                   }
                   if ($contents{webreferences}) {
                       $content .= ' 
   <div class="LC_Box">
   <h4 class="LC_hcell">Web References</h4>'.
   $contents{webreferences}.'
   </div>';
                   }
                   $content .= '
   </body>
   </html>
   ';
                   $newcontent{'/'.$simplepages{$item}{res}} = $content; 
               }
           }
    foreach my $item (keys(%tocopy)) {
               unless ($item=~/\.(sequence|page)$/) {
                   my $currurlpath = $prefix.$item;
                   my $currdirpath = &Apache::lonnet::filelocation('',$currurlpath);
                   &recurse_html($mm,$prefix,$currdirpath,$currurlpath,$item,$lookup{$item},\%replacehash,\%deps);
               }
           }
           foreach my $num (sort {$a <=> $b} (@todump)) {
               my $src = $display{$num};
               next if ($src eq '');
               my @needcopy = ();
               if ($replacehash{$src}) {
                   push(@needcopy,$src);
                   if (ref($deps{$num}) eq 'HASH') {
                       foreach my $dep (sort(keys(%{$deps{$num}}))) {
                           if ($replacehash{$dep}) {
                               push(@needcopy,$dep);
                           }
                       }
                   }
               } elsif ($src =~ /^simpleproblem_/) {
                   push(@needcopy,$src);
               }
               next if (@needcopy == 0);
               my ($result,$depresult);
               for (my $i=0; $i<@needcopy; $i++) {
                   my $item = $needcopy[$i];
                   my $newfilename;
                   if ($simpleproblems{$num}) {
                       $newfilename=$title.'/'.$simpleproblems{$num}{'name'};
                   } else {
               $newfilename=$title.'/'.$replacehash{$item};
                   }
           $newfilename=~s/\.(\w+)$//;
           my $ext=$1;
           $newfilename=&clean($newfilename);
           $newfilename.='.'.$ext;
                   my ($newrelpath) = ($newfilename =~ m{^\Q$title/\E(.+)$}); 
                   if ($newrelpath ne $replacehash{$item}) {
                       $replacehash{$item} = $newrelpath;
                   }
           my @dirs=split(/\//,$newfilename);
           my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";
           my $makepath=$path;
           my $fail;
                   my $origin;
           for (my $i=0;$i<$#dirs;$i++) {
       $makepath.='/'.$dirs[$i];
       unless (-e $makepath) {
           unless(mkdir($makepath,0755)) { 
                               $fail = &mt('Directory creation failed.');
                           }
       }
           }
                   if ($i == 0) {
               $result = '<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ';
                   } else {
                       $depresult .= '<li><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt> '.
                                     '<span class="LC_fontsize_small" style="font-weight: bold;">'.
                                     &mt('(dependency)').'</span>: ';
                   }
                   if (-e $path.'/'.$newfilename) {
                       $fail = &mt('Destination already exists -- not overwriting.'); 
           } else {
                       if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
                           if (($item =~ m{^/adm/$match_domain/$match_username/\d+/smppg}) ||
                               ($item =~ /^simpleproblem_/)) {
                               print $fh $newcontent{$item};
                           } else {
                               my $fileloc = &Apache::lonnet::filelocation('',$prefix.$item);
                               if (-e $fileloc) {
                                   if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
                                       if ((($1 eq 'sequence') || ($1 eq 'page')) &&
                                           (ref($has_simpleprobs{$item}) eq 'HASH')) {
                                           my %changes = %{$has_simpleprobs{$item}};
                                           my $content = &Apache::lonclonecourse::rewritefile(
                        &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),
                                                         (%replacehash,$crs => '')
                                                                                             );
                                           my $updatedcontent = '';
                                           my $parser = HTML::TokeParser->new(\$content);
                                           $parser->attr_encoded(1);
                                           while (my $token = $parser->get_token) {
                                               if ($token->[0] eq 'S') {
                                                   if (($token->[1] eq 'resource') &&
                                                       ($token->[2]->{'src'} eq '/res/lib/templates/simpleproblem.problem') && 
                                                       ($changes{$token->[2]->{'id'}})) {
                                                       my $id = $token->[2]->{'id'};
                                                       $updatedcontent .= '<'.$token->[1];
                                                       foreach my $attrib (@{$token->[3]}) {
                                                           next unless ($attrib =~ /^(src|type|title|id)$/);
                                                           if ($attrib eq 'src') {
                                                               my ($file) = ($display{$changes{$id}} =~ /^\Qsimpleproblem_\E(.+)$/); 
                                                               if ($file) {
                                                                   $updatedcontent .= ' '.$attrib.'="'.$file.'"';
                                                               } else {
                                                                   $updatedcontent .= ' '.$attrib.'="'.$token->[2]->{$attrib}.'"'; 
                                                               }
                                                           } else {
                                                               $updatedcontent .= ' '.$attrib.'="'.$token->[2]->{$attrib}.'"';
                                                           }
                                                       }
                                                       $updatedcontent .= ' />'."\n";
                                                   } else {
                                                       $updatedcontent .= $token->[4]."\n";
                                                   }
                                                } else {
                                                    $updatedcontent .= $token->[2];
                                                }
                                            }
                                            print $fh $updatedcontent;
                                       } else {  
                           print $fh &Apache::lonclonecourse::rewritefile(
                        &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),
                                         (%replacehash,$crs => '')
                                 );
                                       }
                                   } else {
                       print $fh
                                           &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);
                   }
                               } else {
                                   $fail = &mt('Source does not exist.');  
                               }
                           }
                           $fh->close();
               } else {
           $fail = &mt('Could not write to destination.');
                       }
           }
                   my $text;
           if ($fail) {
                       $text = '<span class="LC_error">'.&mt('fail').('&nbsp;'x3).$fail.'</span>';
           } else {
                       $text = '<span class="LC_success">'.&mt('ok').'</span>';
                   }
                   if ($i == 0) {
                       $result .= $text;
                   } else {
                       $depresult .= $text.'</li>';
           }
               }
               $r->print($result);
               if ($depresult) {
                   $r->print('<ul>'.$depresult.'</ul>');
               }
           }
     } else {      } else {
         $r->print(&mt('Searching ...').'<br />');          my ($navmap,$errormsg) =
         $r->rflush();              &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');
 # Input form          if (!ref($navmap)) {
         $r->print('<form name="dumpdoc" action="" method="post">'."\n");              $r->print($errormsg);
  unless ($home==1) {          } else {
     $r->print('<div class="LC_left_float">'.              $r->print('<div id="searching">'.&mt('Searching ...').'</div>');
       '<fieldset><legend>'.              $r->rflush();
                       &mt('Select the Authoring Space').              my ($preamble,$formname);
                       '</legend><select name="authorspace">');              $formname = 'dumpdoc';
  }      unless ($home==1) {
  foreach my $key (sort(keys(%outhash))) {          $preamble = '<div class="LC_left_float">'.
     if ($key=~/^home_(.+)$/) {              '<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) {   if ($home==1) {
     $r->print(      $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />';
   '<input type="hidden" name="authorspace" value="'.$1.'" />');  
  } else {   } else {
     $r->print('<option value="'.$1.'">'.$1.' - '.      $preamble .= '<option value="'.$user.'">'.$user.' - '.
       &Apache::loncommon::plainname(split(/\:/,$1)).'</option>');           &Apache::loncommon::plainname(split(/\:/,$user)).'</option>';
  }          }
     }      }
  }      unless ($home==1) {
  unless ($home==1) {          $preamble .= '</select></fieldset></div>'."\n";
     $r->print('</select></fieldset></div>'."\n");  
  }  
  my $title=$origcrsdata{'description'};  
  $title=~s/[\/\s]+/\_/gs;  
  $title=&clean($title);  
  $r->print('<div class="LC_left_float">'.  
                   '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.  
                   '<input type="text" size="50" name="authorfolder" value="'.  
                   $title.'" />'.  
                   '</fieldset></div><br clear="all" />'."\n");  
  &tiehash();  
  $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>'  
                  .&Apache::loncommon::start_data_table()  
                  .&Apache::loncommon::start_data_table_header_row()  
                  .'<th>'.&mt('Internal Filename').'</th>'  
                  .'<th>'.&mt('Title').'</th>'  
                  .'<th>'.&mt('Save as ...').'</th>'  
                  .&Apache::loncommon::end_data_table_header_row());  
  foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {  
     $r->print(&Apache::loncommon::start_data_table_row()  
                      .'<td>'.$file.'</td>');  
     my ($ext)=($file=~/\.(\w+)$/);  
     my $title=$hash{'title_'.$hash{  
  'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};  
     $r->print('<td>'.($title?$title:'&nbsp;').'</td>');  
     if (!$title) {  
  $title=$file;  
     } else {  
  $title=~s|/|_|g;  
     }      }
     $title=~s/\.(\w+)$//;      my $title=$origcrsdata{'description'};
       $title=~s/[\/\s]+/\_/gs;
     $title=&clean($title);      $title=&clean($title);
     $title.='.'.$ext;      $preamble .= '<div class="LC_left_float">'.
     $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"                           '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                      .&Apache::loncommon::end_data_table_row());                           '<input type="text" size="50" name="authorfolder" value="'.
  }                           $title.'" />'.
  $r->print(&Apache::loncommon::end_data_table());                           '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
  &untiehash();              my %uploadedfiles;
  $r->print(      &tiehash();
   '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>');      foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
           my ($ext)=($file=~/\.(\w+)$/);
   # FIXME Check supplemental here
           my $title=$hash{'title_'.$hash{
                   'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};
           if (!$title) {
       $title=$file;
           } else {
       $title=~s|/|_|g;
           }
           $title=~s/\.(\w+)$//;
           $title=&clean($title);
           $title.='.'.$ext;
   #    $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"
                   $uploadedfiles{$file} = $title;
       }
       &untiehash();
               $r->print(&Apache::loncourserespicker::create_picker($navmap,'dumpdocs',$formname,$crstype,undef,
                                                                    undef,undef,$preamble,$home,\%uploadedfiles));
           }
     }      }
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
 }  }
   
   sub recurse_html {
       my ($mm,$prefix,$currdirpath,$currurlpath,$container,$item,$replacehash,$deps) = @_;
       return unless ((ref($replacehash) eq 'HASH') && (ref($deps) eq 'HASH'));
       my (%allfiles,%codebase);
       if (&Apache::lonnet::extract_embedded_items($currdirpath,\%allfiles,\%codebase) eq 'ok') {
           if (keys(%allfiles)) {
               foreach my $dependency (keys(%allfiles)) {
                   next if (($dependency =~ m{^/(res|adm)/}) || ($dependency =~ m{^https?://}));
                   my ($depurl,$relfile,$newcontainer);
                   if ($dependency =~ m{^/}) {
                       if ($dependency =~ m{^\Q$currurlpath/\E(.+)$}) {
                           $relfile = $1;
                           if ($dependency =~ m{^\Q$prefix\E(.+)$}) {
                               $newcontainer = $1;
                               next if ($replacehash->{$newcontainer});
                           }
                           $depurl = $dependency;
                       } else {
                           next;
                       }
                   } else {
                       $relfile = $dependency;
                       $depurl = $currurlpath;
                       $depurl =~ s{[^/]+$}{};  
                       $depurl .= $dependency;
                       ($newcontainer) = ($depurl =~ m{^\Q$prefix\E(.+)$}); 
                   }
                   next if ($relfile eq '');
                   my $newname = $replacehash->{$container};
                   $newname =~ s{[^/]+$}{};
                   $replacehash->{$newcontainer} = $newname.$relfile;
                   $deps->{$item}{$newcontainer} = 1;
                   my ($newurlpath) = ($depurl =~ m{^(.*)/[^/]+$});  
                   my $depfile = &Apache::lonnet::filelocation('',$depurl);
                   my $type = $mm->checktype_filename($depfile);
                   if ($type eq 'text/html') {
                       &recurse_html($mm,$prefix,$depfile,$newurlpath,$newcontainer,$item,$replacehash,$deps);
                   }
               }
           }
       }
       return;
   }
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
       my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
           %removeparam,$importuploaded,$fixuperrors);
       $allmaps = {};
     while (@files) {      while (@files) {
  my ($name, $url, $residx) = @{ shift(@files) };   my ($name, $url, $residx) = @{ shift(@files) };
         if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$})          if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$})
Line 288  sub group_import { Line 605  sub group_import {
             $env{'form.output'}=$newmapstr;              $env{'form.output'}=$newmapstr;
             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,              my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
                                                 'output',$1.$2);                                                  'output',$1.$2);
             if ($result != m|^/uploaded/|) {              if ($result !~ m{^/uploaded/}) {
                 $errtext.='Map not saved: A network error occurred when trying to save the new map. ';                  $errtext.='Map not saved: A network error occurred when trying to save the new map. ';
                 $fatal = 2;                  $fatal = 2;
             }              }
Line 297  sub group_import { Line 614  sub group_import {
             }              }
         }          }
  if ($url) {   if ($url) {
               if (($caller eq 'londocs') &&
                   ($folder =~ /^default/)) {
                   if (($url =~ /\.(page|sequence)$/) && (!$donechk)) {
                       my $chome = &Apache::lonnet::homeserver($coursenum,$coursedom);
                       my $cid = $coursedom.'_'.$coursenum;
                       $allmaps =
                           &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
                                                                $chome,$cid);
                       $donechk = 1;
                   }
                   if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) {
                       &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                                            \%addedmaps,\%hierarchy,\%titles,$allmaps);
                       $importuploaded = 1;
                   } elsif ($url =~ m{^/res/.+\.(page|sequence)$}) {
                       next if ($allmaps->{$url});
                   }
               }
     if (!$residx      if (!$residx
  || defined($LONCAPA::map::zombies[$residx])) {   || defined($LONCAPA::map::zombies[$residx])) {
  $residx = &LONCAPA::map::getresidx($url,$residx);   $residx = &LONCAPA::map::getresidx($url,$residx);
Line 304  sub group_import { Line 639  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'; }
     $url  = &LONCAPA::map::qtunescape($url);  
     $name = &LONCAPA::map::qtunescape($name);      $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$}) {
                   my $filepath = $1;
                   my $fname = $name;
                   if ($fname =~ /^\W+$/) {
                       $fname = 'web';
                   } else {
                       $fname =~ s/\W/_/g;
                   }
                   if (length($fname > 15)) {
                       $fname = substr($fname,0,14);
                   }
                   my $initialtext = &mt('Replace with your own content.');
                   my $newhtml = <<END;
   <html>
   <head>
   <title>$name</title>
   </head>
   <body bgcolor="#ffffff">
   $initialtext
   </body>
   </html>
   END
                   $env{'form.output'}=$newhtml;
                   my $result = 
                       &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
                                                             'output',
                                                             "$filepath/$residx/$fname.html");
                   if ($result =~ m{^/uploaded/}) {
                       $url = $result;
                       if ($filepath =~ /^supplemental/) {
                           $name = time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                                   $env{'user.domain'}.'___&&&___'.$name;
                       }
                   } else {
                       return (&mt('Failed to save new web page.'),1);
                   }
               }
               $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'));
  }   }
     }      }
     return &storemap($coursenum, $coursedom, $folder.'.'.$container,1);      if ($importuploaded) {
           my %import_errors;
           my %updated = (
                             removefrommap => \%removefrommap,
                             removeparam   => \%removeparam,
                         );
           my ($result,$msgsarray,$lockerror) = 
               &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);
           if (keys(%import_errors) > 0) {
               $fixuperrors =
                   '<p span class="LC_warning">'."\n".
                   &mt('The following files are either dependencies of a web page or references within a folder and/or composite page for which errors occurred during import:')."\n".
                   '<ul>'."\n";
               foreach my $key (sort(keys(%import_errors))) {
                   $fixuperrors .= '<li>'.$key.'</li>'."\n";
               }
               $fixuperrors .= '</ul></p>'."\n";
           }
           if (ref($msgsarray) eq 'ARRAY') {
               if (@{$msgsarray} > 0) {
                   $fixuperrors .= '<p class="LC_info">'.
                                   join('<br />',@{$msgsarray}).
                                   '</p>';
               }
           }
           if ($lockerror) {
               $fixuperrors .= '<p class="LC_error">'.
                               $lockerror.
                               '</p>';
           }
       }
       my ($errtext,$fatal) =
           &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
       unless ($fatal) {
           if ($folder =~ /^supplemental/) {
               &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);
               my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                               $folder.'.'.$container);
           }
       }
       return ($errtext,$fatal,$fixuperrors);
 }  }
   
 sub log_docs {  sub log_docs {
Line 396  sub docs_change_log { Line 811  sub docs_change_log {
     }      }
     my $folderpath=$env{'form.folderpath'};      my $folderpath=$env{'form.folderpath'};
     if ($folderpath eq '') {      if ($folderpath eq '') {
         $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents').':::::');          $folderpath = 'default&'.&escape(&mt('Main Content').':::::');
     }      }
     $pathitem = '<input type="hidden" name="folderpath" value="'.      $pathitem = '<input type="hidden" name="folderpath" value="'.
                 &HTML::Entities::encode($folderpath,'<>&"').'" />';                  &HTML::Entities::encode($folderpath,'<>&"').'" />';
Line 561  sub docs_change_log { Line 976  sub docs_change_log {
   
 sub update_paste_buffer {  sub update_paste_buffer {
     my ($coursenum,$coursedom,$folder) = @_;      my ($coursenum,$coursedom,$folder) = @_;
       my (@possibles,%removals,%cuts);
       if ($env{'form.multiremove'}) {
           $env{'form.multiremove'} =~ s/,$//;
           map { $removals{$_} = 1; } split(/,/,$env{'form.multiremove'});
       }
       if (($env{'form.multicopy'}) || ($env{'form.multicut'})) {
           if ($env{'form.multicut'}) {
               $env{'form.multicut'} =~ s/,$//;
               foreach my $item (split(/,/,$env{'form.multicut'})) {
                   unless ($removals{$item}) {
                       $cuts{$item} = 1;
                       push(@possibles,$item.':cut');
                   }
               }
           }
           if ($env{'form.multicopy'}) {
               $env{'form.multicopy'} =~ s/,$//;
               foreach my $item (split(/,/,$env{'form.multicopy'})) {
                   unless ($removals{$item} || $cuts{$item}) {
                       push(@possibles,$item.':copy'); 
                   }
               }
           }
       } elsif ($env{'form.markcopy'}) {
           @possibles = split(/,/,$env{'form.markcopy'});
       }
   
     return if (!defined($env{'form.markcopy'}));      return if (@possibles == 0);
     return if (!defined($env{'form.copyfolder'}));      return if (!defined($env{'form.copyfolder'}));
     return if ($env{'form.markcopy'} < 0);  
   
     my ($errtext,$fatal) = &mapread($coursenum,$coursedom,      my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
     $env{'form.copyfolder'});      $env{'form.copyfolder'});
   
     return if ($fatal);      return if ($fatal);
   
 # Mark for copying      my %curr_groups = &Apache::longroup::coursegroups();
     my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);  
     if (&is_supplemental_title($title)) {  # Retrieve current paste buffer suffixes.
         &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});      my @currpaste = split(/,/,$env{'docs.markedcopies'});
  ($title) = &Apache::loncommon::parse_supplemental_title($title);      my (%pasteurls,@newpaste);
     } elsif ($env{'docs.markedcopy_supplemental'}) {  
         &Apache::lonnet::delenv('docs.markedcopy_supplemental');  # Construct identifiers for current contents of user's paste buffer
     }      if (@currpaste) {
     $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};          foreach my $suffix (@currpaste) {
                my $cid = $env{'docs.markedcopy_crs_'.$suffix};
     (my $cmd,undef)=split('_',$env{'form.cmd'});               my $url = $env{'docs.markedcopy_url_'.$suffix};
                if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
     my %addtoenv = (                   ($url ne '')) {
                     'docs.markedcopy_title' => $title,                   $pasteurls{$cid.'_'.$url} = 1;
                     'docs.markedcopy_url'   => $url,               }
                     'docs.markedcopy_cmd'   => $cmd,          }
                    );      }
     &Apache::lonnet::delenv('docs.markedcopy_nested');  
     &Apache::lonnet::delenv('docs.markedcopy_nestednames');  # Mark items for copying (skip any items already in user's paste buffer)
     if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {      my %addtoenv;
         my $prefix = $1;                    
         my $subdir =$2;      foreach my $item (@possibles) {
         if ($subdir eq '') {          my ($orderidx,$cmd) = split(/:/,$item);
             $subdir = $prefix;          next if ($orderidx =~ /\D/);
         }          next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove'));
         my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);          my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]);
         &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps,          my %denied = &action_restrictions($coursenum,$coursedom,
                              \%hierarchy,\%titles,\%allmaps);                                            &LONCAPA::map::qtescape($url),
         if (ref($hierarchy{$url}) eq 'HASH') {                                            $env{'form.folderpath'},\%curr_groups);
             my ($nested,$nestednames);          next if ($denied{'copy'});
             &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames);          $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
             $nested =~ s/\&$//;          next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));
             $nestednames =~ s/\Q___&&&___\E$//;          my ($suffix,$errortxt,$locknotfreed) =
             if ($nested ne '') {              &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');
                 $addtoenv{'docs.markedcopy_nested'} = $nested;          push(@newpaste,$suffix);
             }          if ($locknotfreed) {
             if ($nestednames ne '') {              return $locknotfreed;
                 $addtoenv{'docs.markedcopy_nestednames'} = $nestednames;              last;
           }
           if (&is_supplemental_title($title)) {
               &Apache::lonnet::appenv({'docs.markedcopy_supplemental_'.$suffix => $title});
       ($title) = &Apache::loncommon::parse_supplemental_title($title);
           }
   
           $addtoenv{'docs.markedcopy_title_'.$suffix} = $title,
           $addtoenv{'docs.markedcopy_url_'.$suffix}   = $url,
           $addtoenv{'docs.markedcopy_cmd_'.$suffix}   = $cmd,
           $addtoenv{'docs.markedcopy_crs_'.$suffix}   = $env{'request.course.id'};
    
           if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {
               my $prefix = $1;
               my $subdir =$2;
               if ($subdir eq '') {
                   $subdir = $prefix;
               }
               my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);
               &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps,
                                    \%hierarchy,\%titles,\%allmaps);
               if (ref($hierarchy{$url}) eq 'HASH') {
                   my ($nested,$nestednames);
                   &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames);
                   $nested =~ s/\&$//;
                   $nestednames =~ s/\Q___&&&___\E$//;
                   if ($nested ne '') {
                       $addtoenv{'docs.markedcopy_nested_'.$suffix} = $nested;
                   }
                   if ($nestednames ne '') {
                       $addtoenv{'docs.markedcopy_nestednames_'.$suffix} = $nestednames;
                   }
             }              }
         }          }
     }      }
       if (@newpaste) {
           $addtoenv{'docs.markedcopies'} = join(',',(@currpaste,@newpaste));
       }
     &Apache::lonnet::appenv(\%addtoenv);      &Apache::lonnet::appenv(\%addtoenv);
     delete($env{'form.markcopy'});      delete($env{'form.markcopy'});
 }  }
Line 643  sub recurse_uploaded_maps { Line 1116  sub recurse_uploaded_maps {
   
 sub print_paste_buffer {  sub print_paste_buffer {
     my ($r,$container,$folder,$coursedom,$coursenum) = @_;      my ($r,$container,$folder,$coursedom,$coursenum) = @_;
     return if (!defined($env{'docs.markedcopy_url'}));      return if (!defined($env{'docs.markedcopies'}));
   
     my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent);      unless (($env{'form.pastemarked'}) || ($env{'form.clearmarked'})) {
     my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];          return if ($env{'docs.markedcopies'} eq '');
     if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {  
         $is_external = 1;  
     }      }
   
     my ($canpaste,$nopaste,$othercrs,$areachange,$is_uploaded_map);      my @currpaste = split(/,/,$env{'docs.markedcopies'});
     if ($folder =~ /^supplemental/) {      my ($pasteitems,@pasteable);
         $canpaste = &supp_pasteable($env{'docs.markedcopy_url'});  
         unless ($canpaste) {  
             $nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.');  
         }   
     } else {  
         $canpaste = 1;  
     }  
   
     if ($canpaste) {  # Construct identifiers for current contents of user's paste buffer
         if ($env{'docs.markedcopy_url'} =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {      foreach my $suffix (@currpaste) {
             my $srcdom = $1;          next if ($suffix =~ /\D/);
             my $srcnum = $2;          my $cid = $env{'docs.markedcopy_crs_'.$suffix};
             my $rem = $3;          my $url = $env{'docs.markedcopy_url_'.$suffix};
             if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {          if (($cid =~ /^$match_domain\_$match_courseid$/) &&
                 $othercourse = 1;              ($url ne '')) {
                 if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {              my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,
                     if ($canpaste) {                  $canpaste,$nopaste,$othercrs,$areachange);
                         $othercrs = '<br />'.&mt('(from another course).');                my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
               if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {
                   $is_external = 1;
               }
               if ($folder =~ /^supplemental/) {
                   $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});
                   unless ($canpaste) {
                       $nopaste = &mt('Paste into Supplemental Content unavailable.');
                   }
               } else {
                   $canpaste = 1;
               }
               if ($canpaste) {
                   if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
                       my $srcdom = $1;
                       my $srcnum = $2;
                       my $rem = $3;
                       if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                           $othercourse = 1;
                           if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                               if ($canpaste) {
                                   $othercrs = '<br />'.&mt('(from another course)');
                               }
                           } else {
                               $canpaste = 0;
                               $nopaste = &mt('Paste from another course unavailable.'); 
                           }
                       }
                       if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {
                           my $prefix = $1;
                           $parent = $2;
                           if ($folder !~ /^\Q$prefix\E/) {
                               $areachange = 1;
                           }
                           $is_uploaded_map = 1;
                     }                      }
                 } else {  
                     $canpaste = 0;  
                     $nopaste = &mt('Paste from another course unavailable.')   
                 }                  }
             }              }
             if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {              if ($canpaste) {
                 my $prefix = $1;                 push(@pasteable,$suffix);
                 $parent = $2;              }
                 if ($folder !~ /^\Q$prefix\E/) {              my $buffer;
                     $areachange = 1;              if ($is_external) {
                 }                  $buffer = &mt('External Resource').': '.
                 $is_uploaded_map = 1;                      &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.
             }                      &LONCAPA::map::qtescape($url).')';
         }              } else {
     }                  my $icon = &Apache::loncommon::icon($extension);
                   if ($extension eq 'sequence' &&
     $r->print('<fieldset>'                      $url =~ m{/default_\d+\.sequence$}x) {
              .'<legend>'.&mt('Clipboard').'</legend>');                      $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
     my ($type,$buffer);                      $icon .= '/navmap.folder.closed.gif';
     if ($is_external) {                  }
         $type = &mt('External Resource');                  $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'.
         $buffer = $type.': '.                            ': '.
                   &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.                            &Apache::loncommon::parse_supplemental_title(
                   &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';                               &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}));
     }  else {              }
         my $icon = &Apache::loncommon::icon($extension);              $pasteitems .= '<div class="LC_left_float">';
         if ($extension eq 'sequence' &&              my ($options,$onclick);
             $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {              if (($canpaste) && (!$areachange) && (!$othercourse) &&
             $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));                  ($env{'docs.markedcopy_cmd_'.$suffix} eq 'cut')) {
             $icon .= '/navmap.folder.closed.gif';                  if (($is_uploaded_map) ||
         }                      ($url =~ /(bulletinboard|smppg)$/) ||
         $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';                      ($url =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {
         $buffer = $icon.$type.': '.  &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}));                      $options = &paste_options($suffix,$is_uploaded_map,$parent);
     }                      $onclick= 'onclick="showOptions(this,'."'$suffix'".');" ';
     if ($canpaste) {                  }
         $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);              }
         if (($is_uploaded_map) && (!$areachange)) {              $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';
             if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) {              if ($nopaste) {
                 $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.                   $pasteitems .= $nopaste;   
                           '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.              } else {
                           &mt('Show Paste Options').'</a></span><br />'.                  if ($othercrs) {
                           '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).                      $pasteitems .= $othercrs;
                           '<label>'.                  }
                           '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.                  if ($options) {
                           &mt('Copy to new folder').'</label>'.('&nbsp;' x2).                      $pasteitems .= $options;
                           '<label>'.                     }
                           '<input type="radio" name="docs.markedcopy_options" value="move" />'.              }
                           &mt('Move old folder').'</label><br />');              $pasteitems .= '</div>';
                 if ($env{'docs.markedcopy_nested'}) {          }
                     $r->print('<br />'.&mt('Folder to paste contains sub-folders').      }
                               '<br /><table border="0">');      if ($pasteitems eq '') {
                     my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});          &Apache::lonnet::delenv('docs.markedcopies');
                     my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames'});      }
                     my $lastdir = $parent;      my ($pasteform,$form_start,$buttons,$form_end);
                     my %depths = (      if ($pasteitems) {
                                    $lastdir => 0,          $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>';
                                  );          $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post" onsubmit="return validateClipboard();">';
                     my (%display,%deps);           if (@pasteable) {
                     for (my $i=0; $i<@pastemaps; $i++) {              $buttons = '<input type="submit" name="pastemarked" value="'.&mt('Paste selected').'" />'.('&nbsp;'x2);
                         ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);          }
                         my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);          $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.
                         my @subfolders = split(/,/,$subfolderstr);                      '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
                         $deps{$lastdir} = \@subfolders;          $form_end = '</form>';
                         my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);  
                         my $depth = $depths{$lastdir} + 1;  
                         my $offset = int($depth * 4);  
                         my $indent = ('&nbsp;' x $offset);  
                         for (my $j=0; $j<@subfolders; $j++) {  
                             $depths{$subfolders[$j]} = $depth;  
                             $display{$subfolders[$j]} =   
                                   '<tr><td>'.$indent.$subfoldertitles[$j].'&nbsp;</td>'.  
                                   '<td><label>'.  
                                   '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.('&nbsp;' x2).  
                                   '<label>'.  
                                   '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="move" />'.  
                                   &mt('Move old').'</label>'.  
                                   '</td></tr>';  
                         }  
                     }  
                     &recurse_print($r,$parent,\%deps,\%display);  
                     $r->print('</table>');  
                 }  
                 $r->print('</div>');  
             }  
         }  
         $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs);  
         $r->print('  
         <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />  
 ');  
         $r->print('</form>');  
     } else {      } else {
         $r->print(&mt('Paste buffer contains:').' '.$buffer.          $pasteitems = &mt('Clipboard is empty');
                   '<br /><p class="LC_info">'.$nopaste.'</p>');  
     }      }
     $r->print('</fieldset>');      $r->print($form_start
                .'<fieldset>'
                .'<legend>'.&mt('Clipboard').('&nbsp;' x2).$buttons.'</legend>'
                .$pasteitems
                .'</fieldset>'
                .$form_end);
   }
   
   sub paste_options {
       my ($suffix,$is_uploaded_map,$parent) = @_;
       my ($copytext,$movetext);
       if ($is_uploaded_map) {
           $copytext = &mt('Copy to new folder');
           $movetext = &mt('Move old');
       } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /bulletinboard$/) {
           $copytext = &mt('Copy to new board');
           $movetext = &mt('Move (not posts)');
       } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /smppg$/) {
           $copytext = &mt('Copy to new page');
           $movetext = &mt('Move');
       } else {
           $copytext = &mt('Copy to new file');
           $movetext = &mt('Move');
       }
       my $output = '<br />'.
                    '<span id="pasteoptionstext_'.$suffix.'" class="LC_fontsize_small LC_nobreak"></span>'.
                    '<div id="pasteoptions_'.$suffix.'" class="LC_dccid" style="display:none;"><span class="LC_nobreak">'.('&nbsp;'x 4).
                    '<label>'.
                    '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="new" checked="checked" />'.
                    $copytext.'</label></span>'.('&nbsp;'x2).' '.
                    '<span class="LC_nobreak"><label>'.
                    '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="move" />'.
                    $movetext.'</label></span>';
       if (($is_uploaded_map) && ($env{'docs.markedcopy_nested_'.$suffix})) {
           $output .= '<br /><fieldset><legend>'.&mt('Folder to paste contains sub-folders').
                      '</legend><table border="0">';
           my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});
           my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames_'.$suffix});
           my $lastdir = $parent;
           my %depths = (
                          $lastdir => 0,
                        );
           my (%display,%deps);
           for (my $i=0; $i<@pastemaps; $i++) {
               ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);
               my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);
               my @subfolders = split(/,/,$subfolderstr);
               $deps{$lastdir} = \@subfolders;
               my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);
               my $depth = $depths{$lastdir} + 1;
               my $offset = int($depth * 4);
               my $indent = ('&nbsp;' x $offset);
               for (my $j=0; $j<@subfolders; $j++) {
                   $depths{$subfolders[$j]} = $depth;
                   $display{$subfolders[$j]} =
                       '<tr><td>'.$indent.$subfoldertitles[$j].'&nbsp;</td>'.
                       '<td><label>'.
                       '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.('&nbsp;' x2).
                       '<label>'.
                       '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="move" />'.
                       &mt('Move old').'</label>'.
                       '</td></tr>';
                }
           }
           &recurse_print(\$output,$parent,\%deps,\%display);
           $output .= '</table></fieldset>';
       }
       $output .= '</div>';
       return $output;
 }  }
   
 sub recurse_print {  sub recurse_print {
     my ($r,$dir,$deps,$display) = @_;      my ($outputref,$dir,$deps,$display) = @_;
     $r->print($display->{$dir}."\n");      $$outputref .= $display->{$dir}."\n";
     if (ref($deps->{$dir}) eq 'ARRAY') {      if (ref($deps->{$dir}) eq 'ARRAY') {
         foreach my $subdir (@{$deps->{$dir}}) {          foreach my $subdir (@{$deps->{$dir}}) {
             &recurse_print($r,$subdir,$deps,$display);              &recurse_print($outputref,$subdir,$deps,$display);
         }          }
     }      }
 }  }
Line 793  sub supp_pasteable { Line 1328  sub supp_pasteable {
   
 sub paste_popup_js {  sub paste_popup_js {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           show => 'Show Paste Options',                                            show => 'Show Options',
                                           hide => 'Hide Paste Options',                                            hide => 'Hide Options',
                                             none => 'No items selected from clipboard.',
                                         );                                          );
     return <<"END";      return <<"END";
   
 function showPasteOptions() {  function showPasteOptions(suffix) {
     document.getElementById('pasteoptions').style.display='block';      document.getElementById('pasteoptions_'+suffix).style.display='block';
     document.getElementById('pasteoptions').style.textAlign='left';      document.getElementById('pasteoptionstext_'+suffix).innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:hidePasteOptions(\\''+suffix+'\\');" class="LC_menubuttons_link">$lt{'hide'}</a>';
     document.getElementById('pasteoptions').style.textFace='normal';  
     document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:hidePasteOptions();" class="LC_menubuttons_link">$lt{'hide'}</a><br />';  
     return;      return;
 }  }
   
 function hidePasteOptions() {  function hidePasteOptions(suffix) {
     document.getElementById('pasteoptions').style.display='none';      document.getElementById('pasteoptions_'+suffix).style.display='none';
     document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>';      document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$lt{'show'}</a>';
     return;      return;
 }  }
   
 END  function showOptions(caller,suffix) {
       if (document.getElementById('pasteoptionstext_'+suffix)) {
           if (caller.checked) {
               document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$lt{'show'}</a>';
           } else {
               document.getElementById('pasteoptionstext_'+suffix).innerHTML ='';
           }
           if (document.getElementById('pasteoptions_'+suffix)) {
               document.getElementById('pasteoptions_'+suffix).style.display='none';
           }
       }
       return;
   }
   
   function validateClipboard() {
       var numchk = 0;
       if (document.pasteform.pasting.length > 1) {
           for (var i=0; i<document.pasteform.pasting.length; i++) {
               if (document.pasteform.pasting[i].checked) {
                   numchk ++;
               }
           }
       } else {
           if (document.pasteform.pasting.type == 'checkbox') {
               if (document.pasteform.pasting.checked) {
                   numchk ++; 
               } 
           }
       }
       if (numchk > 0) { 
           return true;
       } else {
           alert("$lt{'none'}");
           return false;
       }
 }  }
   
   END
   
   }
   
 sub do_paste_from_buffer {  sub do_paste_from_buffer {
     my ($coursenum,$coursedom,$folder,$container,$errors) = @_;      my ($coursenum,$coursedom,$folder,$container,$errors) = @_;
   
   # Array of items in paste buffer
       my (@currpaste,%pastebuffer,%allerrors);
       @currpaste = split(/,/,$env{'docs.markedcopies'});
   
 # Early out if paste buffer is empty  # Early out if paste buffer is empty
     if (!$env{'form.pastemarked'}) {      if (@currpaste == 0) {
         return ();          return ();
       } 
       map { $pastebuffer{$_} = 1; } @currpaste;
   
   # Array of items selected items to paste
       my @reqpaste = &Apache::loncommon::get_env_multiple('form.pasting');
   
   # Early out if nothing selected to paste
       if (@reqpaste == 0) {
           return();
       }
       my @topaste;
       foreach my $suffix (@reqpaste) {
           next if ($suffix =~ /\D/);
           next unless (exists($pastebuffer{$suffix}));
           push(@topaste,$suffix);
     }      }
   
 # Supplemental content may only include certain types of content  # Early out if nothing available to paste
 # Early out if pasted content is not supported in Supplemental area      if (@topaste == 0) {
     if ($folder =~ /^supplemental/) {          return();
         unless (&supp_pasteable($env{'docs.markedcopy_url'})) {  
             return (&mt('Paste failed: content type is not supported within Supplemental Content'));  
         }  
     }      }
   
 # Prepare to paste resource at end of list      my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,
     my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});          %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult);
     my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});  
   
     my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove);      foreach my $suffix (@topaste) {
     if ($url=~/\.(page|sequence)$/) {          my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
         $is_map = 1;   # Supplemental content may only include certain types of content
     }  # Early out if pasted content is not supported in Supplemental area
     if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) {          if ($folder =~ /^supplemental/) {
         $srcdom = $1;              unless (&supp_pasteable($url)) {
         $srcnum = $2;                  $notinsupp{$suffix} = 1;
         my $oldprefix = $3;                  next;
               }
           }
           if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) {
               my $srcd = $1;
               my $srcn = $2;
 # When paste buffer was populated using an active role in a different course  # When paste buffer was populated using an active role in a different course
 # check for mdc privilege in the course from which the resource was pasted   # check for mdc privilege in the course from which the resource was pasted
         if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {              if (($srcd ne $coursedom) || ($srcn ne $coursenum)) {
             unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {                  unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {
                 return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.'));                      $notincrs{$suffix} = 1;
                       next;
                   }
             }              }
               $srcdom{$suffix} = $srcd;
               $srcnum{$suffix} = $srcn;
           }
   
           push(@dopaste,$suffix);
           if ($url=~/\.(page|sequence)$/) {
               $is_map{$suffix} = 1; 
         }          }
   
           if ($url =~ m{^/uploaded/$match_domain/$match_courseid/([^/]+)}) {
               my $oldprefix = $1;
 # When pasting content from Main Content to Supplemental Content and vice versa   # When pasting content from Main Content to Supplemental Content and vice versa 
 # URLs will contain different paths (which depend on whether pasted item is  # URLs will contain different paths (which depend on whether pasted item is
 # a folder/page or a document.     # a folder/page or a document.   
         if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {              if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
             $prefixchg = 1;                  $prefixchg{$suffix} = 'docstosupp';
             %before = ( map => 'default',              } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
                         doc => 'docs');                  $prefixchg{$suffix} = 'supptodocs';
             %after =  ( map => 'supplemental',              }
                         doc => 'supplemental' );  
         } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {  
             $prefixchg = 1;  
             %before = ( map => 'supplemental',  
                         doc => 'supplemental');  
             %after  = ( map => 'default',  
                         doc => 'docs');  
         }  
   
 # If pasting an uploaded map, get list of contained uploaded maps.  # If pasting an uploaded map, get list of contained uploaded maps.
         my @nested;              if ($env{'docs.markedcopy_nested_'.$suffix}) {
         if ($env{'docs.markedcopy_nested'}) {                  my @nested;
             my ($type) = ($oldprefix =~ /^(default|supplemental)/);                  my ($type) = ($oldprefix =~ /^(default|supplemental)/);
             my @items = split(/\&/,$env{'docs.markedcopy_nested'});                  my @items = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});
             my @deps = map { /\d+:([\d,]+$)/ } @items;                  my @deps = map { /\d+:([\d,]+$)/ } @items;
             foreach my $dep (@deps) {                  foreach my $dep (@deps) {
                 if ($dep =~ /,/) {                      if ($dep =~ /,/) {
                     push(@nested,split(/,/,$dep));                          push(@nested,split(/,/,$dep));
                 } else {                      } else {
                     push(@nested,$dep);                          push(@nested,$dep);
                       }
                 }                  }
             }                  foreach my $item (@nested) {
             foreach my $item (@nested) {                      if ($env{'form.docs.markedcopy_'.$suffix.'_'.$item} eq 'move') {
                 if ($env{'form.docs.markedcopy_'.$item} eq 'move') {                          push(@{$marktomove{$suffix}},$type.'_'.$item);
                     $tomove{$type.'_'.$item} = 1;                      }
                 }                  }
             }              }
         }          }
     }      }
   
 # Maps need to be copied first  # Early out if nothing available to paste
     my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,      if (@dopaste == 0) {
         %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);          return ();
     $oldurl = $url;  
     if ($is_map) {  
         if ($folder =~ /^default/) {  
             my $lastchange = &Apache::lonnet::get_coursechange($coursedom,$coursenum);  
             if ($lastchange > $env{'request.course.tied'}) {  
                 &reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"});   
             }  
         }  
 # If pasting a map, check if map contains other maps  
         my (%allmaps,%hierarchy,%titles);  
         if ($folder =~ /^default/) {  
             my $navmap = Apache::lonnavmaps::navmap->new();  
             if (defined($navmap)) {  
                 foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) {  
                     $allmaps{$res->src()} = 1;  
                 }  
             }  
         }  
         &contained_map_check($url,$folder,\%removefrommap,\%removeparam,  
                              \%addedmaps,\%hierarchy,\%titles,\%allmaps);  
         if ($url=~ m{^/uploaded/}) {  
             my $newurl;  
             unless ($env{'form.docs.markedcopy_options'} eq 'move') {  
                 ($newurl,my $error) =   
                     &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,  
                                     $srcdom,$srcnum,\$title,\%allmaps,\%newurls);  
                 if ($error) {  
                     return ($error);  
                 }  
                 if ($newurl ne '') {  
                     if ($newurl ne $url) {  
                         if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {  
                             $newsubdir{$url} = $1;  
                         }  
                         $mapchanges{$url} = 1;  
                     }  
                 }  
             }  
             if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||  
                 (($newurl ne '') && ($newurl ne $url))) {  
                 unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,  
                                           \%allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,  
                                           \%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove,  
                                           \%newsubdir,\%newurls)) {  
                     $mapmoves{$url} = 1;  
                 }  
                 $url = $newurl;  
             } elsif ($env{'docs.markedcopy_nested'}) {  
                 &url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,\%allmaps,\%rewrites,  
                                   \%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves,  
                                   \%mapchanges,\%tomove,\%newsubdir,\%newurls);   
             }  
         } elsif ($url=~m {^/res/}) {  
 # published maps can only exists once, so remove it from paste buffer when done  
             &Apache::lonnet::delenv('docs.markedcopy');  
 # if pasting published map (main content are only) check map is not already in course  
             if ($folder =~ /^default/) {  
                 if ($allmaps{$url}) {  
                     return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'));  
                 }  
             }  
         }  
     }  
     if ($url=~ m{/smppg$}) {  
  my $db_name = &Apache::lonsimplepage::get_db_name($url);  
  if ($db_name =~ /^smppage_/) {  
     #simple pages, need to copy the db contents to a new one.  
     my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);  
     my $now = time();  
     $db_name =~ s{_\d*$ }{_$now}x;  
     my $dbresult=&Apache::lonnet::put($db_name,\%contents,  
     $coursedom,$coursenum);  
             if ($dbresult eq 'ok') {  
                 $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;  
                 $title=&mt('Copy of').' '.$title;  
             } else {  
                 return (&mt('Paste failed: An error occurred when copying the simple page.'));  
             }  
  }  
     }      }
     $title = &LONCAPA::map::qtunescape($title);  
     my $ext='false';  
     if ($url=~m{^http(|s)://}) { $ext='true'; }  
     $url       = &LONCAPA::map::qtunescape($url);  
   
 # For uploaded files (excluding pages/sequences) path in copied file is changed  # Populate message hash and hashes used for main content <=> supplemental content
 # if paste is from Main to Supplemental (or vice versa), or if pasting between  # changes    
 # courses.  
   
     my $newidx;      %msgs = &Apache::lonlocal::texthash (
     unless ($is_map) {                  notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
 # Now insert the URL at the bottom                  notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
         $newidx = &LONCAPA::map::getresidx($url);                  duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
         if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {              );
             my $relpath = $1;  
             if ($relpath ne '') {      %before = (
                 my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});                   docstosupp => {
                 my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);                                     map => 'default',
                 my $newprefix = $newloc;                                     doc => 'docs',
                 if ($newloc eq 'default') {                                 },
                     $newprefix = 'docs';                   supptodocs => {
                 }                                     map => 'supplemental',
                 if ($newdocsdir eq '') {                                     doc => 'supplemental',
                     $newdocsdir = 'default';                                 },
                 }                );
                 if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {  
                     my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";      %after = (
                     $url =                   docstosupp => {
                         &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,                                     map => 'supplemental',
                                                            &Apache::lonnet::getfile($oldurl));                                     doc => 'supplemental'
                     if ($url eq '/adm/notfound.html') {                                 },
                         return (&mt('Paste failed: an error occurred saving the file.'));                   supptodocs => {
                     } else {                                     map => 'default',
                         my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});                                     doc => 'docs',
                         $newsubpath =~ s{/+$}{/};                                 },
                         $docmoves{$oldurl} = $newsubpath;               );
   
   # Retrieve information about all course maps in main content area 
   
       my $allmaps = {};
       if ($folder =~ /^default/) {
           $allmaps =
               &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
                                                    $env{"course.$env{'request.course.id'}.home"},
                                                    $env{'request.course.id'});
       }
   
       my (@toclear,%mapurls,%lockerrs,%msgerrs,%results);
   
   # Loop over the items to paste
       foreach my $suffix (@dopaste) {
   # Maps need to be copied first
           my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
               %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir,
               %newurls,%tomove);
           if (ref($marktomove{$suffix}) eq 'ARRAY') {
               map { $tomove{$_} = 1; } @{$marktomove{$suffix}};
           }
           my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
           my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});
           my $oldurl = $url;
           if ($is_map{$suffix}) {
   # If pasting a map, check if map contains other maps
               my (%hierarchy,%titles);
               &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                                    \%addedmaps,\%hierarchy,\%titles,$allmaps);
               if ($url=~ m{^/uploaded/}) {
                   my $newurl;
                   unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
                       ($newurl,my $error) = 
                           &get_newmap_url($url,$folder,$prefixchg{$suffix},$coursedom,
                                           $coursenum,$srcdom{$suffix},$srcnum{$suffix},
                                           \$title,$allmaps,\%newurls);
                       if ($error) {
                           $allerrors{$suffix} = $error;
                           next;
                       }
                       if ($newurl ne '') {
                           if ($newurl ne $url) {
                               if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {
                                   $newsubdir{$url} = $1;
                               }
                               $mapchanges{$url} = 1;
                           }
                       }
                   }
                   if (($srcdom{$suffix} ne $coursedom) ||
                       ($srcnum{$suffix} ne $coursenum) ||
                       ($prefixchg{$suffix}) || (($newurl ne '') && ($newurl ne $url))) {
                       unless (&url_paste_fixups($url,$folder,$prefixchg{$suffix},
                                                 $coursedom,$coursenum,$srcdom{$suffix},
                                                 $srcnum{$suffix},$allmaps,\%rewrites,
                                                 \%retitles,\%copies,\%dbcopies,
                                                 \%zombies,\%params,\%mapmoves,
                                                 \%mapchanges,\%tomove,\%newsubdir,
                                                 \%newurls)) {
                           $mapmoves{$url} = 1;
                       }
                       $url = $newurl;
                   } elsif ($env{'docs.markedcopy_nested_'.$suffix}) {
                       &url_paste_fixups($url,$folder,$prefixchg{$suffix},$coursedom,
                                         $coursenum,$srcdom{$suffix},$srcnum{$suffix},
                                         $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,
                                         \%zombies,\%params,\%mapmoves,\%mapchanges,
                                         \%tomove,\%newsubdir,\%newurls); 
                   }
               } elsif ($url=~m {^/res/}) {
   # published map can only exists once, so remove from paste buffer when done
                   push(@toclear,$suffix);
   # if pasting published map (main content area only) check map not already in course
                   if ($folder =~ /^default/) {
                       if ((ref($allmaps) eq 'HASH') && ($allmaps->{$url})) {
                           $duplicate{$suffix} = 1; 
                           next;
                     }                      }
                 }                  }
             }              }
         }          }
     }          if ($url=~ m{/(bulletinboard|smppg)$}) {
 # Apply any changes to maps, or copy dependencies for uploaded HTML pages               my $prefix = $1;
     my ($result,$save_err);              #need to copy the db contents to a new one, unless this is a move.
     $result =              my %info = (
         &apply_fixups($folder,$is_map,$prefixchg,$coursedom,$coursenum,$oldurl,                           src  => $url,
                       $url,\%removefrommap,\%removeparam,\%rewrites,\%retitles,                           cdom => $coursedom,
                       \%copies,\%dbcopies,\%zombies,\%params,\%docmoves,                           cnum => $coursenum,
                       \%mapmoves,\%newsubdir,$errors,\%before,\%after);              );
     if ($result eq 'ok') {              unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
         if ($is_map) {                   my (%lockerr,$msg); 
             my ($errtext,$fatal) = &mapread($coursenum,$coursedom,                  my ($newurl,$result,$errtext) =
                                             $folder.'.'.$container);                      &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);
             return $errtext if ($fatal);                  if ($result eq 'ok') {
                       $url = $newurl;
             if ($#LONCAPA::map::order<1) {                      $title=&mt('Copy of').' '.$title;
                 my $idx=&LONCAPA::map::getresidx();                  } else {
                 if ($idx<=0) { $idx=1; }                      if ($prefix eq 'smppg') {
                 $LONCAPA::map::order[0]=$idx;                          $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;
                 $LONCAPA::map::resources[$idx]='';                      } elsif ($prefix eq 'bulletinboard') {
                           $msg = &mt('Paste failed: An error occurred when copying the discussion board.').' '.$errtext;
                       }
                       $results{$suffix} = $result;
                       $msgerrs{$suffix} = $msg;
                       $lockerrs{$suffix} = $lockerr{$prefix}; 
                       next;
           }
                   if ($lockerr{$prefix}) {
                       $lockerrs{$suffix} = $lockerr{$prefix};  
                   }
             }              }
             $newidx = &LONCAPA::map::getresidx($url);  
         }          }
         if ($env{'docs.markedcopy_supplemental'}) {          $title = &LONCAPA::map::qtunescape($title);
           my $ext='false';
           if ($url=~m{^http(|s)://}) { $ext='true'; }
           if ($env{'docs.markedcopy_supplemental_'.$suffix}) {
             if ($folder !~ /^supplemental/) {              if ($folder !~ /^supplemental/) {
                 (undef,undef,$title) =                  (undef,undef,$title) =
                     &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'});                      &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental_'.$suffix});
             }              }
         } else {          } else {
             if ($folder=~/^supplemental/) {              if ($folder=~/^supplemental/) {
Line 1046  sub do_paste_from_buffer { Line 1647  sub do_paste_from_buffer {
                        $env{'user.domain'}.'___&&&___'.$title;                         $env{'user.domain'}.'___&&&___'.$title;
             }              }
         }          }
         $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';  
         push(@LONCAPA::map::order, $newidx);  # For uploaded files (excluding pages/sequences) path in copied file is changed
   # if paste is from Main to Supplemental (or vice versa), or if pasting between
   # courses.
   
           unless ($is_map{$suffix}) {
               my $newidx;
   # Now insert the URL at the bottom
               $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url));
               if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
                   my $relpath = $1;
                   if ($relpath ne '') {
                       my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
                       my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
                       my $newprefix = $newloc;
                       if ($newloc eq 'default') {
                           $newprefix = 'docs';
                       }
                       if ($newdocsdir eq '') {
                           $newdocsdir = 'default';
                       }
                       if (($prefixchg{$suffix}) || 
                           ($srcdom{$suffix} ne $coursedom) || 
                           ($srcnum{$suffix} ne $coursenum) ||
                           ($env{'form.docs.markedcopy_options_'.$suffix} ne 'move')) {
                           my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
                           $url =
                               &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
                                                                  &Apache::lonnet::getfile($oldurl));
                           if ($url eq '/adm/notfound.html') {
                               $msgs{$suffix} = &mt('Paste failed: an error occurred saving the file.');
                               next;
                           } else {
                               my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
                               $newsubpath =~ s{/+$}{/};
                               $docmoves{$oldurl} = $newsubpath;
                           }
                       }
                   }
               }
               $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url).
                                                 ':'.$ext.':normal:res';
               push(@LONCAPA::map::order,$newidx);
   # Store the result
               my ($errtext,$fatal) =
                   &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
               if ($fatal) {
                   $save_err .= $errtext;
                   $allresult = 'fail';
               }
           }
   
   # Apply any changes to maps, or copy dependencies for uploaded HTML pages 
           unless ($allresult eq 'fail') {
               my %updated = (
                               rewrites      => \%rewrites,
                               zombies       => \%zombies,
                               removefrommap => \%removefrommap,
                               removeparam   => \%removeparam,
                               dbcopies      => \%dbcopies,
                               retitles      => \%retitles,
                             );
               my %info = (
                              newsubdir => \%newsubdir,
                              params    => \%params,
                          );
               if ($prefixchg{$suffix}) {
                   $info{'before'} = $before{$prefixchg{$suffix}};
                   $info{'after'} = $after{$prefixchg{$suffix}};
               }
               my %moves = (
                              copies   => \%copies,
                              docmoves => \%docmoves,
                              mapmoves => \%mapmoves,
                           );
               (my $result,$msgs{$suffix},my $lockerror) =
                   &apply_fixups($folder,$is_map{$suffix},$coursedom,$coursenum,$errors,
                                 \%updated,\%info,\%moves,$prefixchg{$suffix},$oldurl,
                                 $url,'paste');
               $lockerrors .= $lockerror;
               if ($result eq 'ok') {
                   if ($is_map{$suffix}) {
                       my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                                                       $folder.'.'.$container);
                       if ($fatal) {
                           $allresult = 'failread';
                       } else {
                           if ($#LONCAPA::map::order<1) {
                               my $idx=&LONCAPA::map::getresidx();
                               if ($idx<=0) { $idx=1; }
                               $LONCAPA::map::order[0]=$idx;
                               $LONCAPA::map::resources[$idx]='';
                           }
                           my $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url));
                           $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url).
                                                             ':'.$ext.':normal:res';
                           push(@LONCAPA::map::order,$newidx);
   
 # Store the result  # Store the result
         my ($errtext,$fatal) =                           my ($errtext,$fatal) = 
             &storemap($coursenum,$coursedom,$folder.'.'.$container,1);                              &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
         if ($fatal) {                          if ($fatal) {
             $save_err = $errtext;                              $save_err .= $errtext;
                               $allresult = 'failstore';
                           }
                       } 
                   }
                   if ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
                        push(@toclear,$suffix);
                   }
               }
         }          }
     }      }
          &clear_from_buffer(\@toclear,\@currpaste);
     if ($env{'form.docs.markedcopy_options'} eq 'move') {      my $msgsarray;
         &Apache::lonnet::delenv('docs.markedcopy');      foreach my $suffix (keys(%msgs)) {
         &Apache::lonnet::delenv('docs.markedcopy_nested');           if (ref($msgs{$suffix}) eq 'ARRAY') {
         &Apache::lonnet::delenv('docs.markedcopy_nestednames');               $msgsarray .= join(',',@{$msgs{$suffix}});
            }
     }      }
     return ($result,$save_err);      return ($allresult,$save_err,$msgsarray,$lockerrors);
   }
   
   sub do_buffer_empty {
       my @currpaste = split(/,/,$env{'docs.markedcopies'});
       if (@currpaste == 0) {
           return &mt('Clipboard is already empty');
       }
       my @toclear = &Apache::loncommon::get_env_multiple('form.pasting');
       if (@toclear == 0) {
           return &mt('Nothing selected to clear from clipboard');
       }
       my $numdel = &clear_from_buffer(\@toclear,\@currpaste);
       if ($numdel) {
           return &mt('[quant,_1,item] cleared from clipboard',$numdel);
       } else {
           return &mt('Clipboard unchanged');
       }
       return;
   }
   
   sub clear_from_buffer {
       my ($toclear,$currpaste) = @_;
       return unless ((ref($toclear) eq 'ARRAY') && (ref($currpaste) eq 'ARRAY'));
       my %pastebuffer;
       map { $pastebuffer{$_} = 1; } @{$currpaste};
       my $numdel = 0;
       foreach my $suffix (@{$toclear}) {
           next if ($suffix =~ /\D/);
           next unless (exists($pastebuffer{$suffix}));
           my $regexp = 'docs.markedcopy_[a-z]+_'.$suffix;
           if (&Apache::lonnet::delenv($regexp,1) eq 'ok') {
               delete($pastebuffer{$suffix});
               $numdel ++;
           }
       }
       my $newbuffer = join(',',sort(keys(%pastebuffer)));
       &Apache::lonnet::appenv({'docs.markedcopies' => $newbuffer});
       return $numdel;
 }  }
   
 sub get_newmap_url {  sub get_newmap_url {
Line 1126  sub get_newmap_url { Line 1869  sub get_newmap_url {
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($url,$coursedom,$coursenum) = @_;      my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;
     if ($url=~ m{/smppg$}) {      my ($url,$result,$errtext);
         my $db_name = &Apache::lonsimplepage::get_db_name($url);      $url = $dbref->{'src'};
         if ($db_name =~ /^smppage_/) {      if (ref($dbref) eq 'HASH') {
             #simple pages, need to copy the db contents to a new one.          if ($url =~ m{/(smppg|bulletinboard)$}) {
             my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);              my $prefix = $1;
             my $now = time();              if (($dbref->{'cdom'} =~ /^$match_domain$/) && 
             $db_name =~ s{_\d*$ }{_$now}x;                  ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
             my $result=&Apache::lonnet::put($db_name,\%contents,                  my $db_name;
                                             $coursedom,$coursenum);                  my $marker = (split(m{/},$url))[4];
             $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;                  $marker=~s/\D//g;
                   if ($dbref->{'src'} =~ m{/smppg$}) {
                       $db_name =
                           &Apache::lonsimplepage::get_db_name($url,$marker,
                                                               $dbref->{'cdom'},
                                                               $dbref->{'cnum'});
                   } else {
                       $db_name = 'bulletinpage_'.$marker;
                   }
                   my ($suffix,$freedlock,$error) =
                       &Apache::lonnet::get_timebased_id($prefix,'num','templated',
                                                         $coursedom,$coursenum,
                                                         'concat');
                   if (!$suffix) {
                       if ($prefix eq 'smppg') {
                           $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);
                       } else {
                           $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a discussion board [_1].',$url);
                       }
                       if ($error) {
                           $errtext .= '<br />'.$error;
                       }
                   } else {
                       #need to copy the db contents to a new one.
                       my %contents=&Apache::lonnet::dump($db_name,
                                                          $dbref->{'cdom'},
                                                          $dbref->{'cnum'});
                       if (exists($contents{'uploaded.photourl'})) {
                           my $photo = $contents{'uploaded.photourl'};
                           my ($subdir,$fname) =
                               ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$});
                           my $newphoto; 
                           if ($fname ne '') {
                               my $content = &Apache::lonnet::getfile($photo);
                               unless ($content eq '-1') {
                                   $env{'form.'.$suffix.'.photourl'} = $content;
                                   $newphoto = 
                                       &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname");
                                   delete($env{'form.'.$suffix.'.photourl'});
                               }
                           }
                           if ($newphoto =~ m{^/uploaded/}) {
                               $contents{'uploaded.photourl'} = $newphoto;
                           }
                       }
                       $db_name =~ s{_\d*$ }{_$suffix}x;
                       $result=&Apache::lonnet::put($db_name,\%contents,
                                                    $coursedom,$coursenum);
                       if ($result eq 'ok') {
                           $url =~ s{/(\d*)/(smppg|bulletinboard)$}{/$suffix/$2}x;
                       }
                   }
                   if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
                       $lockerrorsref->{$prefix} =
                           '<div class="LC_error">'.
                           &mt('There was a problem removing a lockfile.');
                       if ($prefix eq 'smppg') {
                           $lockerrorsref->{$prefix} .=
                               ' '.&mt('This will prevent creation of additional simple pages in this course.');
                       } else {
                           $lockerrorsref->{$prefix} .= ' '.&mt('This will prevent creation of additional discussion boards in this course.');
                       }
                       $lockerrorsref->{$prefix} .= ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.',
                                                        '<a href="/adm/helpdesk" target="_helpdesk">','</a>').
                                                    '</div>';
                   }
               }
           } elsif ($url =~ m{/syllabus$}) {
               if (($dbref->{'cdom'} =~ /^$match_domain$/) &&
                   ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
                   if (($dbref->{'cdom'} ne $coursedom) ||
                       ($dbref->{'cnum'} ne $coursenum)) {
                       my %contents=&Apache::lonnet::dump('syllabus',
                                                          $dbref->{'cdom'},
                                                          $dbref->{'cnum'});
                       $result=&Apache::lonnet::put('syllabus',\%contents,
                                                    $coursedom,$coursenum);
                   }
               }
         }          }
     }      }
     return $url;      return ($url,$result,$errtext);
 }  }
   
 sub uniqueness_check {  sub uniqueness_check {
Line 1180  sub contained_map_check { Line 2001  sub contained_map_check {
                         $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'};                          $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'};
                     } else {                      } else {
                         if ($allmaps->{$ressrc}) {                          if ($allmaps->{$ressrc}) {
                             $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                               $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') {                          } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') {
                             $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                              $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;
                         } else {                          } else {
Line 1204  sub contained_map_check { Line 2025  sub contained_map_check {
     return;      return;
 }  }
   
 sub reinit_role {  
     my ($cdom,$cnum,$chome) = @_;  
     my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");  
     unless ($ferr) {  
         &Apache::loncommon::update_content_constraints($cdom,$cnum,$chome,$cdom.'_'.$cnum);  
     }  
     return;  
 }  
   
 sub url_paste_fixups {  sub url_paste_fixups {
     my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies,      my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$fromcdom,$fromcnum,$allmaps,
         $dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_;          $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,
           $mapchanges,$tomove,$newsubdir,$newurls) = @_;
     my $checktitle;      my $checktitle;
     if (($prefixchg) &&      if (($prefixchg) &&
         ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {          ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {
Line 1242  sub url_paste_fixups { Line 2055  sub url_paste_fixups {
             my $title = $token->[2]->{'title'};              my $title = $token->[2]->{'title'};
             if ($checktitle) {              if ($checktitle) {
                 if ($title =~ m{\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {                  if ($title =~ m{\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                     $retitles->{$oldurl}{$ressrc} = $id;                      $retitles->{$oldurl}{$id} = $ressrc;
                 }                  }
             }              }
             next if ($token->[2]->{'type'} eq 'external');              next if ($token->[2]->{'type'} eq 'external');
             if ($token->[2]->{'type'} eq 'zombie') {              if ($token->[2]->{'type'} eq 'zombie') {
                 next if ($skip);                    next if ($skip);  
                 $zombies->{$oldurl}{$ressrc} = $id;                  $zombies->{$oldurl}{$id} = $ressrc;
                 $changed = 1;                  $changed = 1;
             } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
                 my $srcdom = $1;                  my $srcdom = $1;
Line 1260  sub url_paste_fixups { Line 2073  sub url_paste_fixups {
                     my $prefix = $1;                      my $prefix = $1;
                     $mapname = $prefix.$2;                      $mapname = $prefix.$2;
                     if ($tomove->{$mapname}) {                      if ($tomove->{$mapname}) {
                         &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,                          &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,
                                           $rewrites,$retitles,$copies,$dbcopies,$zombies,                                            $srcdom,$srcnum,$allmaps,$rewrites,
                                           $params,$mapmoves,$mapchanges,$tomove,$newsubdir,                                            $retitles,$copies,$dbcopies,$zombies,
                                           $newurls);                                            $params,$mapmoves,$mapchanges,$tomove,
                                             $newsubdir,$newurls);
                         next;                          next;
                     } else {                      } else {
                         ($newurl,my $error) =                          ($newurl,my $error) =
Line 1281  sub url_paste_fixups { Line 2095  sub url_paste_fixups {
                     ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) {                      ($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) {
                                         
                     if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {                      if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {
                         $rewrites->{$oldurl}{$ressrc} = $id;                          $rewrites->{$oldurl}{$id} = $ressrc;
                         $mapchanges->{$ressrc} = 1;                          $mapchanges->{$ressrc} = 1;
                         unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,                          unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,
                                                   $rewrites,$retitles,$copies,$dbcopies,$zombies,                                                    $cnum,$srcdom,$srcnum,$allmaps,
                                                   $params,$mapmoves,$mapchanges,$tomove,$newsubdir,                                                    $rewrites,$retitles,$copies,$dbcopies,
                                                   $newurls)) {                                                    $zombies,$params,$mapmoves,$mapchanges,
                                                     $tomove,$newsubdir,$newurls)) {
                             $mapmoves->{$ressrc} = 1;                              $mapmoves->{$ressrc} = 1;
                         }                          }
                         $changed = 1;                          $changed = 1;
                     } else {                      } else {
                         $rewrites->{$oldurl}{$ressrc} = $id;                          $rewrites->{$oldurl}{$id} = $ressrc;
                         $copies->{$oldurl}{$ressrc} = $id;                          $copies->{$oldurl}{$ressrc} = $id;
                         $changed = 1;                          $changed = 1;
                     }                      }
                 }                  }
             } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/.+$}) {
                 next if ($skip);                    next if ($skip);
                 my $srcdom = $1;                  my $srcdom = $1;
                 my $srcnum = $2;                  my $srcnum = $2;
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                  if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$ressrc} = $id;                      $rewrites->{$oldurl}{$id} = $ressrc;
                     $dbcopies->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                       $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;
                       $changed = 1;
                   }
               } elsif ($ressrc =~ m{^/adm/$match_domain/$match_username/\d+/(smppg|bulletinboard)$}) {
                   if (($fromcdom ne $cdom) || ($fromcnum ne $cnum) ||
                       ($env{'form.docs.markedcopy_options'} ne 'move')) {
                       $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                       $dbcopies->{$oldurl}{$id}{'cdom'} = $fromcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {
Line 1310  sub url_paste_fixups { Line 2135  sub url_paste_fixups {
                 my $srcdom = $1;                  my $srcdom = $1;
                 my $srcnum = $2;                  my $srcnum = $2;
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                  if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {
                     $rewrites->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;
                     $dbcopies->{$oldurl}{$ressrc} = $id;                      $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;
                       $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             }              }
Line 1331  sub url_paste_fixups { Line 2157  sub url_paste_fixups {
 }  }
   
 sub apply_fixups {  sub apply_fixups {
     my ($folder,$is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap,      my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg,
         $removeparam,$rewrites,$retitles,$copies,$dbcopies,$zombies,$params,          $oldurl,$url,$caller) = @_;
         $docmoves,$mapmoves,$newsubdir,$errors,$before,$after) = @_;      my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,
     foreach my $key (keys(%{$copies}),keys(%{$docmoves})) {          %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,
           %lockerrors,$lockmsg);
       if (ref($updated) eq 'HASH') {
           if (ref($updated->{'rewrites'}) eq 'HASH') {
               %rewrites = %{$updated->{'rewrites'}};
           }
           if (ref($updated->{'zombies'}) eq 'HASH') {
               %zombies = %{$updated->{'zombies'}};
           }
           if (ref($updated->{'removefrommap'}) eq 'HASH') {
               %removefrommap = %{$updated->{'removefrommap'}};
           }
           if (ref($updated->{'removeparam'}) eq 'HASH') {
               %removeparam = %{$updated->{'removeparam'}};
           }
           if (ref($updated->{'dbcopies'}) eq 'HASH') {
               %dbcopies = %{$updated->{'dbcopies'}};
           }
           if (ref($updated->{'retitles'}) eq 'HASH') {
               %retitles = %{$updated->{'retitles'}};
           }
       }
       if (ref($info) eq 'HASH') {
           if (ref($info->{'newsubdir'}) eq 'HASH') {
               %newsubdir = %{$info->{'newsubdir'}};
           }
           if (ref($info->{'params'}) eq 'HASH') {
               %params = %{$info->{'params'}};
           }
           if (ref($info->{'before'}) eq 'HASH') {
               %before = %{$info->{'before'}};
           }
           if (ref($info->{'after'}) eq 'HASH') {
               %after = %{$info->{'after'}};
           }
       }
       if (ref($moves) eq 'HASH') {
           if (ref($moves->{'copies'}) eq 'HASH') {
               %copies = %{$moves->{'copies'}};
           }
           if (ref($moves->{'docmoves'}) eq 'HASH') {
               %docmoves = %{$moves->{'docmoves'}};
           }
           if (ref($moves->{'mapmoves'}) eq 'HASH') {
               %mapmoves = %{$moves->{'mapmoves'}};
           }
       }
       foreach my $key (keys(%copies),keys(%docmoves)) {
         my @allcopies;          my @allcopies;
         if (ref($copies->{$key}) eq 'HASH') {          if (exists($copies{$key})) {
             my %added;              if (ref($copies{$key}) eq 'HASH') {
             foreach my $innerkey (keys(%{$copies->{$key}})) {                  my %added;
                 if (($innerkey ne '') && (!$added{$innerkey})) {                  foreach my $innerkey (keys(%{$copies{$key}})) {
                     push(@allcopies,$innerkey);                      if (($innerkey ne '') && (!$added{$innerkey})) {
                     $added{$innerkey} = 1;                          push(@allcopies,$innerkey);
                           $added{$innerkey} = 1;
                       }
                 }                  }
                   undef(%added);
             }              }
             undef(%added);  
         }          }
         if ($key eq $oldurl) {          if ($key eq $oldurl) {
             if ((exists($docmoves->{$key}))) {              if ((exists($docmoves{$key}))) {
                 unless (grep(/^\Q$oldurl\E/,@allcopies)) {                  unless (grep(/^\Q$oldurl\E$/,@allcopies)) {
                     push(@allcopies,$oldurl);                      push(@allcopies,$oldurl);
                 }                  }
             }              }
Line 1361  sub apply_fixups { Line 2236  sub apply_fixups {
                     my $content = &Apache::lonnet::getfile($item);                      my $content = &Apache::lonnet::getfile($item);
                     unless ($content eq '-1') {                      unless ($content eq '-1') {
                         my $storefn;                          my $storefn;
                         if (($key eq $oldurl) && (ref($docmoves) eq 'HASH') && (exists($docmoves->{$key}))) {                          if (($key eq $oldurl) && (exists($docmoves{$key}))) {
                             $storefn = $docmoves->{$key};                              $storefn = $docmoves{$key};
                         } else {                          } else {
                             $storefn = $relpath;                              $storefn = $relpath;
                             $storefn =~s{^/uploaded/$match_domain/$match_courseid/}{};                              $storefn =~s{^/uploaded/$match_domain/$match_courseid/}{};
                             if ($prefixchg) {                              if ($prefixchg && $before{'doc'} && $after{'doc'}) {
                                 $storefn =~ s/^\Q$before->{'doc'}\E/$after->{'doc'}/;                                  $storefn =~ s/^\Q$before{'doc'}\E/$after{'doc'}/;
                             }                              }
                             if ($newsubdir->{$key}) {                              if ($newsubdir{$key}) {
                                 $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir->{$key}#;                                  $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir{$key}/#;
                             }                              }
                         }                          }
                         &copy_dependencies($item,$storefn,$relpath,$errors,\$content);                          &copy_dependencies($item,$storefn,$relpath,$errors,\$content);
Line 1378  sub apply_fixups { Line 2253  sub apply_fixups {
                             &Apache::lonclonecourse::writefile($env{'request.course.id'},                              &Apache::lonclonecourse::writefile($env{'request.course.id'},
                                                                $storefn.$fname,$content);                                                                 $storefn.$fname,$content);
                         if ($copyurl eq '/adm/notfound.html') {                          if ($copyurl eq '/adm/notfound.html') {
                             if ((ref($docmoves) eq 'HASH') && (exists($docmoves->{$oldurl}))) {                              if (exists($docmoves{$oldurl})) {
                                 return &mt('Paste failed: an error occurred copying the file.');                                  return &mt('Paste failed: an error occurred copying the file.');
                             } elsif (ref($errors) eq 'HASH') {                              } elsif (ref($errors) eq 'HASH') {
                                 $errors->{$item} = 1;                                  $errors->{$item} = 1;
Line 1389  sub apply_fixups { Line 2264  sub apply_fixups {
             }              }
         }          }
     }      }
     foreach my $key (keys(%{$mapmoves})) {      foreach my $key (keys(%mapmoves)) {
         my $storefn=$key;          my $storefn=$key;
         $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};          $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
         if ($prefixchg) {          if ($prefixchg && $before{'map'} && $after{'map'}) {
             $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/;              $storefn =~ s/^\Q$before{'map'}\E/$after{'map'}/;
         }          }
         if ($newsubdir->{$key}) {          if ($newsubdir{$key}) {
             $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') {          if ($mapcontent eq '-1') {
Line 1416  sub apply_fixups { Line 2291  sub apply_fixups {
     }      }
     my %updates;      my %updates;
     if ($is_map) {      if ($is_map) {
         foreach my $key (keys(%{$rewrites})) {          if (ref($updated) eq 'HASH') {
             $updates{$key} = 1;              foreach my $type (keys(%{$updated})) {
         }                  if (ref($updated->{$type}) eq 'HASH') {
         foreach my $key (keys(%{$zombies})) {                      foreach my $key (keys(%{$updated->{$type}})) {
             $updates{$key} = 1;                          $updates{$key} = 1;
         }                      }
         foreach my $key (keys(%{$removefrommap})) {                  }
             $updates{$key} = 1;              }
         }  
         foreach my $key (keys(%{$removeparam})) {  
             $updates{$key} = 1;  
         }  
         foreach my $key (keys(%{$dbcopies})) {  
             $updates{$key} = 1;  
         }  
         foreach my $key (keys(%{$retitles})) {  
             $updates{$key} = 1;  
         }          }
         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') {
                 %torewrite = %{$rewrites->{$key}};                  %torewrite = %{$rewrites{$key}};
             }  
             if (ref($retitles->{$key}) eq 'HASH') {  
                 %toretitle = %{$retitles->{$key}};  
             }  
             if (ref($removefrommap->{$key}) eq 'HASH') {  
                 %toremove = %{$removefrommap->{$key}};  
             }              }
             if (ref($removeparam->{$key}) eq 'HASH') {              if (ref($retitles{$key}) eq 'HASH') {
                 %remparam = %{$removeparam->{$key}};                  %toretitle = %{$retitles{$key}};
             }              }
             if (ref($zombies->{$key}) eq 'HASH') {              if (ref($removefrommap{$key}) eq 'HASH') {
                 %zombie = %{$zombies->{$key}};                  %toremove = %{$removefrommap{$key}};
             }              }
             if (ref($dbcopies->{$key}) eq 'HASH') {              if (ref($removeparam{$key}) eq 'HASH') {
                 foreach my $item (keys(%{$dbcopies->{$key}})) {                  %remparam = %{$removeparam{$key}};
                     $newdb{$item} = &dbcopy($item);              }
               if (ref($zombies{$key}) eq 'HASH') {
                   %zombie = %{$zombies{$key}};
               }
               if (ref($dbcopies{$key}) eq 'HASH') {
                   foreach my $idx (keys(%{$dbcopies{$key}})) {
                       if (ref($dbcopies{$key}{$idx}) eq 'HASH') {
                           my ($newurl,$result,$errtext) =
                               &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors);
                           if ($result eq 'ok') {
                               $newdb{$idx} = $newurl;
                           } elsif (ref($errors) eq 'HASH') {
                               $errors->{$key} = 1;
                           }
                           push(@msgs,$errtext);
                       }
                 }                  }
             }              }
             if (ref($params->{$key}) eq 'HASH') {              if (ref($params{$key}) eq 'HASH') {
                 %currparam = %{$params->{$key}};                  %currparam = %{$params{$key}};
             }              }
             my ($errtext,$fatal) = &LONCAPA::map::mapread($key);              my ($errtext,$fatal) = &LONCAPA::map::mapread($key);
             if ($fatal) {              if ($fatal) {
                 return $errtext;                  return ($errtext);
             }              }
             for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {              for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {
                 if (defined($LONCAPA::map::zombies[$i])) {                  if (defined($LONCAPA::map::zombies[$i])) {
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]);                      my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]);
                     if ($zombie{$src} eq $i) {                      if ($zombie{$i} eq $src) {
                         undef($LONCAPA::map::zombies[$i]);                          undef($LONCAPA::map::zombies[$i]);
                     }                      }
                 }                  }
             }              }
             for (my $i=0; $i<@LONCAPA::map::resources; $i++) {              for (my $i=0; $i<@LONCAPA::map::order; $i++) {
                 if (defined($LONCAPA::map::resources[$i])) {                  my $idx = $LONCAPA::map::order[$i];
                   if (defined($LONCAPA::map::resources[$idx])) {
                     my $changed;                      my $changed;
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$i]);                      my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$idx]);
                     if ($toremove{$src} eq $i) {                      if ((exists($toremove{$idx})) && 
                           ($toremove{$idx} eq &LONCAPA::map::qtescape($src))) {
                         splice(@LONCAPA::map::order,$i,1);                          splice(@LONCAPA::map::order,$i,1);
                         if (ref($currparam{$i}) eq 'ARRAY') {                          if (ref($currparam{$idx}) eq 'ARRAY') {
                             foreach my $name (@{$currparam{$i}}) {                              foreach my $name (@{$currparam{$idx}}) {
                                 &LONCAPA::map::delparameter($i,'parameter_'.$name);                                  &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                             }                              }
                         }                          }
                         next;                          next;
                     }                      }
                     my $origsrc = $src;                      my $origsrc = $src;
                     if ((exists($toretitle{$src})) && ($toretitle{$src} eq $i)) {                      if ((exists($toretitle{$idx})) && ($toretitle{$idx} eq $src)) {
                         if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {                          if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                             $changed = 1;                              $changed = 1;
                         }                          }
                     }                      }
                     if ((exists($torewrite{$src})) && ($torewrite{$src} eq $i)) {                      if ((exists($torewrite{$idx})) && ($torewrite{$idx} eq $src)) {
                         $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};                          $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};
                         if ($origsrc =~ m{^/uploaded/}) {                          if ($origsrc =~ m{^/uploaded/}) {
                             if ($prefixchg) {                              if ($prefixchg && $before{'map'} && $after{'map'}) {
                                 if ($src =~ /\.(page|sequence)$/) {                                  if ($src =~ /\.(page|sequence)$/) {
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'map'}\E#$1$after->{'map'}#;                                      $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'map'}\E#$1$after{'map'}#;
                                 } else {                                  } else {
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'doc'}\E#$1$after->{'doc'}#;                                      $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'doc'}\E#$1$after{'doc'}#;
                                 }                                  }
                             }                              }
                             if ($newsubdir->{$origsrc}) {                              if ($origsrc =~ /\.(page|sequence)$/) {
                                 if ($src =~ /\.(page|sequence)$/) {                                  if ($newsubdir{$origsrc}) {
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir->{$origsrc}#;                                      $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir{$origsrc}#;
                                 } else {  
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir->{$origsrc}#;  
                                 }                                  }
                               } elsif ($newsubdir{$key}) {
                                   $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir{$key}#;
                             }                              }
                         }                          }
                         $changed = 1;                          $changed = 1;
                     } elsif ($newdb{$src} ne '') {                      } elsif ($newdb{$idx} ne '') {
                         $src = $newdb{$src};                          $src = $newdb{$idx};
                         $changed = 1;                          $changed = 1;
                     }                      }
                     if ($changed) {                      if ($changed) {
                         $LONCAPA::map::resources[$i] = join(':',($title,$src,$ext,$type));                          $LONCAPA::map::resources[$idx] = join(':',($title,&LONCAPA::map::qtunescape($src),$ext,$type));
                     }                      }
                 }                  }
             }              }
Line 1525  sub apply_fixups { Line 2402  sub apply_fixups {
                     }                      }
                 }                  }
             }              }
               if (values(%lockerrors) > 0) {
                   $lockmsg = join('<br />',values(%lockerrors));
               }
             my $storefn;              my $storefn;
             if ($key eq $oldurl) {              if ($key eq $oldurl) {
                 $storefn = $url;                  $storefn = $url;
Line 1532  sub apply_fixups { Line 2412  sub apply_fixups {
             } else {              } else {
                 $storefn = $key;                  $storefn = $key;
                 $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};                  $storefn=~s{^/uploaded/$match_domain/$match_courseid/}{};
                 if ($prefixchg) {                  if ($prefixchg && $before{'map'} && $after{'map'}) {
                     $storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/;                      $storefn =~ s/^\Q$before{'map'}\E/$after{'map'}/;
                 }                  }
                 if ($newsubdir->{$key}) {                  if ($newsubdir{$key}) {
                     $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/;                      $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;
                 }                  }
             }              }
             my $report;              my $report;
             if ($folder !~ /^supplemental/) {              if ($folder !~ /^supplemental/) {
                 $report = 1;                  $report = 1;
             }              }
             my ($outtext,$errtext) =              (my $outtext,$errtext) =
                 &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);                  &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);
             if ($errtext) {              if ($errtext) {
                 return &mt('Paste failed: an error occurred saving the folder or page.');                  if ($caller eq 'paste') {
                       return (&mt('Paste failed: an error occurred saving the folder or page.'));
                   }
             }              }
         }          }
     }      }
     return 'ok';      return ('ok',\@msgs,$lockmsg);
 }  }
   
 sub copy_dependencies {  sub copy_dependencies {
Line 1615  my %parameter_type = ( 'randompick' Line 2497  my %parameter_type = ( 'randompick'
 my $valid_parameters_re = join('|',keys(%parameter_type));  my $valid_parameters_re = join('|',keys(%parameter_type));
 # set parameters  # set parameters
 sub update_parameter {  sub update_parameter {
       if ($env{'form.changeparms'} eq 'all') {
     return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);          my (@allidx,@allmapidx,%allchecked,%currchecked);
           %allchecked = (
     my $which = $env{'form.changeparms'};                           'hiddenresource' => {},
     my $idx = $env{'form.setparms'};                           'encrypturl'     => {},
     if ($env{'form.'.$which.'_'.$idx}) {                           'randompick'     => {},
  my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx}                           'randomorder'    => {},
                                      : 'yes';                        );
  &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,          foreach my $which (keys(%allchecked)) {
       $parameter_type{$which});              $env{'form.all'.$which} =~ s/,$//;   
  &remember_parms($idx,$which,'set',$value);              if ($which eq 'randompick') {
                   foreach my $item (split(/,/,$env{'form.all'.$which})) {
                       my ($res,$value) = split(/:/,$item);
                       if ($value =~ /^\d+$/) {
                           $allchecked{$which}{$res} = $value;
                       }
                   }
               } else {
                   if ($env{'form.all'.$which}) {
                       map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.all'.$which});
                   }
               }
           }
           my $haschanges = 0;
           foreach my $res (@LONCAPA::map::order) {
               my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
               $name=&LONCAPA::map::qtescape($name);
               $url=&LONCAPA::map::qtescape($url);
               next unless ($name && $url);
               my $is_map;
               if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
                   $is_map = 1;
               }
               foreach my $which (keys(%allchecked)) {
                   if (($which eq 'randompick' || $which eq 'randomorder')) {
                       next if (!$is_map);
                   } 
                   my $oldvalue = 0;
                   my $newvalue = 0;
                   if ($allchecked{$which}{$res}) {
                       $newvalue = $allchecked{$which}{$res};
                   }
                   my $current = (&LONCAPA::map::getparameter($res,'parameter_'.$which))[0];
                   if ($which eq 'randompick') {
                       if ($current =~ /^(\d+)$/) {
                           $oldvalue = $1;
                       }
                   } else {
                       if ($current =~ /^yes$/i) {
                           $oldvalue = 1;
                       }
                   }
                   if ($oldvalue ne $newvalue) {
                       $haschanges = 1;
                       if ($newvalue) {
                           my $storeval = 'yes';
                           if ($which eq 'randompick') {
                               $storeval = $newvalue;
                           }
                           &LONCAPA::map::storeparameter($res,'parameter_'.$which,
                                                         $storeval,
                                                         $parameter_type{$which});
                           &remember_parms($res,$which,'set',$storeval);
                       } elsif ($oldvalue) {
                           &LONCAPA::map::delparameter($res,'parameter_'.$which);
                           &remember_parms($res,$which,'del');
                       }
                   }
               }
           }
           return $haschanges;
     } else {      } else {
  &LONCAPA::map::delparameter($idx,'parameter_'.$which);          return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
   
           my $which = $env{'form.changeparms'};
           my $idx = $env{'form.setparms'};
           if ($env{'form.'.$which.'_'.$idx}) {
       my $value = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx}
                                            : 'yes';
       &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
             $parameter_type{$which});
       &remember_parms($idx,$which,'set',$value);
           } else {
       &LONCAPA::map::delparameter($idx,'parameter_'.$which);
   
  &remember_parms($idx,$which,'del');      &remember_parms($idx,$which,'del');
           }
           return 1;
     }      }
     return 1;  
 }  }
   
   
 sub handle_edit_cmd {  sub handle_edit_cmd {
     my ($coursenum,$coursedom) =@_;      my ($coursenum,$coursedom) =@_;
       if ($env{'form.cmd'} eq '') {
           return 0;
       }
     my ($cmd,$idx)=split('_',$env{'form.cmd'});      my ($cmd,$idx)=split('_',$env{'form.cmd'});
   
     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];      my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
     my ($title, $url, @rrest) = split(':', $ratstr);      my ($title, $url, @rrest) = split(':', $ratstr);
   
     if ($cmd eq 'del') {      if ($cmd eq 'remove') {
  if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&   if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
     ($url!~/$LONCAPA::assess_page_seq_re/)) {      ($url!~/$LONCAPA::assess_page_seq_re/)) {
     &Apache::lonnet::removeuploadedurl($url);      &Apache::lonnet::removeuploadedurl($url);
Line 1664  sub handle_edit_cmd { Line 2621  sub handle_edit_cmd {
  @LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1];   @LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1];
   
     } elsif ($cmd eq 'rename') {      } elsif ($cmd eq 'rename') {
   
  my $comment = &LONCAPA::map::qtunescape($env{'form.title'});   my $comment = &LONCAPA::map::qtunescape($env{'form.title'});
  if ($comment=~/\S/) {   if ($comment=~/\S/) {
     $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=      $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
Line 1673  sub handle_edit_cmd { Line 2629  sub handle_edit_cmd {
 # Devalidate title cache  # Devalidate title cache
  my $renamed_url=&LONCAPA::map::qtescape($url);   my $renamed_url=&LONCAPA::map::qtescape($url);
  &Apache::lonnet::devalidate_title_cache($renamed_url);   &Apache::lonnet::devalidate_title_cache($renamed_url);
   
     } else {      } else {
  return 0;   return 0;
     }      }
Line 1694  sub editor { Line 2651  sub editor {
         $container = 'sequence';          $container = 'sequence';
     }      }
   
     my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";      my $jumpto;
   
       unless ($supplementalflag) {
           $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
       }
   
     unless ($allowed) {      unless ($allowed) {
         $randompick = -1;          $randompick = -1;
Line 1734  sub editor { Line 2695  sub editor {
   
  if ($env{'form.pastemarked'}) {   if ($env{'form.pastemarked'}) {
             my %paste_errors;              my %paste_errors;
             my ($paste_res,$save_error) =              my ($paste_res,$save_error,$pastemsgarray,$lockerror) =
                 &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,                  &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,
                                       \%paste_errors);                                        \%paste_errors);
                 if ($save_error ne '') {              if (ref($pastemsgarray) eq 'ARRAY') {
                     return $save_error;                   if (@{$pastemsgarray} > 0) {
                       $r->print('<p class="LC_info">'.
                                 join('<br />',@{$pastemsgarray}).
                                 '</p>');
                   }
               }
               if ($lockerror) {
                   $r->print('<p class="LC_error">'.
                             $lockerror.
                             '</p>');
               }
               if ($save_error ne '') {
                   return $save_error; 
               }
               if ($paste_res) {
                   my %errortext = &Apache::lonlocal::texthash (
                                       fail      => 'Storage of folder contents failed',
                                       failread  => 'Reading folder contents failed',
                                       failstore => 'Storage of folder contents failed',
                                   );
                   if ($errortext{$paste_res}) {
                       $r->print('<p class="LC_error">'.$errortext{$paste_res}.'</p>');
                 }                  }
             if ($paste_res ne 'ok') {  
                 $r->print('<p><span class="LC_error">'.$paste_res.'</span></p>');  
             }              }
             if (keys(%paste_errors) > 0) {              if (keys(%paste_errors) > 0) {
                 $r->print('<p span class="LC_warning">'."\n".                  $r->print('<p class="LC_warning">'."\n".
                           &mt('The following files are either dependencies of a web page or references within a folder and/or composite page which could not be copied during the paste operation:')."\n".                            &mt('The following files are either dependencies of a web page or references within a folder and/or composite page which could not be copied during the paste operation:')."\n".
                           '<ul>'."\n");                            '<ul>'."\n");
                 foreach my $key (sort(keys(%paste_errors))) {                  foreach my $key (sort(keys(%paste_errors))) {
Line 1752  sub editor { Line 2732  sub editor {
                 }                  }
                 $r->print('</ul></p>'."\n");                  $r->print('</ul></p>'."\n");
             }              }
  }   } elsif ($env{'form.clearmarked'}) {
               my $output = &do_buffer_empty();
               if ($output) {
                   $r->print('<p class="LC_info">'.$output.'</p>');
               }
           }
   
  $r->print($upload_output);   $r->print($upload_output);
   
   # Rename, cut, copy or remove a single resource
  if (&handle_edit_cmd()) {   if (&handle_edit_cmd()) {
             my $contentchg;              my $contentchg;
             if ($env{'form.cmd'} =~ /^(del|cut)_/) {              if ($env{'form.cmd'} =~ m{^(del|cut)_}) {
                 $contentchg = 1;                  $contentchg = 1;
             }              }
     ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg);      ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg);
     return $errtext if ($fatal);      return $errtext if ($fatal);
  }   }
   
   # Cut, copy and/or remove multiple resources
           if ($env{'form.multichange'}) {
               my %allchecked = (
                                  cut     => {},
                                  remove  => {},
                                );
               my $needsupdate;
               foreach my $which (keys(%allchecked)) {
                   $env{'form.multi'.$which} =~ s/,$//;
                   if ($env{'form.multi'.$which}) {
                       map { $allchecked{$which}{$_} = 1; } split(/,/,$env{'form.multi'.$which});
                       if (ref($allchecked{$which}) eq 'HASH') {
                           $needsupdate += scalar(keys(%{$allchecked{$which}}));
                       }
                   }
               }
               if ($needsupdate) {
                   my $haschanges = 0;
                   my %curr_groups = &Apache::longroup::coursegroups();
                   my $total = scalar(@LONCAPA::map::order) - 1; 
                   for (my $i=$total; $i>=0; $i--) {
                       my $res = $LONCAPA::map::order[$i];
                       my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
                       $name=&LONCAPA::map::qtescape($name);
                       $url=&LONCAPA::map::qtescape($url);
                       next unless ($name && $url);
                       my %denied =
                           &action_restrictions($coursenum,$coursedom,$url,
                                                $env{'form.folderpath'},\%curr_groups);
                       foreach my $which (keys(%allchecked)) {
                           next if ($denied{$which});
                           next unless ($allchecked{$which}{$res});
                           if ($which eq 'remove') {
                               if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
                                   ($url!~/$LONCAPA::assess_page_seq_re/)) {
                                   &Apache::lonnet::removeuploadedurl($url);
                               } else {
                                   &LONCAPA::map::makezombie($res);
                               }
                               splice(@LONCAPA::map::order,$i,1);
                               $haschanges ++;
                           } elsif ($which eq 'cut') {
                               &LONCAPA::map::makezombie($res);
                               splice(@LONCAPA::map::order,$i,1);
                               $haschanges ++;
                           }
                       }
                   }
                   if ($haschanges) {
                       ($errtext,$fatal) = 
                           &storemap($coursenum,$coursedom,$folder.'.'.$container,1);
                       return $errtext if ($fatal);
                   }
               }
           }
   
 # Group import/search  # Group import/search
  if ($env{'form.importdetail'}) {   if ($env{'form.importdetail'}) {
     my @imports;      my @imports;
     foreach my $item (split(/\&/,$env{'form.importdetail'})) {      foreach my $item (split(/\&/,$env{'form.importdetail'})) {
  if (defined($item)) {   if (defined($item)) {
     my ($name,$url,$residx)=      my ($name,$url,$residx)=
  map {&unescape($_)} split(/\=/,$item);   map { &unescape($_); } split(/\=/,$item);
                     if ($url=~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {                      if ($url =~ m{^\Q/uploaded/$coursedom/$coursenum/\E(default|supplemental)_new\.(sequence|page)$}) {
                         my ($suffix,$errortxt,$locknotfreed) =                           my ($suffix,$errortxt,$locknotfreed) =
                             &newmap_suffix($1,$2,$coursedom,$coursenum);                              &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2);
                         if ($locknotfreed) {                          if ($locknotfreed) {
                             $r->print($locknotfreed);                              $r->print($locknotfreed);
                         }                          }
Line 1782  sub editor { Line 2825  sub editor {
                         } else {                          } else {
                             return $errortxt;                              return $errortxt;
                         }                          }
                       } elsif ($url =~ m{^/adm/$match_domain/$match_username/new/(smppg|bulletinboard)$}) {
                           my $type = $1;
                           my ($suffix,$errortxt,$locknotfreed) =
                               &new_timebased_suffix($coursedom,$coursenum,$type);
                           if ($locknotfreed) {
                               $r->print($locknotfreed);
                           }
                           if ($suffix) {
                               $url =~ s{^(/adm/$match_domain/$match_username)/new}{$1/$suffix};
                           } else {
                               return $errortxt;
                           }
                       } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) {
                           if ($supplementalflag) {
                               next unless ($1 eq 'supplemental');
                               if ($folder eq 'supplemental') {
                                   next unless ($2 eq 'default');
                               } else {
                                   next unless ($folder eq 'supplemental_'.$2);
                               }
                           } else {
                               next unless ($1 eq 'docs');
                               if ($folder eq 'default') {
                                   next unless ($2 eq 'default');
                               } else {
                                   next unless ($folder eq 'default_'.$2);
                               }
                           }
                     }                      }
     push(@imports, [$name, $url, $residx]);      push(@imports, [$name, $url, $residx]);
  }   }
     }      }
     ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,              ($errtext,$fatal,my $fixuperrors) =
     $container,'londocs',@imports);                  &group_import($coursenum, $coursedom, $folder,$container,
                                 'londocs',@imports);
     return $errtext if ($fatal);      return $errtext if ($fatal);
               if ($fixuperrors) {
                   $r->print($fixuperrors);
               }
  }   }
 # Loading a complete map  # Loading a complete map
  if ($env{'form.loadmap'}) {   if ($env{'form.loadmap'}) {
Line 1844  sub editor { Line 2919  sub editor {
         $r->print('</div>');          $r->print('</div>');
     }      }
   
     my ($to_show,$output);      my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);
       %filters =  (
                     canremove      => [],
                     cancut         => [],
                     cancopy        => [],
                     hiddenresource => [],
                     encrypturl     => [],
                     randomorder    => [],
                     randompick     => [],
                   );
       %curr_groups = &Apache::longroup::coursegroups();
     &Apache::loncommon::start_data_table_count(); #setup a row counter       &Apache::loncommon::start_data_table_count(); #setup a row counter 
     foreach my $res (@LONCAPA::map::order) {      foreach my $res (@LONCAPA::map::order) {
         my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);          my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
Line 1853  sub editor { Line 2937  sub editor {
         $url=&LONCAPA::map::qtescape($url);          $url=&LONCAPA::map::qtescape($url);
         unless ($name) {  $name=(split(/\//,$url))[-1]; }          unless ($name) {  $name=(split(/\//,$url))[-1]; }
         unless ($name) { $idx++; next; }          unless ($name) { $idx++; next; }
           push(@allidx,$res);
           if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
               push(@allmapidx,$res);
           }
         $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);
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
     &Apache::loncommon::end_data_table_count();      &Apache::loncommon::end_data_table_count();
   
       my $need_save;
     if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {      if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {
         my $toolslink = '<table><tr><td>'          my $toolslink;
           if ($allowed || &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
               $toolslink = '<table><tr><td>'
                        .&Apache::loncommon::help_open_menu('Navigation Screen',                         .&Apache::loncommon::help_open_menu('Navigation Screen',
                                                            'Navigation_Screen',undef,'RAT')                                                             'Navigation_Screen',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" '                         .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '
                        .'id="LC_content_toolbar_edittoplevel" '                         .'id="LC_content_toolbar_edittoplevel" '
                        .'class="LC_toolbarItem" '                         .'class="LC_toolbarItem" '
                        .'title="'.&mt('Supplemental Content Editor').'">'                         .'title="'.&mt('Supplemental Content Editor').'">'
                        .'</a></li></ul></td></tr></table><br />';                         .'</a></li></ul></td></tr></table><br />';
           }
         if ($shown) {          if ($shown) {
             if ($allowed) {              if ($allowed) {
                 $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')                  $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
                           .&Apache::loncommon::start_data_table(undef,'contentlist')                            .&Apache::loncommon::start_data_table(undef,'contentlist')
                           .&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>'.&mt('Actions').'</th>'                            .'<th colspan="2">'.&mt('Actions').'</th>'
                           .'<th colspan="2">'.&mt('Document').'</th>';                            .'<th>'.&mt('Document').'</th>';
                 if ($folder !~ /^supplemental/) {                  if ($folder !~ /^supplemental/) {
                     $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';                      $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
                 }                  }
                 $to_show .= &Apache::loncommon::end_data_table_header_row()                  $to_show .= &Apache::loncommon::end_data_table_header_row();
                            .$output.' '                  if ($folder !~ /^supplemental/) {
                       $lists{'canhide'} = join(',',@allidx);
                       $lists{'canrandomlyorder'} = join(',',@allmapidx);
                       my @possfilters = ('canremove','cancut','cancopy','hiddenresource','encrypturl',
                                          'randomorder','randompick');
                       foreach my $item (@possfilters) {
                           if (ref($filters{$item}) eq 'ARRAY') {
                               if (@{$filters{$item}} > 0) {
                                   $lists{$item} = join(',',@{$filters{$item}});
                               }
                           }
                       }
                       if (@allidx > 0) {
                           my $path;
                           if ($env{'form.folderpath'}) {
                               $path = 
                                   &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
                           }
                           if (@allidx > 1) {
                               $to_show .= 
                                   &Apache::loncommon::continue_data_table_row().
                                   '<td colspan="2">&nbsp;</td>'.
                                   '<td>'.
                                   &multiple_check_form('actions',\%lists).
                                   '</td>'.
                                   '<td>&nbsp;</td>'.
                                   '<td>&nbsp;</td>'.
                                   '<td colspan="4">'.
                                   &multiple_check_form('settings',\%lists).
                                   '</td>'.
                                   &Apache::loncommon::end_data_table_row();
                                $need_save = 1;
                           }
                       }
                   }
                   $to_show .= $output.' '
                            .&Apache::loncommon::end_data_table()                             .&Apache::loncommon::end_data_table()
                            .'<br style="line-height:2px;" />'                             .'<br style="line-height:2px;" />'
                            .&Apache::loncommon::end_scrollbox();                             .&Apache::loncommon::end_scrollbox();
Line 1900  sub editor { Line 3028  sub editor {
             }              }
             $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')              $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
                        .'<div class="LC_info" id="contentlist">'                         .'<div class="LC_info" id="contentlist">'
                        .&mt('Currently no documents.')                         .&mt('Currently empty')
                        .'</div>'                         .'</div>'
                        .&Apache::loncommon::end_scrollbox();                         .&Apache::loncommon::end_scrollbox();
         }          }
Line 1913  sub editor { Line 3041  sub editor {
                       .'</div>';                        .'</div>';
         } else {          } else {
             $to_show = '<div class="LC_info" id="contentlist">'              $to_show = '<div class="LC_info" id="contentlist">'
                       .&mt('Currently no documents.')                        .&mt('Currently empty')
                       .'</div>'                        .'</div>'
         }          }
     }      }
Line 1923  sub editor { Line 3051  sub editor {
     }      }
     if ($allowed) {      if ($allowed) {
         my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";          my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
         $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto,          $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,
                                        $readfile));                                         $jumpto,$readfile,$need_save,"$folder.$container"));
         &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);          &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);
     } else {      } else {
         $r->print($to_show);          $r->print($to_show);
Line 1932  sub editor { Line 3060  sub editor {
     return;      return;
 }  }
   
   sub multiple_check_form {
       my ($caller,$listsref) = @_;
       return unless (ref($listsref) eq 'HASH');
       my $output =
       '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'.
       '<span class="LC_nobreak" style="font-size:x-small;font-weight:bold;">'.
       '<label><input type="radio" name="showmultpick" value="0" onclick="javascript:togglePick('."'$caller','0'".');" checked="checked" />'.&mt('one').'</label>'.('&nbsp;'x2).'<label><input type="radio" name="showmultpick" value="1" onclick="javascript:togglePick('."'$caller','1'".');" />'.&mt('multiple').'</label></span><span id="more'.$caller.'" class="LC_nobreak LC_docs_ext_edit"></span></form>'.
       '<div id="multi'.$caller.'" style="display:none;margin:0;padding:0;border:0">'.
       '<form action="/adm/coursedocs" method="post" name="cumulative'.$caller.'">'."\n".
       '<fieldset id="allfields'.$caller.'" style="display:none"><legend style="font-size:x-small;">'.&mt('check/uncheck all').'</legend>'."\n";
       if ($caller eq 'settings') {
           $output .= 
               '<table><tr>'.
               '<td class="LC_docs_entry_parameter">'.
               '<span class="LC_nobreak"><label>'.
               '<input type="checkbox" name="hiddenresourceall" id="hiddenresourceall" onclick="propagateState(this.form,'."'hiddenresource'".')" />'.&mt('Hidden').
               '</label></span></td>'.
               '<td class="LC_docs_entry_parameter">'.
               '<span class="LC_nobreak"><label><input type="checkbox" name="randompickall" id="randompickall" onclick="updatePick(this.form,'."'all','check'".');propagateState(this.form,'."'randompick'".');propagateState(this.form,'."'rpicknum'".');" />'.&mt('Randomly Pick').'</label><span id="rpicktextall"></span><input type="hidden" name="rpicknumall" id="rpicknumall" value="" />'.
               '</span></td>'.
               '</tr>'."\n".
               '<tr>'.
               '<td class="LC_docs_entry_parameter">'.
               '<span class="LC_nobreak"><label><input type="checkbox" name="encrypturlall" id="encrypturlall" onclick="propagateState(this.form,'."'encrypturl'".')" />'.&mt('URL hidden').'</label></span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><label><input type="checkbox" name="randomorderall" id="randomorderall" onclick="propagateState(this.form,'."'randomorder'".')" />'.&mt('Random Order').
               '</label></span>'.
               '</td></tr></table>'."\n";
       } else {
           $output .=
               '<table><tr>'.
               '<td class="LC_docs_entry_parameter">'.
               '<span class="LC_nobreak LC_docs_remove">'.
               '<label><input type="checkbox" name="removeall" id="removeall" onclick="propagateState(this.form,'."'remove'".')" />'.&mt('Remove').
               '</label></span></td>'.
               '<td class="LC_docs_entry_parameter">'.
               '<span class="LC_nobreak LC_docs_cut">'.
               '<label><input type="checkbox" name="cut" id="cutall" onclick="propagateState(this.form,'."'cut'".');" />'.&mt('Cut').
               '</label></span></td>'."\n".
               '<td class="LC_docs_entry_parameter">'.
               '<span class="LC_nobreak LC_docs_copy">'.
               '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')" />'.&mt('Copy').
               '</label></span></td>'.
               '</tr></table>'."\n";
       }
       $output .= 
           '</fieldset>'.
           '<input type="hidden" name="allidx" value="'.$listsref->{'canhide'}.'" />';
       if ($caller eq 'settings') {
           $output .= 
           '<input type="hidden" name="allmapidx" value="'.$listsref->{'canrandomlyorder'}.'" />'."\n".
           '<input type="hidden" name="currhiddenresource" value="'.$listsref->{'hiddenresource'}.'" />'."\n".
           '<input type="hidden" name="currencrypturl" value="'.$listsref->{'encrypturl'}.'" />'."\n".
           '<input type="hidden" name="currrandomorder" value="'.$listsref->{'randomorder'}.'" />'."\n".
           '<input type="hidden" name="currrandompick" value="'.$listsref->{'randompick'}.'" />'."\n";
       } elsif ($caller eq 'actions') {
           $output .=
           '<input type="hidden" name="allremoveidx" id="allremoveidx" value="'.$listsref->{'canremove'}.'" />'.
           '<input type="hidden" name="allcutidx" id="allcutidx" value="'.$listsref->{'cancut'}.'" />'.
           '<input type="hidden" name="allcopyidx" id="allcopyidx" value="'.$listsref->{'cancopy'}.'" />';
       }
       $output .= 
           '</form>'.
           '</div>';
       return $output;
   }
   
 sub process_file_upload {  sub process_file_upload {
     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;      my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd,$crstype) = @_;
 # upload a file, if present  # upload a file, if present
       my $filesize = length($env{'form.uploaddoc'});
       if (!$filesize) {
           $$upload_output = '<div class="LC_error">'.
                              &mt('Unable to upload [_1]. (size = [_2] bytes)',
                             '<span class="LC_filename">'.$env{'form.uploaddoc.filename'}.'</span>',
                             $filesize).'<br />'.
                             &mt('Either the file you attempted to upload was empty, or your web browser was unable to read its contents.').'<br />'.
                             '</div>';
           return;
       }
       my $quotatype = 'unofficial';
       if ($crstype eq 'Community') {
           $quotatype = 'community';    
       } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.instcode'}) {
           $quotatype = 'official';
       }
       if (&Apache::loncommon::get_user_quota($coursenum,$coursedom,'course',$quotatype)) {
           $filesize = int($filesize/1000); #expressed in kb
           $$upload_output = &Apache::loncommon::excess_filesize_warning($coursenum,$coursedom,'course',
                                                                         $env{'form.uploaddoc.filename'},$filesize,'upload');
           return if ($$upload_output);
       }
     my ($parseaction,$showupload,$nextphase,$mimetype);      my ($parseaction,$showupload,$nextphase,$mimetype);
     if ($env{'form.parserflag'}) {      if ($env{'form.parserflag'}) {
         $parseaction = 'parse';          $parseaction = 'parse';
Line 1951  sub process_file_upload { Line 3166  sub process_file_upload {
             $container='page';              $container='page';
         }          }
         ($errtext,$fatal)=          ($errtext,$fatal)=
               &mapread($coursenum,$coursedom,$folder.'.'.$container);              &mapread($coursenum,$coursedom,$folder.'.'.$container);
         if ($#LONCAPA::map::order<1) {          if ($#LONCAPA::map::order<1) {
             $LONCAPA::map::order[0]=1;              $LONCAPA::map::order[0]=1;
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
         if ($fatal) {  
             $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';  
             return;  
         }  
         my $destination = 'docs/';          my $destination = 'docs/';
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
             $destination = 'supplemental/';              $destination = 'supplemental/';
Line 1969  sub process_file_upload { Line 3180  sub process_file_upload {
         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {          } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
             $destination .=  $2.'/';              $destination .=  $2.'/';
         }          }
           if ($fatal) {
               $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';
               return;
           }
 # this is for a course, not a user, so set context to coursedoc.  # this is for a course, not a user, so set context to coursedoc.
         my $newidx=&LONCAPA::map::getresidx();          my $newidx=&LONCAPA::map::getresidx();
         $destination .= $newidx;          $destination .= $newidx;
Line 2091  sub is_supplemental_title { Line 3306  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)=@_;          $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups)=@_;
     my ($foldertitle,$renametitle);      my ($foldertitle,$renametitle);
     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);
Line 2107  sub entryline { Line 3322  sub entryline {
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/g;
     $renametitle=~s/ /%20/g;      $renametitle=~s/ /%20/g;
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end,$form_common);      my ($form_start,$form_end,$form_common,$form_param);
 # Edit commands  # Edit commands
     my ($type, $esc_path, $path, $symb);      my ($esc_path, $path, $symb);
     if ($container eq 'page') {  
         $type = 'page';  
     } else {  
         $type = 'folder';  
     }  
     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 2136  sub entryline { Line 3346  sub entryline {
                                                  &Apache::lonnet::declutter($currurl));                                                   &Apache::lonnet::declutter($currurl));
         }          }
     }      }
     my ($renamelink,%lt);      my ($renamelink,%lt,$ishash);
       if (ref($filtersref) eq 'HASH') {
           $ishash = 1;
       }
   
     if ($allowed) {      if ($allowed) {
           $form_start = '
      <form action="/adm/coursedocs" method="post">
   ';
           $form_common=(<<END);
      <input type="hidden" name="folderpath" value="$path" />
      <input type="hidden" name="symb" value="$symb" />
   END
           $form_param=(<<END);
      <input type="hidden" name="setparms" value="$orderidx" />
      <input type="hidden" name="changeparms" value="0" />
   END
           $form_end = '</form>';
   
  my $incindex=$index+1;   my $incindex=$index+1;
  my $selectbox='';   my $selectbox='';
  if (($#LONCAPA::map::order>0) &&   if (($#LONCAPA::map::order>0) &&
Line 2173  sub entryline { Line 3400  sub entryline {
                 'ul' => 'URL',                  'ul' => 'URL',
                 'ti' => 'Title',                   'ti' => 'Title', 
                 );                  );
  my $nocopy=0;   my %denied = &action_restrictions($coursenum,$coursedom,$url,
         my $nocut=0;                                            $env{'form.folderpath'},
         my $noremove=0;                                            $currgroups);
         if ($url=~ m{^/res/.+\.(page|sequence)$}) {  
     # no copy for published maps  
     $nocopy=1;  
  }  
         if ($url=~/^\/res\/lib\/templates\//) {  
            $nocopy=1;  
            $nocut=1;  
         }  
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
         if ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {  
             if ($env{'form.folderpath'} =~ /^default&[^\&]+$/) {  
                 my %curr_groups = &Apache::longroup::coursegroups();  
                 if (keys(%curr_groups) > 0) {  
                     $noremove=1;  
                 }  
                 $nocut=1;  
                 $nocopy=1;  
             }  
         } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) {  
             my $group = $1;  
             if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) {  
                 my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);  
                 if (keys(%curr_group) > 0) {  
                     $noremove=1;  
                 }  
             }  
             $nocut=1;  
             $nocopy=1;  
         } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) {  
             my $group = $1;  
             if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) {  
                 my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);  
                 my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});  
                 if (keys(%groupsettings) > 0) {  
                     $noremove=1;  
                 }  
                 $nocut=1;  
                 $nocopy=1;  
             }  
         } elsif ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) {  
             my $group = $1;  
             my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);  
             if ($url =~ /group_boards_\Q$group\E/) {  
                 my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);  
                 my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});  
                 if (keys(%groupsettings) > 0) {  
                     if (ref($groupsettings{'functions'}) eq 'HASH') {  
                         if ($groupsettings{'functions'}{'discussion'} eq 'on') {  
                             $noremove=1;  
                         }  
                     }  
                 }  
                 $nocut=1;  
                 $nocopy=1;  
             }  
         }  
         my ($copylink,$cutlink,$removelink);          my ($copylink,$cutlink,$removelink);
  my $skip_confirm = 0;   my $skip_confirm = 0;
  if ( $folder =~ /^supplemental/   if ( $folder =~ /^supplemental/
Line 2246  sub entryline { Line 3416  sub entryline {
     $skip_confirm = 1;      $skip_confirm = 1;
  }   }
   
  if ($nocopy) {   if ($denied{'copy'}) {
             $copylink=(<<ENDCOPY);              $copylink=(<<ENDCOPY)
 <span style="visibility: hidden;">$lt{'cp'}</span>  <span style="visibility: hidden;">$lt{'cp'}</span>
 ENDCOPY  ENDCOPY
         } else {          } else {
               my $formname = 'edit_copy_'.$orderidx;
               my $js = "javascript:checkForSubmit(document.forms.renameform,'copy','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');";
     $copylink=(<<ENDCOPY);      $copylink=(<<ENDCOPY);
 <a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$folder');" class="LC_docs_copy">$lt{'cp'}</a>  <form name="$formname" method="post" action="/adm/coursedocs">
   $form_common
   <input type="checkbox" name="copy" id="copy_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','copy');" class="LC_hidden" /><a href="$js" class="LC_docs_copy">$lt{'cp'}</a>
   $form_end
 ENDCOPY  ENDCOPY
               if (($ishash) && (ref($filtersref->{'cancopy'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'cancopy'}},$orderidx);
               }
         }          }
  if ($nocut) {   if ($denied{'cut'}) {
             $cutlink=(<<ENDCUT);              $cutlink=(<<ENDCUT);
 <span style="visibility: hidden;">$lt{'ct'}</span>  <span style="visibility: hidden;">$lt{'ct'}</span>
 ENDCUT  ENDCUT
         } else {          } else {
               my $formname = 'edit_cut_'.$orderidx;
               my $js = "javascript:checkForSubmit(document.forms.renameform,'cut','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');";
     $cutlink=(<<ENDCUT);      $cutlink=(<<ENDCUT);
 <a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a>  <form name="$formname" method="post" action="/adm/coursedocs">
   $form_common
   <input type="hidden" name="skip_$orderidx" id="skip_cut_$orderidx" value="$skip_confirm" />
   <input type="checkbox" name="cut" id="cut_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','cut');" class="LC_hidden" /><a href="$js" class="LC_docs_cut">$lt{'ct'}</a>
   $form_end
 ENDCUT  ENDCUT
               if (($ishash) && (ref($filtersref->{'cancut'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'cancut'}},$orderidx);
               }
         }          }
         if ($noremove) {          if ($denied{'remove'}) {
             $removelink=(<<ENDREM);              $removelink=(<<ENDREM);
 <span style="visibility: hidden;">$lt{'rm'}</a>  <span style="visibility: hidden;">$lt{'rm'}</a>
 ENDREM  ENDREM
         } else {          } else {
               my $formname = 'edit_remove_'.$orderidx;
               my $js = "javascript:checkForSubmit(document.forms.renameform,'remove','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm);";
             $removelink=(<<ENDREM);              $removelink=(<<ENDREM);
 <a href='javascript:removeres("$esc_path","$index","$renametitle",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>  <form name="$formname" method="post" action="/adm/coursedocs">
   $form_common
   <input type="hidden" name="skip_$orderidx" id="skip_remove_$orderidx" value="$skip_confirm" />
   <input type="checkbox" name="remove" id="remove_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','remove');" class="LC_hidden" /><a href="$js" class="LC_docs_remove">$lt{'rm'}</a>
   $form_end
 ENDREM  ENDREM
               if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'canremove'}},$orderidx);
               }
         }          }
         unless ($isexternal) {          $renamelink=(<<ENDREN);
             $renamelink=(<<ENDREN);  
 <a href='javascript:changename("$esc_path","$index","$renametitle");' class="LC_docs_rename">$lt{'rn'}</a>  <a href='javascript:changename("$esc_path","$index","$renametitle");' class="LC_docs_rename">$lt{'rn'}</a>
 ENDREN  ENDREN
         }  
  $form_start = '  
    <form action="/adm/coursedocs" method="post">  
 ';  
         $form_common=(<<END);  
    <input type="hidden" name="${type}path" value="$path" />  
    <input type="hidden" name="${type}symb" value="$symb" />  
    <input type="hidden" name="setparms" value="$orderidx" />  
    <input type="hidden" name="changeparms" value="0" />  
 END  
         $form_end = '</form>';  
  $line.=(<<END);   $line.=(<<END);
 <td>  <td>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb'>    <a href='/adm/coursedocs?cmd=up_$index&amp;folderpath=$esc_path&amp;symb=$symb'>
     <img src="${iconpath}move_up.gif" alt="$lt{'up'}" class="LC_icon" />      <img src="${iconpath}move_up.gif" alt="$lt{'up'}" class="LC_icon" />
   </a>    </a>
 </div>  </div>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}symb=$symb'>    <a href='/adm/coursedocs?cmd=down_$index&amp;folderpath=$esc_path&amp;symb=$symb'>
     <img src="${iconpath}move_down.gif" alt="$lt{'dw'}" class="LC_icon" />      <img src="${iconpath}move_down.gif" alt="$lt{'dw'}" class="LC_icon" />
   </a>    </a>
 </div>  </div>
 </td>  </td>
 <td>  <td>
    $form_start     $form_start
      $form_param
    $form_common     $form_common
    $selectbox     $selectbox
    $form_end     $form_end
 </td>  </td>
 <td class="LC_docs_entry_commands"><span class="LC_nobreak">  <td class="LC_docs_entry_commands LC_nobreak">
 $removelink  $removelink
 $cutlink  $cutlink
 $copylink  $copylink
 </span>  
 </td>  </td>
 END  END
   
     }      }
 # Figure out what kind of a resource this is  # Figure out what kind of a resource this is
     my ($extension)=($url=~/\.(\w+)$/);      my ($extension)=($url=~/\.(\w+)$/);
Line 2399  END Line 3582  END
             my $rpckchk;              my $rpckchk;
             if ($rpicknum) {              if ($rpicknum) {
                 $rpckchk = ' checked="checked"';                  $rpckchk = ' checked="checked"';
                   if (($ishash) && (ref($filtersref->{'randompick'}) eq 'ARRAY')) {
                       push(@{$filtersref->{'randompick'}},$orderidx.':'.$rpicknum);
                   }
             }              }
             my $formname = 'edit_rpick_'.$orderidx;              my $formname = 'edit_randompick_'.$orderidx;
     $rand_pick_text =       $rand_pick_text = 
 '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".  '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
   $form_param."\n".
 $form_common."\n".  $form_common."\n".
 '<span class="LC_nobreak"><label><input type="checkbox" name="randpickon_'.$orderidx.'" id="rpick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="randompick_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" />';  '<span class="LC_nobreak"><label><input type="checkbox" name="randompick_'.$orderidx.'" id="randompick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="rpicknum_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" /><span id="randompicknum_'.$orderidx.'">';
             if ($rpicknum ne '') {              if ($rpicknum ne '') {
                 $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';                  $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';
             }              }
             $rand_pick_text .= '</span></form>';              $rand_pick_text .= '</span></span>'.
        my $ro_set=                                 $form_end;
         ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');              my $ro_set;
               if ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i) {
                   $ro_set = 'checked="checked"';
                   if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
                       push(@{$filtersref->{'randomorder'}},$orderidx);
                   }
               }
               $formname = 'edit_rorder_'.$orderidx;
     $rand_order_text =       $rand_order_text = 
 $form_start.  '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
 $form_common.'  $form_param."\n".
 <span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" onclick="'."this.form.changeparms.value='randomorder';this.form.submit()".'" '.$ro_set.' /> '.&mt('Random Order').' </label></span></form>';  $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.' /> '.&mt('Random Order').' </label></span>'.
   $form_end; 
         }          }
     } elsif ($supplementalflag && !$allowed) {      } elsif ($supplementalflag && !$allowed) {
         $url .= ($url =~ /\?/) ? '&amp;':'?';          $url .= ($url =~ /\?/) ? '&amp;':'?';
Line 2484  $form_common.' Line 3680  $form_common.'
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
        'ec' => 'URL hidden');         'ec' => 'URL hidden');
  my $enctext=          my ($enctext,$hidtext);
     ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');          if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {
  my $hidtext=              $enctext = ' checked="checked"';
     ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');              if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'encrypturl'}},$orderidx);
               }
           }
           if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
               $hidtext = ' checked="checked"';
               if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'hiddenresource'}},$orderidx);
               }
           }
           my $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_start      <form action="/adm/coursedocs" method="post" name="$formhidden">
       $form_param
     $form_common      $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>      <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext /> $lt{'hd'}</label>
     $form_end      $form_end
     <br />      <br />
     $form_start      <form action="/adm/coursedocs" method="post" name="$formurlhidden">
       $form_param
     $form_common      $form_common
     <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label>      <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'encrypturl','settings');" $enctext /> $lt{'ec'}</label>
     $form_end      $form_end
   </td>    </td>
   <td class="LC_docs_entry_parameter">$rand_pick_text<br />    <td class="LC_docs_entry_parameter">$rand_pick_text<br />
Line 2508  ENDPARMS Line 3717  ENDPARMS
     return $line;      return $line;
 }  }
   
 sub newmap_suffix {  sub action_restrictions {
     my ($area,$container,$coursedom,$coursenum) = @_;      my ($cnum,$cdom,$url,$folderpath,$currgroups) = @_;
     my ($prefix,$idtype,$errtext,$locknotfreed);      my %denied = (
     $prefix = 'docs';                     cut    => 0,
     if ($area eq 'supplemental') {                     copy   => 0,
         $prefix = 'supp';                     remove => 0,
                    );
       if ($url=~ m{^/res/.+\.(page|sequence)$}) {
           # no copy for published maps
           $denied{'copy'} = 1;
       } elsif ($url=~m{^/res/lib/templates/}) {
          $denied{'copy'} = 1;
          $denied{'cut'} = 1;
       } elsif ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {
           if ($folderpath =~ /^default&[^\&]+$/) {
               if ((ref($currgroups) eq 'HASH') && (keys(%{$currgroups}) > 0)) {
                   $denied{'remove'} = 1;
               }
               $denied{'cut'} = 1;
               $denied{'copy'} = 1;
           }
       } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) {
           my $group = $1;
           if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) {
               if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) {
                   $denied{'remove'} = 1;
               }
           }
           $denied{'cut'} = 1;
           $denied{'copy'} = 1;
       } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) {
           my $group = $1;
           if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) {
               if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) {
                   my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group});
                   if (keys(%groupsettings) > 0) {
                       $denied{'remove'} = 1;
                   }
                   $denied{'cut'} = 1;
                   $denied{'copy'} = 1;
               }
           }
       } elsif ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) {
           my $group = $1;
           if ($url =~ /group_boards_\Q$group\E/) {
               if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) {
                   my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group});
                   if (keys(%groupsettings) > 0) {
                       if (ref($groupsettings{'functions'}) eq 'HASH') {
                           if ($groupsettings{'functions'}{'discussion'} eq 'on') {
                               $denied{'remove'} = 1;
                           }
                       }
                   }
                   $denied{'cut'} = 1;
                   $denied{'copy'} = 1;
               }
           }
       }
       return %denied;
   }
   
   sub new_timebased_suffix {
       my ($dom,$num,$type,$area,$container) = @_;
       my ($prefix,$namespace,$idtype,$errtext,$locknotfreed);
       if ($type eq 'paste') {
           $prefix = $type;
           $namespace = 'courseeditor';
       } elsif ($type eq 'map') {
           $prefix = 'docs';
           if ($area eq 'supplemental') {
               $prefix = 'supp';
           }
           $prefix .= $container;
           $namespace = 'uploadedmaps';
       } else {
           $prefix = $type;
           $namespace = 'templated';
     }      }
     $prefix .= $container;  
     $idtype = 'concat';      $idtype = 'concat';
     my ($suffix,$freedlock,$error) =      my ($suffix,$freedlock,$error) =
         &Apache::lonnet::get_timebased_id($prefix,'num','uploadedmaps',          &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num);
                                           $coursedom,$coursenum);  
     if (!$suffix) {      if (!$suffix) {
         $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');          if ($type eq 'paste') {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.');
           } elsif ($type eq 'map') {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');
           } elsif ($type eq 'smppg') {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');
           } else {
               $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new discussion board.');
           }
         if ($error) {          if ($error) {
             $errtext .= '<br />'.$error;              $errtext .= '<br />'.$error;
         }          }
     }      }
     if ($freedlock ne 'ok') {      if ($freedlock ne 'ok') {
         $locknotfreed = '<div class="LC_error">'.&mt('There was a problem removing a lockfile. This will prevent creation of additional folders or composite pages in this course.  Please contact the domain coordinator for your LON-CAPA domain.').'</div>';          $locknotfreed = 
               '<div class="LC_error">'.
               &mt('There was a problem removing a lockfile.').' ';
           if ($type eq 'paste') {
               &mt('This will prevent use of the paste buffer until th next log-in.');
           } elsif ($type eq 'map') {
               &mt('This will prevent creation of additional folders or composite pages in this course.');
           } elsif ($type eq 'smppg') {
               $locknotfreed .=
                   &mt('This will prevent creation of additional simple pages in this course.');
           } else {
               $locknotfreed .=
                   &mt('This will prevent creation of additional discussion boards in this course.');
           }
           unless ($type eq 'paste') {
               $locknotfreed .=
                   ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.',
                           '<a href="/adm/helpdesk" target="_helpdesk">','</a>');
           }
           $locknotfreed .= '</div>';
     }      }
     return ($suffix,$errtext,$locknotfreed);      return ($suffix,$errtext,$locknotfreed);
 }  }
Line 2690  sub list_symbs { Line 3996  sub list_symbs {
 sub verifycontent {  sub verifycontent {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));      $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>');       $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); 
    $hashtied=0;     $hashtied=0;
Line 2727  sub devalidateversioncache { Line 4033  sub devalidateversioncache {
 sub checkversions {  sub checkversions {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));      $r->print(&Apache::loncommon::start_page("Check $crstype Resource Versions"));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));      $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Resource Versions"));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
   
     my $header='';      my $header='';
Line 2793  sub checkversions { Line 4099  sub checkversions {
     &changewarning($r,'');      &changewarning($r,'');
     if ($env{'form.timerange'} eq 'all') {      if ($env{'form.timerange'} eq 'all') {
 # show all documents  # show all documents
  $header=&mt('All Documents in '.$crstype);   $header=&mt('All content in '.$crstype);
  $allsel=' selected="selected"';   $allsel=' selected="selected"';
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^ids\_(\/res\/.+)$/) {      if ($key=~/^ids\_(\/res\/.+)$/) {
Line 2884  $lt{'sc'}: <input type="submit" name="se Line 4190  $lt{'sc'}: <input type="submit" name="se
 <br clear="all" />  <br clear="all" />
 <hr />  <hr />
 <h4>$lt{'vers'}</h4>  <h4>$lt{'vers'}</h4>
 <input type="submit" name="setversions" value="$lt{'save'}" />  
 ENDHEADERS  ENDHEADERS
     #number of columns for version history      #number of columns for version history
       my %changedbytime;
       foreach my $key (keys(%changes)) {
           #excludes not versionable problems from resource version history:
           next if ($key =~ /^\/res\/lib\/templates/);
           my $chg;
           if ($env{'form.timerange'} eq 'all') {
               my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
               $chg = &Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate');
           } else {
               $chg = $changes{$key};
               next if ($chg < $starttime);
           }
           push(@{$changedbytime{$chg}},$key);
       }
       if (keys(%changedbytime) == 0) {
           &untiehash();
           $r->print(&mt('No content changes in imported content in specified time frame').
                     &endContentScreen());
           return;
       }
     $r->print(      $r->print(
          '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'.
         &Apache::loncommon::start_data_table().          &Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row().          &Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Resources').'</th>'.          '<th>'.&mt('Resources').'</th>'.
Line 2897  ENDHEADERS Line 4223  ENDHEADERS
         '<th>'.&mt('History').'</th>'.          '<th>'.&mt('History').'</th>'.
         &Apache::loncommon::end_data_table_header_row()          &Apache::loncommon::end_data_table_header_row()
     );      );
     foreach my $key (sort(keys(%changes))) {      foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) {
         #excludes not versionable problems from resource version history:          foreach my $key (sort(@{$changedbytime{$chg}})) {
         next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/);              my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
         my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);              my $currentversion=&Apache::lonnet::getversion($key);
         my $currentversion=&Apache::lonnet::getversion($key);              if ($currentversion<0) {
         if ($currentversion<0) {                  $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';
             $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';              }
         }              my $linkurl=&Apache::lonnet::clutter($key);
         my $linkurl=&Apache::lonnet::clutter($key);              $r->print(
         $r->print(                  &Apache::loncommon::start_data_table_row().
             &Apache::loncommon::start_data_table_row().                  '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.
             '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.                  '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.
             '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.                  '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.
             '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.                  &Apache::lonlocal::locallocaltime($chg).')</span></td>'.
             &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'.                  '<td align="right">'
             '<td align="right">'              );
         );              # Used in course
         # Used in course              my $usedversion=$hash{'version_'.$linkurl};
         my $usedversion=$hash{'version_'.$linkurl};              if (($usedversion) && ($usedversion ne 'mostrecent')) {
         if (($usedversion) && ($usedversion ne 'mostrecent')) {  
                 if ($usedversion != $currentversion) {                  if ($usedversion != $currentversion) {
                     $r->print('<span class="LC_warning">'.$usedversion.'</span>');                      $r->print('<span class="LC_warning">'.$usedversion.'</span>');
                 } else {                  } else {
Line 2925  ENDHEADERS Line 4250  ENDHEADERS
             } else {              } else {
                 $r->print($currentversion);                  $r->print($currentversion);
             }              }
         $r->print('</td><td title="'.$lt{'vu'}.'">');              $r->print('</td><td title="'.$lt{'vu'}.'">');
         # Set version              # Set version
         $r->print(&Apache::loncommon::select_form(              $r->print(&Apache::loncommon::select_form(
             $setversions{$linkurl},                        $setversions{$linkurl},
             'set_version_'.$linkurl,                        'set_version_'.$linkurl,
             {'select_form_order' => ['',1..$currentversion,'mostrecent'],                        {'select_form_order' => ['',1..$currentversion,'mostrecent'],
              '' => '',                        '' => '',
              'mostrecent' => &mt('most recent'),                        'mostrecent' => &mt('most recent'),
              map {$_,$_} (1..$currentversion)}));                        map {$_,$_} (1..$currentversion)}));
         my $lastold=1;              my $lastold=1;
         for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {              for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
             my $url=$root.'.'.$prevvers.'.'.$extension;                  my $url=$root.'.'.$prevvers.'.'.$extension;
             if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {                  if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {
                 $lastold=$prevvers;                      $lastold=$prevvers;
             }                  }
         }              }
         $r->print('</td>');              $r->print('</td>');
         # List all available versions              # List all available versions
         $r->print('<td valign="top"><span class="LC_fontsize_medium">');              $r->print('<td valign="top"><span class="LC_fontsize_medium">');
         for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {              for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
             my $url=$root.'.'.$prevvers.'.'.$extension;                  my $url=$root.'.'.$prevvers.'.'.$extension;
             $r->print(  
                 '<span class="LC_nobreak">'  
                .'<a href="'.&Apache::lonnet::clutter($url).'">'  
                .&mt('Version [_1]',$prevvers).'</a>'  
                .' ('.&Apache::lonlocal::locallocaltime(  
                          &Apache::lonnet::metadata($url,'lastrevisiondate'))  
                .')');  
             if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {  
                 $r->print(                  $r->print(
                     ' <a href="/adm/diff?filename='.                      '<span class="LC_nobreak">'
                     &Apache::lonnet::clutter($root.'.'.$extension).                     .'<a href="'.&Apache::lonnet::clutter($url).'">'
                     &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').                     .&mt('Version [_1]',$prevvers).'</a>'
                     '" target="diffs">'.&mt('Diffs').'</a>');                     .' ('.&Apache::lonlocal::locallocaltime(
                            &Apache::lonnet::metadata($url,'lastrevisiondate'))
                      .')');
                   if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
                       $r->print(
                           ' <a href="/adm/diff?filename='.
                           &Apache::lonnet::clutter($root.'.'.$extension).
                           &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').
                           '" target="diffs">'.&mt('Diffs').'</a>');
                   }
                   $r->print('</span><br />');
             }              }
             $r->print('</span><br />');              $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());
         }          }
         $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());  
     }      }
     $r->print(      $r->print(
         &Apache::loncommon::end_data_table().          &Apache::loncommon::end_data_table().
Line 2972  ENDHEADERS Line 4298  ENDHEADERS
   
     &untiehash();      &untiehash();
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
       return;
 }  }
   
 sub mark_hash_old {  sub mark_hash_old {
Line 3026  $help{'Caching'}.'</p></form>'."\n\n"); Line 4353  $help{'Caching'}.'</p></form>'."\n\n");
   
   
 sub init_breadcrumbs {  sub init_breadcrumbs {
     my ($form,$text)=@_;      my ($form,$text,$help)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",
     text=>&Apache::loncommon::course_type().' Editor',      text=>&Apache::loncommon::course_type().' Editor',
     faq=>273,      faq=>273,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
                                             help => 'Docs_Adding_Course_Doc'});                                              help => $help});
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
     text=>$text,      text=>$text,
     faq=>273,      faq=>273,
Line 3068  sub startContentScreen { Line 4395  sub startContentScreen {
     if (($mode eq 'navmaps') || ($mode eq 'supplemental')) {      if (($mode eq 'navmaps') || ($mode eq 'supplemental')) {
         $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Overview').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Overview').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Search').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Search').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
           $output .= '<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Index').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';
     } else {      } else {
         $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Main Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
                    '><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';                     '><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';
Line 3091  sub endContentScreen { Line 4419  sub endContentScreen {
 }  }
   
 sub supplemental_base {  sub supplemental_base {
     return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content'));      return 'supplemental&'.&escape(&mt('Supplemental Content'));
 }  }
   
 sub handler {  sub handler {
Line 3115  sub handler { Line 4443  sub handler {
                'Adding_Folders','Docs_Overview', 'Load_Map',                 'Adding_Folders','Docs_Overview', 'Load_Map',
                'Supplemental','Score_Upload_Form','Adding_Pages',                 'Supplemental','Score_Upload_Form','Adding_Pages',
                'Importing_LON-CAPA_Resource','Importing_IMS_Course',                 'Importing_LON-CAPA_Resource','Importing_IMS_Course',
                        'Uploading_From_Harddrive',                         'Uploading_From_Harddrive','Course_Roster','Web_Page',
                'Check_Resource_Versions','Verify_Content') {                         'Dropbox','Simple_Problem') {
  $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 3124  sub handler { Line 4452  sub handler {
     'Docs_About_Syllabus,Docs_Editing_Templated_Pages');      'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
     $help{'Simple Page'} = &Apache::loncommon::help_open_topic(      $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
     'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');      'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
     $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(  
     'Option_Response_Simple');  
     $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(      $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
     'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');      'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
     $help{'My Personal Information Page'} = &Apache::loncommon::help_open_topic(      $help{'My Personal Information Page'} = &Apache::loncommon::help_open_topic(
   'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');    'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
     $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');      $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
    
       
     my $allowed;      my $allowed;
 # 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') {
Line 3147  sub handler { Line 4472  sub handler {
       &choose_dump_server($r);        &choose_dump_server($r);
       return OK;        return OK;
   } elsif ($allowed && $env{'form.verify'}) {    } elsif ($allowed && $env{'form.verify'}) {
       &init_breadcrumbs('verify','Verify Content');        &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content');
       &verifycontent($r);        &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {    } elsif ($allowed && $env{'form.listsymbs'}) {
       &init_breadcrumbs('listsymbs','List Content IDs');        &init_breadcrumbs('listsymbs','List Content IDs');
Line 3160  sub handler { Line 4485  sub handler {
       }        }
       &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);        &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);
   } elsif ($allowed && $env{'form.versions'}) {    } elsif ($allowed && $env{'form.versions'}) {
       &init_breadcrumbs('versions','Check/Set Resource Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');
       &checkversions($r);        &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
Line 3189  sub handler { Line 4514  sub handler {
 # supplementalflag=0: show standard documents  # supplementalflag=0: show standard documents
 # toolsflag=1: show utilities  # toolsflag=1: show utilities
   
       my $unesc_folderpath = &unescape($env{'form.folderpath'});
     my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);      my $supplementalflag=($unesc_folderpath=~/^supplemental/);
     if (($env{'form.folderpath'}=~/^default/) || ($env{'form.folderpath'} eq "")) {      if (($unesc_folderpath=~/^default/) || ($unesc_folderpath eq "")) {
        $supplementalflag=0;         $supplementalflag=0;
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
Line 3210  sub handler { Line 4535  sub handler {
   
 # Do we directly jump somewhere?  # Do we directly jump somewhere?
   
    if ($env{'form.command'} eq 'direct') {     if (($env{'form.command'} eq 'direct') || ($env{'form.command'} eq 'directnav')) {
        my ($mapurl,$id,$resurl);  
        if ($env{'form.symb'} ne '') {         if ($env{'form.symb'} ne '') {
            $env{'form.folderpath'}=             $env{'form.folderpath'}=
                &Apache::loncommon::symb_to_docspath($env{'form.symb'});                 &Apache::loncommon::symb_to_docspath($env{'form.symb'});
              &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                  $env{'form.command'}.'_'.$env{'form.symb'}});
        } elsif ($env{'form.supppath'} ne '') {         } elsif ($env{'form.supppath'} ne '') {
            $env{'form.folderpath'}=$env{'form.supppath'};             $env{'form.folderpath'}=$env{'form.supppath'};
              &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                  $env{'form.command'}.'_'.$env{'form.supppath'}});
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
         $env{'form.folderpath'} = 'default&'.         $env{'form.folderpath'} = 'default&'.
                                   &Apache::lonhtmlcommon::entity_encode('Main Course Content').                                   &escape(&mt('Main Content').':::::');
                                   ':::::';         &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}});
    } elsif ($env{'form.command'} eq 'editsupp') {     } elsif ($env{'form.command'} eq 'editsupp') {
         $env{'form.folderpath'} = 'default&'.         $env{'form.folderpath'} = 'supplemental&'.
                                   &Apache::lonhtmlcommon::entity_encode('Supplemental Content');                                    &escape('Supplemental Content');
          &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'});
      } elsif ($env{'form.command'} eq 'contents') {
          &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'});
      } elsif ($env{'form.command'} eq 'home') {
          &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/menu'});
    }     }
   
   
 # Where do we store these for when we come back?  # Where do we store these for when we come back?
     my $stored_folderpath='docs_folderpath';      my $stored_folderpath='docs_folderpath';
     if ($supplementalflag) {      if ($supplementalflag) {
Line 3259  sub handler { Line 4593  sub handler {
        if ($supplementalflag) {         if ($supplementalflag) {
           $env{'form.folderpath'}=&supplemental_base();            $env{'form.folderpath'}=&supplemental_base();
        } else {         } else {
           $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Documents')).            $env{'form.folderpath'}='default&'.&escape(&mt('Main Content').
                                   ':::::';                                    ':::::');
        }         }
     }      }
   
Line 3285  sub handler { Line 4619  sub handler {
             if ($env{'form.folder'} eq '' ||              if ($env{'form.folder'} eq '' ||
                 $env{'form.folder'} eq 'supplemental') {                  $env{'form.folder'} eq 'supplemental') {
                 $folderpath='default&'.                  $folderpath='default&'.
                             &escape(&mt('Main '.$crstype.' Documents')).                              &escape(&mt('Main Content').':::::');
                             ':::::';  
             }              }
         }          }
         $containertag = '<input type="hidden" name="folderpath" value="" />';          $containertag = '<input type="hidden" name="folderpath" value="" />';
Line 3323  sub handler { Line 4656  sub handler {
                 $script .= &dump_switchserver_js(@hosts);                   $script .= &dump_switchserver_js(@hosts); 
             }              }
         } else {          } else {
               my $tid = 1;
             my @tabids;              my @tabids;
             if ($supplementalflag) {              if ($supplementalflag) {
                 @tabids = ('002','ee2','ff2');                  @tabids = ('002','ee2','ff2');
                   $tid = 2;
             } else {              } else {
                 @tabids = ('aa1','bb1','cc1','ff1');                  @tabids = ('aa1','bb1','cc1','ff1');
                 unless ($env{'form.folderpath'} =~ /\:1$/) {                  unless ($env{'form.folderpath'} =~ /\:1$/) {
Line 3337  sub handler { Line 4672  sub handler {
     $script .= &editing_js($udom,$uname,$supplementalflag).      $script .= &editing_js($udom,$uname,$supplementalflag).
                        &history_tab_js().                         &history_tab_js().
                        &inject_data_js().                         &inject_data_js().
                        &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr).                         &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid).
                        &Apache::lonextresedit::extedit_javascript();                         &Apache::lonextresedit::extedit_javascript();
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
                           };                            };
         }          }
         if ($env{'docs.markedcopy_url'}) {          $script .= &paste_popup_js(); 
             $script .= &paste_popup_js();   
         }  
         my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.          my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
                              &mt('Switch server?');                               &mt('Switch server?');
                   
Line 3364  sub handler { Line 4697  sub handler {
     if ($showdoc) {      if ($showdoc) {
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,          $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
                                                 {'force_register' => $showdoc,}));                                                  {'force_register' => $showdoc,}));
       } elsif ($toolsflag) {
           &Apache::lonhtmlcommon::add_breadcrumb({
               href=>"/adm/coursedocs",text=>"$crstype Contents"});
           $r->print(&Apache::loncommon::start_page("$crstype Contents", $script)
                    .&Apache::loncommon::help_open_menu('','',273,'RAT')
                    .&Apache::lonhtmlcommon::breadcrumbs(
                        'Editing Course Contents')
                    );
     } elsif ($r->uri eq '/adm/supplemental') {      } elsif ($r->uri eq '/adm/supplemental') {
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,          $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
Line 3371  sub handler { Line 4712  sub handler {
     } else {      } else {
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             href=>"/adm/coursedocs",text=>"$crstype Contents"});              href=>"/adm/coursedocs",text=>"$crstype Contents"});
   
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,          $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
                                                  {'add_entries'    => $addentries}                                                   {'add_entries'    => $addentries}
                                                 )                                                  )
Line 3392  sub handler { Line 4732  sub handler {
           # Process file upload - phase one - upload and parse primary file.            # Process file upload - phase one - upload and parse primary file.
   undef($hadchanges);    undef($hadchanges);
           $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,            $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,
                                               \%allfiles,\%codebase,$context);                                                \%allfiles,\%codebase,$context,$crstype);
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
Line 3442  sub handler { Line 4782  sub handler {
   } elsif ((!$showdoc) && (!$uploadphase)) {    } elsif ((!$showdoc) && (!$uploadphase)) {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
                 'uplm' => 'Upload a new main '.lc($crstype).' document',  
                 'upls' => 'Upload a new supplemental '.lc($crstype).' document',  
                 'impp' => 'Import a document',  
  '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' => 'Import Content',                  'upld' => 'Upload Content',
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
  'lnks' => 'Import from Stored Links',   'lnks' => 'Import from Stored Links',
                 'impm' => 'Import from Assembled Map',                  'impm' => 'Import from Assembled Map',
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                 'reco' => 'Recover Deleted Documents',  
                 'newf' => 'New Folder',                  'newf' => 'New Folder',
                 'newp' => 'New Composite Page',                  'newp' => 'New Composite Page',
                 'extr' => 'External Resource',  
                 'syll' => 'Syllabus',                  'syll' => 'Syllabus',
                 'navc' => 'Table of Contents',                  'navc' => 'Table of Contents',
                 'sipa' => 'Simple Course Page',                  'sipa' => 'Simple Course Page',
                 'sipr' => 'Simple Problem',                  'sipr' => 'Simple Problem',
                   'webp' => 'Blank Web Page (editable)', 
                 'drbx' => 'Drop Box',                  'drbx' => 'Drop Box',
                 'scuf' => 'External Scores (handgrade, upload, clicker)',                  'scuf' => 'External Scores (handgrade, upload, clicker)',
                 'bull' => 'Discussion Board',                  'bull' => 'Discussion Board',
                 'mypi' => 'My Personal Information Page',                  'mypi' => 'My Personal Information Page',
                 'grpo' => 'Group Portfolio',                  'grpo' => 'Group Portfolio',
                 'rost' => 'Course Roster',                  'rost' => 'Course Roster',
  'abou' => 'Personal Information Page for a User',                  'abou' => 'Personal Information Page for a User',
                 'imsf' => 'IMS Import',                  'imsf' => 'IMS Upload',
                 'imsl' => 'Import IMS package',                  'imsl' => 'Upload IMS package',
                 'cms'  => 'Origin of IMS package',                  'cms'  => 'Origin of IMS package',
                 'se'   => 'Select',                  'se'   => 'Select',
                 'file' =>  'File',                  'file' =>  'File',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment',                  'comment' => 'Comment',
                 'url'  => 'URL',  
                 'prev' => 'Preview',  
                 'lnk'  => 'Add Link',   
                 'parse' => 'Upload embedded images/multimedia files if HTML file',                  'parse' => 'Upload embedded images/multimedia files if HTML file',
   );    );
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
Line 3579  SEDFFORM Line 4912  SEDFFORM
         if ($folder eq '') {          if ($folder eq '') {
             $folder='default';              $folder='default';
         }          }
  &update_paste_buffer($coursenum,$coursedom,$folder);   my $output = &update_paste_buffer($coursenum,$coursedom,$folder);
           if ($output) {
               $r->print($output);
           }
  $r->print(<<HIDDENFORM);   $r->print(<<HIDDENFORM);
  <form name="renameform" method="post" action="/adm/coursedocs">   <form name="renameform" method="post" action="/adm/coursedocs">
    <input type="hidden" name="title" />     <input type="hidden" name="title" />
Line 3618  HIDDENFORM Line 4954  HIDDENFORM
        if ($folder eq '' || $supplementalflag) {         if ($folder eq '' || $supplementalflag) {
            $folder='default';             $folder='default';
    $savefolderpath = $env{'form.folderpath'};     $savefolderpath = $env{'form.folderpath'};
    $env{'form.folderpath'}='default&'.&escape(&mt('Content'));     $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'));
            $pathitem = '<input type="hidden" name="folderpath" value="'.             $pathitem = '<input type="hidden" name="folderpath" value="'.
        &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';         &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }         }
Line 3639  HIDDENFORM Line 4975  HIDDENFORM
   
  my $newnavform=(<<NNFORM);   my $newnavform=(<<NNFORM);
  <form action="/adm/coursedocs" method="post" name="newnav">   <form action="/adm/coursedocs" method="post" name="newnav">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'navc'}=/adm/navmaps" />   value="$lt{'navc'}=/adm/navmaps" />
Line 3649  HIDDENFORM Line 4985  HIDDENFORM
 NNFORM  NNFORM
  my $newsmppageform=(<<NSPFORM);   my $newsmppageform=(<<NSPFORM);
  <form action="/adm/coursedocs" method="post" name="newsmppg">   <form action="/adm/coursedocs" method="post" name="newsmppg">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>   <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>
Line 3663  NSPFORM Line 4999  NSPFORM
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a>   <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a>
  $help{'Simple Problem'}   $help{'Simple_Problem'}
  </form>   </form>
   
 NSPROBFORM  NSPROBFORM
Line 3674  NSPROBFORM Line 5010  NSPROBFORM
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a>   <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a>
           $help{'Dropbox'}
  </form>   </form>
 NDBFORM  NDBFORM
   
Line 3689  NEXUFORM Line 5026  NEXUFORM
   
  my $newbulform=(<<NBFORM);   my $newbulform=(<<NBFORM);
  <form action="/adm/coursedocs" method="post" name="newbul">   <form action="/adm/coursedocs" method="post" name="newbul">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>   <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>
Line 3699  NBFORM Line 5036  NBFORM
   
  my $newaboutmeform=(<<NAMFORM);   my $newaboutmeform=(<<NAMFORM);
  <form action="/adm/coursedocs" method="post" name="newaboutme">   <form action="/adm/coursedocs" method="post" name="newaboutme">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
Line 3710  NAMFORM Line 5047  NAMFORM
   
  my $newaboutsomeoneform=(<<NASOFORM);   my $newaboutsomeoneform=(<<NASOFORM);
  <form action="/adm/coursedocs" method="post" name="newaboutsomeone">   <form action="/adm/coursedocs" method="post" name="newaboutsomeone">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>   <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>
  </form>   </form>
 NASOFORM  NASOFORM
   
   
  my $newrosterform=(<<NROSTFORM);   my $newrosterform=(<<NROSTFORM);
  <form action="/adm/coursedocs" method="post" name="newroster">   <form action="/adm/coursedocs" method="post" name="newroster">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'rost'}=/adm/viewclasslist" />   value="$lt{'rost'}=/adm/viewclasslist" />
  <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a>
  $help{'Course Roster'}   $help{'Course_Roster'}
  </form>   </form>
 NROSTFORM  NROSTFORM
   
           my $newwebpage;
           if ($folder =~ /^default_?(\d*)$/) {
               $newwebpage = "/uploaded/$coursedom/$coursenum/docs/";
               if ($1) {
                   $newwebpage .= $1;
               } else {
                   $newwebpage .= 'default';
               }
               $newwebpage .= '/new.html';
           }
           my $newwebpageform =(<<NWEBFORM);
           <form action="/adm/coursedocs" method="post" name="newwebpage">
           <input type="hidden" name="active" value="ee" />
           $pathitem
           <input type="hidden" name="importdetail" value="$newwebpage" />
           <a class="LC_menubuttons_link" href="javascript:makewebpage();">$lt{'webp'}</a>
           $help{'Web_Page'}
           </form>
   NWEBFORM
    
   
 my $specialdocumentsform;  my $specialdocumentsform;
 my @specialdocumentsforma;  my @specialdocumentsforma;
 my $gradingform;  my $gradingform;
Line 3744  my $newfolderb; Line 5101  my $newfolderb;
  <form action="/adm/coursedocs" method="post" name="newpage">   <form action="/adm/coursedocs" method="post" name="newpage">
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>   <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>
  $help{'Adding_Pages'}   $help{'Adding_Pages'}
  </form>   </form>
Line 3755  NPFORM Line 5112  NPFORM
  <form action="/adm/coursedocs" method="post" name="newfolder">   <form action="/adm/coursedocs" method="post" name="newfolder">
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="aa" />   <input type="hidden" name="active" value="" />
  <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}   <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}
  </form>   </form>
 NFFORM  NFFORM
   
  my $newsylform=(<<NSYLFORM);   my $newsylform=(<<NSYLFORM);
  <form action="/adm/coursedocs" method="post" name="newsyl">   <form action="/adm/coursedocs" method="post" name="newsyl">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />   value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
Line 3774  NSYLFORM Line 5131  NSYLFORM
   
  my $newgroupfileform=(<<NGFFORM);   my $newgroupfileform=(<<NGFFORM);
  <form action="/adm/coursedocs" method="post" name="newgroupfiles">   <form action="/adm/coursedocs" method="post" name="newgroupfiles">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"   <input type="hidden" name="importdetail"
  value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />   value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
Line 3787  NGFFORM Line 5144  NGFFORM
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$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},
         );          );
         $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));          $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
   
Line 3800  NGFFORM Line 5158  NGFFORM
             );              );
         }          }
         push(@importdoc,          push(@importdoc,
             {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}              {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}
         );          );
         $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));
   
Line 3822  NGFFORM Line 5180  NGFFORM
         $communityform = &create_form_ul(&create_list_elements(@communityforma));          $communityform = &create_form_ul(&create_list_elements(@communityforma));
   
 my %orderhash = (  my %orderhash = (
                 'aa' => ['Import Content',$fileuploadform],                  'aa' => ['Upload',$fileuploadform],
                 'bb' => ['Published Content',$importpubform],                  'bb' => ['Import',$importpubform],
                 'cc' => ['Grading Resources',$gradingform],                  'cc' => ['Grading',$gradingform],
                 );                  );
 unless ($container eq 'page') {  unless ($container eq 'page') {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
     $orderhash{'dd'} = ['Collaboration',$communityform];      $orderhash{'dd'} = ['Collaboration',$communityform];
     $orderhash{'ee'} = ['Special Pages',$specialdocumentsform];      $orderhash{'ee'} = ['Other',$specialdocumentsform];
 }  }
   
  $hadchanges=0;   $hadchanges=0;
Line 3890  SUPDOCFORM Line 5248  SUPDOCFORM
   
  my $supnewfolderform=(<<SNFFORM);   my $supnewfolderform=(<<SNFFORM);
  <form action="/adm/coursedocs" method="post" name="supnewfolder">   <form action="/adm/coursedocs" method="post" name="supnewfolder">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="" />
         $pathitem          $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a>    <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> 
Line 3924  SNSFORM Line 5282  SNSFORM
  </form>   </form>
 SNAMFORM  SNAMFORM
   
           my $supwebpage;
           if ($folder =~ /^supplemental_?(\d*)$/) {
               $supwebpage = "/uploaded/$coursedom/$coursenum/supplemental/";
               if ($1) {
                   $supwebpage .= $1;
               } else {
                   $supwebpage .= 'default';
               }
               $supwebpage .= '/new.html';
           }
           my $supwebpageform =(<<SWEBFORM);
           <form action="/adm/coursedocs" method="post" name="supwebpage">
           <input type="hidden" name="active" value="cc" />
           $pathitem
           <input type="hidden" name="importdetail" value="$supwebpage" />
           <a class="LC_menubuttons_link" href="javascript:makewebpage('supp');">$lt{'webp'}</a>
           $help{'Web_Page'}
           </form>
   SWEBFORM
   
   
 my @specialdocs = (  my @specialdocs = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.supnewsyl.submit()" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.supnewsyl.submit()" />'
             =>$supnewsylform},              =>$supnewsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="document.supnewaboutme.submit()" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="document.supnewaboutme.submit()" />'
             =>$supnewaboutmeform},              =>$supnewaboutmeform},
                   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage('."'supp'".');" />'=>$supwebpageform},
   
  );   );
 my @supimportdoc = (  my @supimportdoc = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'
Line 3941  my @supimportdoc = ( Line 5321  my @supimportdoc = (
 $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));  $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));
 my %suporderhash = (  my %suporderhash = (
  '00' => ['Supnewfolder', $supnewfolderform],   '00' => ['Supnewfolder', $supnewfolderform],
                 'ee' => ['Import Content',$supupdocform],                  'ee' => ['Upload',$supupdocform],
                 'ff' => ['Special Pages',&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,             my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                $supplementalflag,\%suporderhash,$iconpath,$pathitem);                                 $supplementalflag,\%suporderhash,$iconpath,$pathitem);
            if ($error) {             if ($error) {
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');                $r->print('<p><span class="LC_error">'.$error.'</span></p>');
            }             } else {
                  if ($suppchanges) {
                      my %servers = &Apache::lonnet::internet_dom_servers($coursedom);
                      my @ids=&Apache::lonnet::current_machine_ids();
                      foreach my $server (keys(%servers)) {
                          next if (grep(/^\Q$server\E$/,@ids));
                          my $hashid=$coursenum.':'.$coursedom;
                          my $cachekey = &escape('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,
Line 4096  sub remove_archive { Line 5489  sub remove_archive {
     } else {      } else {
         my $currcmd = $env{'form.cmd'};          my $currcmd = $env{'form.cmd'};
         my $position = $env{'form.position'};          my $position = $env{'form.position'};
         if ($position > 0) {           if ($position > 0) {
             $env{'form.cmd'} = 'del_'.$position;              $env{'form.cmd'} = 'remove_'.$position;
             my ($title,$url,@rrest) =               my ($title,$url,@rrest) = 
                 split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]);                  split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]);
             if (&handle_edit_cmd($docuname,$docudom)) {              if (&handle_edit_cmd($docuname,$docudom)) {
Line 4132  sub generate_admin_menu { Line 5525  sub generate_admin_menu {
     my ($crstype) = @_;      my ($crstype) = @_;
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     my %lt=&Apache::lonlocal::texthash (      my %lt= ( # do not translate here
                                          'vc'   => 'Verify Content',                                           'vc'   => 'Verify Content',
                                          'cv'   => 'Check/Set Resource Versions',                                           'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',                                           'ls'   => 'List Resource Identifiers',
                                          'imse' => 'Export contents to IMS Archive',                                           'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Dump $crstype Content to Authoring Space",                                           'dcd'  => "Copy $crstype Content to Authoring Space",
                                        );              );
     my ($candump,$dumpurl);      my ($candump,$dumpurl);
     if ($home + $other > 0) {      if ($home + $other > 0) {
         $candump = 'F';          $candump = 'F';
Line 4149  sub generate_admin_menu { Line 5542  sub generate_admin_menu {
             foreach my $aurole (keys(%outhash)) {              foreach my $aurole (keys(%outhash)) {
                 unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) {                  unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) {
                     push(@hosts,$outhash{$aurole});                      push(@hosts,$outhash{$aurole});
                 }                    }
             }              }
             if (@hosts == 1) {              if (@hosts == 1) {
                 my $switchto = '/adm/switchserver?otherserver='.$hosts[0].                  my $switchto = '/adm/switchserver?otherserver='.$hosts[0].
Line 4168  sub generate_admin_menu { Line 5561  sub generate_admin_menu {
                 {   linktext   => $lt{'vc'},                  {   linktext   => $lt{'vc'},
                     url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",                      url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",
                     permission => 'F',                      permission => 'F',
                     help       => 'Verify_Content',                      help       => 'Docs_Verify_Content',
                     icon       => 'verify.png',                      icon       => 'verify.png',
                     linktitle  => 'Verify contents can be retrieved/rendered',                      linktitle  => 'Verify contents can be retrieved/rendered',
                 },                  },
                 {   linktext => $lt{'cv'},                  {   linktext => $lt{'cv'},
                     url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",                      url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",
                     permission => 'F',                      permission => 'F',
                     help       => 'Check_Resource_Versions',                      help       => 'Docs_Check_Resource_Versions',
                     icon       => 'resversion.png',                      icon       => 'resversion.png',
                     linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",                      linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",
                 },                  },
Line 4200  sub generate_admin_menu { Line 5593  sub generate_admin_menu {
                 {   linktext   => $lt{'dcd'},                  {   linktext   => $lt{'dcd'},
                     url        => $dumpurl,                      url        => $dumpurl,
                     permission => $candump,                      permission => $candump,
                     #help => '',                      help       => 'Docs_Dump_Course_Docs',
                     icon       => 'dump.png',                      icon       => 'dump.png',
                     linktitle  => $lt{'dcd'},                      linktitle  => $lt{'dcd'},
                 },                  },
Line 4213  sub generate_admin_menu { Line 5606  sub generate_admin_menu {
 }  }
   
 sub generate_edit_table {  sub generate_edit_table {
     my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile) = @_;      my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile,
           $need_save,$copyfolder) = @_;
     return unless(ref($orderhash_ref) eq 'HASH');      return unless(ref($orderhash_ref) eq 'HASH');
     my %orderhash = %{$orderhash_ref};      my %orderhash = %{$orderhash_ref};
     my $form;      my $form;
     my $activetab;      my $activetab;
     my $active;      my $active;
     if($env{'form.active'} ne ''){      if (($env{'form.active'} ne '') && ($env{'form.active'} ne '00')) {
         $activetab = $env{'form.active'};          $activetab = $env{'form.active'};
     }      }
     my $backicon = $iconpath.'clickhere.gif';      my $backicon = $iconpath.'clickhere.gif';
     my $backtext = &mt('Exit');      my $backtext = &mt('Exit Editor');
     $form = '<div class="LC_Box" style="margin:0;">'.      $form = '<div class="LC_Box" style="margin:0;">'.
             '<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n".              '<ul id="navigation'.$tid.'" class="LC_TabContent">'."\n".
             '<li class="goback">'.              '<li class="goback">'.
Line 4254  sub generate_edit_table { Line 5648  sub generate_edit_table {
             $form .= '<li style="float:right" '.$active              $form .= '<li style="float:right" '.$active
                 .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";                  .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";
         } else {          } else {
     $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";      $form .= '<li style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";
   
  }   }
     }      }
Line 4262  sub generate_edit_table { Line 5656  sub generate_edit_table {
     $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'."\n";      $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'."\n";
   
     if ($to_show ne '') {      if ($to_show ne '') {
         $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'."\n";          my $saveform;
           if ($need_save) {
               my $button = &mt('Make changes');
               my $path;
               if ($env{'form.folderpath'}) {
                   $path =
                       &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
               }
               $saveform = <<"END";
   <div id="multisave" style="display:none; clear:both;" >
   <form name="saveactions" method="post" action="/adm/coursedocs" onsubmit="return checkSubmits();">
   <input type="hidden" name="folderpath" value="$path" />
   <input type="hidden" name="symb" value="$env{'form.symb'}" />
   <input type="hidden" name="allhiddenresource" value="" />
   <input type="hidden" name="allencrypturl" value="" />
   <input type="hidden" name="allrandompick" value="" />
   <input type="hidden" name="allrandomorder" value="" />
   <input type="hidden" name="changeparms" value="" />
   <input type="hidden" name="multiremove" value="" />
   <input type="hidden" name="multicut" value="" />
   <input type="hidden" name="multicopy" value="" />
   <input type="hidden" name="multichange" value="" />
   <input type="hidden" name="copyfolder" value="$copyfolder" />
   <input type="submit" name="savemultiples" value="$button" />
   </form>
   </div>
   END
           }
           $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'.$saveform."\n";
     }      }
     foreach my $field (keys(%orderhash)){      foreach my $field (keys(%orderhash)){
  if($field ne '00'){   if($field ne '00'){
Line 4284  sub generate_edit_table { Line 5706  sub generate_edit_table {
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag) = @_;      my ($udom,$uname,$supplementalflag) = @_;
     my $now = time();  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           p_mnf => 'Name of New Folder',                                            p_mnf => 'Name of New Folder',
                                           t_mnf => 'New Folder',                                            t_mnf => 'New Folder',
Line 4295  sub editing_js { Line 5716  sub editing_js {
                                           p_msb => 'Title for the Problem',                                            p_msb => 'Title for the Problem',
                                           p_mdb => 'Title for the Drop Box',                                            p_mdb => 'Title for the Drop Box',
                                           p_mbb => 'Title for the Discussion Board',                                            p_mbb => 'Title for the Discussion Board',
                                             p_mwp => 'Title for Web Page', 
                                           p_mab => "Enter user:domain for User's Personal Information Page",                                            p_mab => "Enter user:domain for User's Personal Information Page",
                                           p_mab2 => 'Personal Information Page of ',                                            p_mab2 => 'Personal Information Page of ',
                                           p_mab_alrt1 => 'Not a valid user:domain',                                            p_mab_alrt1 => 'Not a valid user:domain',
Line 4303  sub editing_js { Line 5725  sub editing_js {
                                           p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',                                            p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',
                                           p_rmr2a => 'Remove[_99]',                                            p_rmr2a => 'Remove[_99]',
                                           p_rmr2b => '?[_99]',                                            p_rmr2b => '?[_99]',
                                             p_rmr3a => 'Remove those [_2]',
                                             p_rmr3b => 'items?[_2]',
                                           p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',                                            p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',
                                           p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',                                            p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',
                                           p_ctr2a => 'Cut[_98]',                                            p_ctr2a => 'Cut[_98]',
                                           p_ctr2b => '?[_98]',                                            p_ctr2b => '?[_98]',
                                             p_ctr3a => 'Cut those[_2]',
                                             p_ctr3b => 'items?[_2]',
                                           rpck    => 'Enter number to pick (e.g., 3)',                                            rpck    => 'Enter number to pick (e.g., 3)',
                                           imsfile => 'You must choose an IMS package for import',                                            imsfile => 'You must choose an IMS package for import',
                                           imscms  => 'You must select which Course Management System was the source of the IMS package',                                            imscms  => 'You must select which Course Management System was the source of the IMS package',
                                           invurl  => 'Invalid URL',                                            invurl  => 'Invalid URL',
                                           titbl   => 'Title is blank',                                            titbl   => 'Title is blank',
                                             more    => '(More ...)',
                                             less    => '(Less ...)',
                                             noor    => 'No actions selected or changes to settings specified.',
                                             noch    => 'No changes to settings specified.',
                                             noac    => 'No actions selected.',
                                         );                                          );
   
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 4320  sub editing_js { Line 5751  sub editing_js {
     if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {      if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {
         $main_container_page = 1;          $main_container_page = 1;
     }      }
     my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents%3A%3A%3A%3A%3A';      my $toplevelmain = 
           &escape(&mt('Main Content').':::::');
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
     my $backtourl = '/adm/navmaps';      my $backtourl;
     if ($supplementalflag) {      if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {
           my $caller = $1;
           if ($caller =~ /^supplemental/) {
               $backtourl = '/adm/supplemental?folderpath='.&escape($caller);
           } else {
               my ($map,$id,$res)=&Apache::lonnet::decode_symb($caller);
               $res = &Apache::lonnet::clutter($res);
               if (&Apache::lonnet::is_on_map($res)) {
                   $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($res),'<>&"').'?symb='.
                                &HTML::Entities::encode($caller,'<>&"');
               } else {
                   $backtourl = '/adm/navmaps';
               }
           }
       } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {
           $backtourl = '/adm/menu';
       } elsif ($supplementalflag) {
         $backtourl = '/adm/supplemental';          $backtourl = '/adm/supplemental';
       } else {
           $backtourl = '/adm/navmaps';
     }      }
   
     my $fieldsets = "'ext','doc'";      my $fieldsets = "'ext','doc'";
Line 4366  function makesmppage() { Line 5816  function makesmppage() {
    var title=prompt('$lt{"p_msp"}');     var title=prompt('$lt{"p_msp"}');
    if (title) {     if (title) {
     this.document.forms.newsmppg.importdetail.value=      this.document.forms.newsmppg.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/$now/smppg';   escape(title)+'=/adm/$udom/$uname/new/smppg';
     this.document.forms.newsmppg.submit();      this.document.forms.newsmppg.submit();
    }     }
 }  }
   
   function makewebpage(type) {
      var title=prompt('$lt{"p_mwp"}');
      var formname;
      if (type == 'supp') {
          formname = this.document.forms.supwebpage;
      } else {
          formname = this.document.forms.newwebpage;
      }
      if (title) {
          var webpage = formname.importdetail.value; 
          formname.importdetail.value = escape(title)+'='+webpage;
          formname.submit();
      }
   }
   
 function makesmpproblem() {  function makesmpproblem() {
    var title=prompt('$lt{"p_msb"}');     var title=prompt('$lt{"p_msb"}');
    if (title) {     if (title) {
Line 4393  function makebulboard() { Line 5858  function makebulboard() {
    var title=prompt('$lt{"p_mbb"}');     var title=prompt('$lt{"p_mbb"}');
    if (title) {     if (title) {
     this.document.forms.newbul.importdetail.value=      this.document.forms.newbul.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';   escape(title)+'=/adm/$udom/$uname/new/bulletinboard';
     this.document.forms.newbul.submit();      this.document.forms.newbul.submit();
    }     }
 }  }
Line 4464  function makeims(imsform) { Line 5929  function makeims(imsform) {
 function changename(folderpath,index,oldtitle) {  function changename(folderpath,index,oldtitle) {
 var title=prompt('$lt{"p_chn"}',oldtitle);  var title=prompt('$lt{"p_chn"}',oldtitle);
 if (title) {  if (title) {
 this.document.forms.renameform.markcopy.value=-1;  this.document.forms.renameform.markcopy.value='';
 this.document.forms.renameform.title.value=title;  this.document.forms.renameform.title.value=title;
 this.document.forms.renameform.cmd.value='rename_'+index;  this.document.forms.renameform.cmd.value='rename_'+index;
 this.document.forms.renameform.folderpath.value=folderpath;  this.document.forms.renameform.folderpath.value=folderpath;
Line 4472  this.document.forms.renameform.submit(); Line 5937  this.document.forms.renameform.submit();
 }  }
 }  }
   
 function removeres(folderpath,index,oldtitle,skip_confirm) {  
 if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {  
 this.document.forms.renameform.markcopy.value=-1;  
 this.document.forms.renameform.cmd.value='del_'+index;  
 this.document.forms.renameform.folderpath.value=folderpath;  
 this.document.forms.renameform.submit();  
 }  
 }  
   
 function cutres(folderpath,index,oldtitle,container,folder,skip_confirm) {  
 if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {  
 this.document.forms.renameform.cmd.value='cut_'+index;  
 this.document.forms.renameform.markcopy.value=index;  
 this.document.forms.renameform.copyfolder.value=folder+'.'+container;  
 this.document.forms.renameform.folderpath.value=folderpath;  
 this.document.forms.renameform.submit();  
 }  
 }  
   
 function markcopy(folderpath,index,oldtitle,container,folder) {  
 this.document.forms.renameform.markcopy.value=index;  
 this.document.forms.renameform.copyfolder.value=folder+'.'+container;  
 this.document.forms.renameform.folderpath.value=folderpath;  
 this.document.forms.renameform.submit();  
 }  
   
 function updatePick(targetform,index,caller) {  function updatePick(targetform,index,caller) {
     var pickitem = document.getElementById('rpick_'+index);      var pickitem;
     var picknumitem = document.getElementById('rpicknum_'+index);      var picknumitem;
       var picknumtext;
       if (index == 'all') {
           pickitem = document.getElementById('randompickall');
           picknumitem = document.getElementById('rpicknumall');
           picknumtext = document.getElementById('rpicktextall');
       } else {
           pickitem = document.getElementById('randompick_'+index);
           picknumitem = document.getElementById('rpicknum_'+index);
           picknumtext = document.getElementById('randompicknum_'+index);
       }
     if (pickitem.checked) {      if (pickitem.checked) {
         var picknum=prompt('$lt{"rpck"}',picknumitem.value);          var picknum=prompt('$lt{"rpck"}',picknumitem.value);
         if (picknum == '' || picknum == null) {          if (picknum == '' || picknum == null) {
             if (caller == 'check') {              if (caller == 'check') {
                 pickitem.checked=false;                  pickitem.checked=false;
                 return;                  if (index == 'all') {
                       picknumtext.innerHTML = '';
                       if (caller == 'link') {
                           propagateState(targetform,'rpicknum');
                       }
                   } else {
                       checkForSubmit(targetform,'randompick','settings');
                   }
             }              }
         } else {          } else {
             picknum.toString();              picknum.toString();
             var regexdigit=/^\\d+\$/;              var regexdigit=/^\\d+\$/;
             if (regexdigit.test(picknum)) {              if (regexdigit.test(picknum)) {
                 picknumitem.value = picknum;                  picknumitem.value = picknum;
                 targetform.changeparms.value='randompick';                  if (index == 'all') {
                 targetform.submit();                      picknumtext.innerHTML = '&nbsp;<a href="javascript:updatePick(document.cumulativesettings,\\'all\\',\\'link\\');">'+picknum+'</a>';
                       if (caller == 'link') {
                           propagateState(targetform,'rpicknum');
                       }
                   } else {
                       picknumtext.innerHTML = '&nbsp;<a href="javascript:updatePick(document.edit_randompick_'+index+',\\''+index+'\\',\\'link\\');">'+picknum+'</a>';
                       checkForSubmit(targetform,'randompick','settings');
                   }
             } else {              } else {
                 if (caller == 'check') {                  if (caller == 'check') {
                     pickitem.checked=false;                      if (index == 'all') {
                           picknumtext.innerHTML = '';
                           if (caller == 'link') {
                               propagateState(targetform,'rpicknum');
                           }
                       } else {
                           pickitem.checked=false;
                           checkForSubmit(targetform,'randompick','settings');
                       }
                 }                  }
                 return;                  return;
             }              }
         }          }
     } else {      } else {
         picknumitem.value = 0;          picknumitem.value = '';
         targetform.changeparms.value='randompick';          picknumtext.innerHTML = '';
         targetform.submit();          if (index == 'all') {
               if (caller == 'link') {
                   propagateState(targetform,'rpicknum');
               }
           } else {
               checkForSubmit(targetform,'randompick','settings');
           }
     }      }
 }  }
   
   function propagateState(form,param) {
       if (document.getElementById(param+'all')) {
           var setcheck = 0;
           var rpick = 0;
           if (param == 'rpicknum') {
               if (document.getElementById('randompickall')) {
                   if (document.getElementById('randompickall').checked) {
                       if (document.getElementById('rpicknumall')) {
                           rpick = document.getElementById('rpicknumall').value;
                       }
                   }
               }
           } else {
               if (document.getElementById(param+'all').checked) {
                   setcheck = 1;
               }
           }
           var allidxlist;
           if ((param == 'remove') || (param == 'cut') || (param == 'copy')) {
               if (document.getElementById('all'+param+'idx')) {
                   allidxlist = document.getElementById('all'+param+'idx').value;
               }
               var actions = new Array ('remove','cut','copy');
               for (var i=0; i<actions.length; i++) {
                   if (actions[i] != param) {
                       if (document.getElementById(actions[i]+'all')) {
                           document.getElementById(actions[i]+'all').checked = false; 
                       }
                   }
               }
           }
           if ((param == 'encrypturl') || (param == 'hiddenresource')) {
               allidxlist = form.allidx.value;
           }
           if ((param == 'randompick') || (param == 'rpicknum') || (param == 'randomorder')) {
               allidxlist = form.allmapidx.value;
           }
           if ((allidxlist != '') && (allidxlist != null)) {
               var allidxs = allidxlist.split(',');
               if (allidxs.length > 1) {
                   for (var i=0; i<allidxs.length; i++) {
                       if (document.getElementById(param+'_'+allidxs[i])) {
                           if (param == 'rpicknum') {
                               if (document.getElementById('randompick_'+allidxs[i])) {
                                   if (document.getElementById('randompick_'+allidxs[i]).checked) {
                                       document.getElementById(param+'_'+allidxs[i]).value = rpick;
                                       if (rpick > 0) {
                                           document.getElementById('randompicknum_'+allidxs[i]).innerHTML = ':&nbsp;<a href="javascript:updatePick(document.edit_randompick_'+allidxs[i]+',\\''+allidxs[i]+'\\',\\'link\\')">'+rpick+'</a>';
                                       } else {
                                           document.getElementById('randompicknum_'+allidxs[i]).innerHTML =  '';
                                       }
                                   }
                               }
                           } else {
                               if (setcheck == 1) {
                                   document.getElementById(param+'_'+allidxs[i]).checked = true;
                               } else {
                                   document.getElementById(param+'_'+allidxs[i]).checked = false;
                                   if (param == 'randompick') {
                                       document.getElementById('randompicknum_'+allidxs[i]).innerHTML =  '';
                                   }
                               }
                           }
                       }
                   }
                   if (setcheck == 1) {
                       if ((param == 'remove') || (param == 'cut') || (param == 'copy')) {
                           var actions = new Array('copy','cut','remove');
                           for (var i=0; i<actions.length; i++) {
                               var otheractions;
                               var otheridxs;
                               if (actions[i] === param) {
                                   continue;
                               } else {
                                   if (document.getElementById('all'+actions[i]+'idx')) {
                                       otheractions = document.getElementById('all'+actions[i]+'idx').value;
                                       otheridxs = otheractions.split(',');
                                       if (otheridxs.length > 1) {
                                           for (var j=0; j<otheridxs.length; j++) {
                                               if (document.getElementById(actions[i]+'_'+otheridxs[j])) {
                                                   document.getElementById(actions[i]+'_'+otheridxs[j]).checked = false;
                                               }
                                           }
                                       }
                                   }
                               }
                           } 
                       }
                   }
               }
           }
       }
       return;
   }
   
   function checkForSubmit(targetform,param,context,idx,folderpath,index,oldtitle,skip_confirm,container,folder) {
       var dosettings;
       var doaction;
       var control = document.togglemultsettings;
       if (context == 'actions') {
           control = document.togglemultactions;
           doaction = 1; 
       } else {
           dosettings = 1;
       }
       if (control) {
           if (control.showmultpick.length) {
               for (var i=0; i<control.showmultpick.length; i++) {
                   if (control.showmultpick[i].checked) {
                       if (control.showmultpick[i].value == 1) {
                           if (context == 'settings') {
                               dosettings = 0;
                           } else {
                               doaction = 0;
                           }
                       }
                   }
               }
           }
       }
       if (context == 'settings') {
           if (dosettings == 1) {
               targetform.changeparms.value=param;
               targetform.submit();
           }
       }
       if (context == 'actions') {
           if (doaction == 1) {
               targetform.cmd.value=param+'_'+index;
               targetform.folderpath.value=folderpath;
               targetform.markcopy.value=idx+':'+param;
               targetform.copyfolder.value=folder+'.'+container;
               if (param == 'remove') {
                   if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
                       targetform.markcopy.value='';
                       targetform.copyfolder.value='';
                       targetform.submit();
                   }
               }
               if (param == 'cut') {
                   if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
                       targetform.submit();
                       return;
                   }
               }
               if (param == 'copy') {
                   targetform.submit();
                   return;
               }
               targetform.markcopy.value='';
               targetform.copyfolder.value='';
               targetform.cmd.value='';
               targetform.folderpath.value='';
               return;
           } else {
               if (document.getElementById(param+'_'+idx)) {
                   item = document.getElementById(param+'_'+idx);
                   if (item.type == 'checkbox') {
                       if (item.checked) {
                           item.checked = false;
                       } else {
                           item.checked = true;
                           singleCheck(item,idx,param);
                       }
                   }
               }
           }
       }
       return;
   }
   
   function singleCheck(caller,idx,action) {
       actions = new Array('cut','copy','remove');
       if (caller.checked) {
           for (var i=0; i<actions.length; i++) {
               if (actions[i] != action) {
                   if (document.getElementById(actions[i]+'_'+idx)) {
                       if (document.getElementById(actions[i]+'_'+idx).checked) {
                           document.getElementById(actions[i]+'_'+idx).checked = false;
                       }
                   }
               }
           }
       }
       return;
   }
   
 function unselectInactive(nav) {  function unselectInactive(nav) {
 currentNav = document.getElementById(nav);  currentNav = document.getElementById(nav);
 currentLis = currentNav.getElementsByTagName('LI');  currentLis = currentNav.getElementsByTagName('LI');
Line 4547  for (i = 0; i < currentLis.length; i++) Line 6211  for (i = 0; i < currentLis.length; i++)
   
 function hideAll(current, nav, data) {  function hideAll(current, nav, data) {
 unselectInactive(nav);  unselectInactive(nav);
 if(current.className == 'right'){  if (current) { 
  current.className = 'right active'      if (current.className == 'right'){
  }else{          current.className = 'right active'
  current.className = 'active';      } else {
           current.className = 'active';
       }
 }  }
 currentData = document.getElementById(data);  currentData = document.getElementById(data);
 currentDivs = currentData.getElementsByTagName('DIV');  currentDivs = currentData.getElementsByTagName('DIV');
Line 4581  function openTabs(pageId) { Line 6247  function openTabs(pageId) {
 }  }
   
 function showPage(current, pageId, nav, data) {  function showPage(current, pageId, nav, data) {
           currstate = current.className;
  hideAll(current, nav, data);   hideAll(current, nav, data);
  openTabs(pageId);   openTabs(pageId);
  unselectInactive(nav);   unselectInactive(nav);
  current.className = 'active';          if ((currstate == 'active') || (currstate == 'right active')) {
               if (currstate == 'active') {
           current.className = '';
               } else {
                   current.className = 'right';
               }
               activeTab = ''; 
               toggleUpload();
               toggleMap();
               resize_scrollbox('contentscroll','1','0');
               return;
           } else {
               current.className = 'active';
           }
  currentData = document.getElementById(pageId);   currentData = document.getElementById(pageId);
  currentData.style.display = 'block';   currentData.style.display = 'block';
         activeTab = pageId;          activeTab = pageId;
Line 4627  function showPage(current, pageId, nav, Line 6307  function showPage(current, pageId, nav,
   
 function toContents(jumpto) {  function toContents(jumpto) {
     var newurl = '$backtourl';      var newurl = '$backtourl';
     if (jumpto != '') {      if ((newurl == '/adm/navmaps') && (jumpto != '')) {
         newurl = newurl+'?postdata='+jumpto;          newurl = newurl+'?postdata='+jumpto;
 ;  
     }      }
     location.href=newurl;      location.href=newurl;
 }  }
   
   function togglePick(caller,value) {
       var disp = 'none';
       if (document.getElementById('multi'+caller)) {
           var curr = document.getElementById('multi'+caller).style.display;
           if (value == 1) {
               disp='block';
           }
           if (curr == disp) {
               return; 
           }
           document.getElementById('multi'+caller).style.display=disp;
           if (value == 1) {
               document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$lt{'more'}</a>'; 
           } else {
               document.getElementById('more'+caller).innerHTML = '';
           }
           if (caller == 'actions') { 
               setClass(value);
               setBoxes(value);
           }
       }
       var showButton = multiSettings();
       if (showButton != 1) {
           showButton = multiActions();
       }
       if (document.getElementById('multisave')) {
           if (showButton == 1) {
               document.getElementById('multisave').style.display='block';
           } else {
               document.getElementById('multisave').style.display='none';
           }
       }
       resize_scrollbox('contentscroll','1','1');
       return;
   }
   
   function toggleCheckUncheck(caller,more) {
       if (more == 1) {
           document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',0);" style="text-decoration:none;">$lt{'less'}</a>';
           document.getElementById('allfields'+caller).style.display='block';
       } else {
           document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$lt{'more'}</a>';
           document.getElementById('allfields'+caller).style.display='none';
       }
       resize_scrollbox('contentscroll','1','1');
   }
   
   function multiSettings() {
       var inuse = 0;
       var settingsform = document.togglemultsettings;
       if (settingsform.showmultpick.length > 1) {
           for (var i=0; i<settingsform.showmultpick.length; i++) {
               if (settingsform.showmultpick[i].checked) {
                   if (settingsform.showmultpick[i].value == 1) {
                       inuse = 1;  
                   }
               }
           }
       }
       return inuse;
   }
   
   function multiActions() {
       var inuse = 0;
       var actionsform = document.togglemultactions;
       if (actionsform.showmultpick.length > 1) {
           for (var i=0; i<actionsform.showmultpick.length; i++) {
               if (actionsform.showmultpick[i].checked) {
                   if (actionsform.showmultpick[i].value == 1) {
                       inuse = 1;
                   }
               }
           }
       }
       return inuse;
   } 
   
   function checkSubmits() {
       var numchanges = 0;
       var form = document.saveactions;
       var doactions = multiActions();
       var cutwarnings = 0;
       var remwarnings = 0;
       if (doactions == 1) {
           var remidxlist = document.cumulativeactions.allremoveidx.value;
           if ((remidxlist != '') && (remidxlist != null)) {
               var remidxs = remidxlist.split(',');
               for (var i=0; i<remidxs.length; i++) {
                   if (document.getElementById('remove_'+remidxs[i])) {
                       if (document.getElementById('remove_'+remidxs[i]).checked) {
                           form.multiremove.value += remidxs[i]+',';
                           numchanges ++;
                           if (document.getElementById('skip_remove_'+remidxs[i])) {
                               if (document.getElementById('skip_remove_'+remidxs[i]).value == 0) {
                                   remwarnings ++;
                               }
                           }
                       }
                   }
               }
           }
           var cutidxlist = document.cumulativeactions.allcutidx.value;
           if ((cutidxlist != '') && (cutidxlist != null)) {
               var cutidxs = cutidxlist.split(',');
               for (var i=0; i<cutidxs.length; i++) {
                   if (document.getElementById('cut_'+cutidxs[i])) {
                       if (document.getElementById('cut_'+cutidxs[i]).checked == true) {
                           form.multicut.value += cutidxs[i]+',';
                           numchanges ++;
                           if (document.getElementById('skip_cut_'+cutidxs[i])) {
                               if (document.getElementById('skip_cut_'+cutidxs[i]).value == 0) {
                                   cutwarnings ++;
                               }
                           }
                       }
                   }
               }
           }
           var copyidxlist = document.cumulativeactions.allcopyidx.value;
           if ((copyidxlist != '') && (copyidxlist != null)) {
               var copyidxs = copyidxlist.split(',');
               for (var i=0; i<copyidxs.length; i++) {
                   if (document.getElementById('copy_'+copyidxs[i])) {
                       if (document.getElementById('copy_'+copyidxs[i]).checked) {
                           form.multicopy.value += copyidxs[i]+',';
                           numchanges ++;
                       }
                   }
               }
           }
           if (numchanges > 0) {
               form.multichange.value = numchanges;
           }
       }
       var dosettings = multiSettings();
       var haschanges = 0;
       if (dosettings == 1) {
           form.allencrypturl.value = '';
           form.allhiddenresource.value = '';
           form.changeparms.value = 'all';
           var patt=new RegExp(",\$");
           var allidxlist = document.cumulativesettings.allidx.value;
           if ((allidxlist != '') && (allidxlist != null)) {
               var allidxs = allidxlist.split(',');
               if (allidxs.length > 1) {
                   for (var i=0; i<allidxs.length; i++) {
                       if (document.getElementById('hiddenresource_'+allidxs[i])) {
                           if (document.getElementById('hiddenresource_'+allidxs[i]).checked) {
                               form.allhiddenresource.value += allidxs[i]+',';
                           }
                       }
                       if (document.getElementById('encrypturl_'+allidxs[i])) {
                           if (document.getElementById('encrypturl_'+allidxs[i]).checked) {
                               form.allencrypturl.value += allidxs[i]+',';
                           }
                       }
                   }
                   form.allhiddenresource.value = form.allhiddenresource.value.replace(patt,"");
                   form.allencrypturl.value = form.allencrypturl.value.replace(patt,"");
               }
           }
           form.allrandompick.value = '';
           form.allrandomorder.value = '';
           var allmapidxlist = document.cumulativesettings.allmapidx.value;
           if ((allmapidxlist != '') && (allmapidxlist != null)) {
               var allmapidxs = allmapidxlist.split(',');
               for (var i=0; i<allmapidxs.length; i++) {
                   var randompick = document.getElementById('randompick_'+allmapidxs[i]);
                   var rpicknum = document.getElementById('rpicknum_'+allmapidxs[i]);
                   var randorder = document.getElementById('randomorder_'+allmapidxs[i]);
                   if ((randompick.checked) && (rpicknum.value != '')) {
                       form.allrandompick.value += allmapidxs[i]+':'+rpicknum.value+',';
                   }
                   if (randorder.checked) {
                       form.allrandomorder.value += allmapidxs[i]+',';
                   }
               }
               form.allrandompick.value = form.allrandompick.value.replace(patt,"");
               form.allrandomorder.value = form.allrandomorder.value.replace(patt,"");
           }
           if (document.cumulativesettings.currhiddenresource.value != form.allhiddenresource.value) {
               haschanges = 1;
           }
           if (document.cumulativesettings.currencrypturl.value != form.allencrypturl.value) {
               haschanges = 1;
           }
           if (document.cumulativesettings.currrandomorder.value != form.allrandomorder.value) {
               haschanges = 1;
           }
           if (document.cumulativesettings.currrandompick.value != form.allrandompick.value) {
               haschanges = 1;
           }
       }
       if (doactions == 1) {
           if (numchanges > 0) {
               if ((cutwarnings > 0) || (remwarnings > 0)) {
                   if (remwarnings > 0) {
                       if (!confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr3a"} '+remwarnings+' $lt{"p_rmr3b"}')) {
                           return false;
                       }
                   }
                   if (cutwarnings > 0) {
                       if (!confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr3a"} '+cutwarnings+' $lt{"p_ctr3b"}')) {
                           return false;
                       }
                   }
               }
               form.submit();
               return true;
           }
       }
       if (dosettings == 1) {
           if (haschanges == 1) {
               form.submit();
               return true;
           }
       }
       if ((dosettings == 1) && (doactions == 1)) {
           alert("$lt{'noor'}");
       } else {
           if (dosettings == 1) {
               alert("$lt{'noch'}");
           } else {
               alert("$lt{'noac'}");
           }
       }
       return false;
   }
   
   function setClass(value) {
       var cutclass = 'LC_docs_cut';
       var copyclass = 'LC_docs_copy';
       var removeclass = 'LC_docs_remove';
       var cutreg = new RegExp("\\\\b"+cutclass+"\\\\b");
       var copyreg = new RegExp("\\\\b"+copyclass+"\\\\b");
       var removereg = new RegExp("\\\\"+removeclass+"\\\\b");
       var links = document.getElementsByTagName('a');
       for (var i=0; i<links.length; i++) {
           var classes = links[i].className;
           if (cutreg.test(classes)) {
               links[i].className = cutclass;
               if (value == 1) {
                   links[i].className += " LC_menubuttons_link";
               }
           } else {
               if (copyreg.test(classes)) {
                   links[i].className = copyclass;
                   if (value == 1) {
                       links[i].className += " LC_menubuttons_link";
                   } 
               } else {
                   if (removereg.test(classes)) {
                       links[i].className = removeclass;
                       if (value == 1) {
                           links[i].className += " LC_menubuttons_link";
                       }
                   }
               }
           }
       }
       return;
   }
   
   function setBoxes(value) {
       var remidxlist = document.cumulativeactions.allremoveidx.value;
       if ((remidxlist != '') && (remidxlist != null)) {
           var remidxs = remidxlist.split(',');
           for (var i=0; i<remidxs.length; i++) {
               if (document.getElementById('remove_'+remidxs[i])) {
                   var item = document.getElementById('remove_'+remidxs[i]);
                   if (value == 1) {
                       item.className = 'LC_docs_remove';
                   } else {
                       item.className = 'LC_hidden';
                   }
               }
           }
       }
       var cutidxlist = document.cumulativeactions.allcutidx.value;
       if ((cutidxlist != '') && (cutidxlist != null)) {
           var cutidxs = cutidxlist.split(',');
           for (var i=0; i<cutidxs.length; i++) {
               if (document.getElementById('cut_'+cutidxs[i])) {
                   var item = document.getElementById('cut_'+cutidxs[i]);
                   if (value == 1) {
                       item.className = 'LC_docs_cut';
                   } else {
                       item.className = 'LC_hidden';
                   }
               }
           }
       }
       var copyidxlist = document.cumulativeactions.allcopyidx.value;
       if ((copyidxlist != '') && (copyidxlist != null)) {
           var copyidxs = copyidxlist.split(',');
           for (var i=0; i<copyidxs.length; i++) {
               if (document.getElementById('copy_'+copyidxs[i])) {
                   var item = document.getElementById('copy_'+copyidxs[i]);
                   if (value == 1) {
                       item.className = 'LC_docs_copy';
                   } else {
                       item.className = 'LC_hidden';
                   }
               }
           }
       }
       return;
   }
   
 ENDNEWSCRIPT  ENDNEWSCRIPT
 }  }
   
Line 4664  ENDINJECT Line 6652  ENDINJECT
 sub dump_switchserver_js {  sub dump_switchserver_js {
     my @hosts = @_;      my @hosts = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         dump => 'Dumping to Authoring Space requires switching server.',          dump => 'Copying Content to Authoring Space requires switching server.',
         swit => 'Switch server?',          swit => 'Switch server?',
         duco => 'Dump content to Authoring Space',          duco => 'Copying 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 4813  Return hash with valid author names Line 6801  Return hash with valid author names
   
 =item do_paste_from_buffer()  =item do_paste_from_buffer()
   
   =item do_buffer_empty() 
   
   =item clear_from_buffer()
   
 =item get_newmap_url()  =item get_newmap_url()
   
 =item dbcopy()  =item dbcopy()
Line 4821  Return hash with valid author names Line 6813  Return hash with valid author names
   
 =item contained_map_check()  =item contained_map_check()
   
 =item reinit_role()  
   
 =item url_paste_fixups()  =item url_paste_fixups()
   
 =item apply_fixups()  =item apply_fixups()

Removed from v.1.484.2.19  
changed lines
  Added in v.1.572


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