Diff for /loncom/interface/londocs.pm between versions 1.484.2.62 and 1.516

version 1.484.2.62, 2016/08/05 22:19:42 version 1.516, 2012/12/02 18:44:04
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;
 use File::MMagic;  
 use Apache::lonlocal;  use Apache::lonlocal;
 use Cwd;  use Cwd;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
Line 59  my $hashtied; Line 57  my $hashtied;
 my %alreadyseen=();  my %alreadyseen=();
   
 my $hadchanges;  my $hadchanges;
 my $suppchanges;  
   
   
 my %help=();  my %help=();
Line 83  sub storemap { Line 80  sub storemap {
       $map,1,$report);        $map,1,$report);
     if ($errtext) { return ($errtext,2); }      if ($errtext) { return ($errtext,2); }
   
     if ($map =~ /^default/) {      $hadchanges=1;
         $hadchanges=1;  
     } else {  
         $suppchanges=1;  
     }  
     return ($errtext,0);      return ($errtext,0);
 }  }
   
Line 144  sub clean { Line 137  sub clean {
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my ($starthash,$js);      $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n".
     unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {                &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n");
         $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 180  ENDJS Line 153  ENDJS
             $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 ($navmap,$errormsg) =   my %replacehash=();
             &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');   foreach my $key (keys(%env)) {
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      if ($key=~/^form\.namefor\_(.+)/) {
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};   $replacehash{$1}=$env{$key};
         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;
         my $mm = new File::MMagic;   foreach my $item (keys(%replacehash)) {
         my $prefix = "/uploaded/$cdom/$cnum/";      my $newfilename=$title.'/'.$replacehash{$item};
         %replacehash = %tocopy;      $newfilename=~s/\.(\w+)$//;
         foreach my $item (sort(keys(%simpleproblems))) {      my $ext=$1;
             my $content = &Apache::imsexport::simpleproblem($simpleproblems{$item}{'symb'});      $newfilename=&clean($newfilename);
             $newcontent{$display{$item}} = $content;      $newfilename.='.'.$ext;
         }      my @dirs=split(/\//,$newfilename);
         my $gateway = Apache::lonhtmlgateway->new('web');      my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";
         foreach my $item (sort(keys(%simplepages))) {      my $makepath=$path;
             if (ref($simplepages{$item}) eq 'HASH') {      my $fail=0;
                 my $pagetitle = $simplepages{$item}{'title'};      for (my $i=0;$i<$#dirs;$i++) {
                 my %fields = &Apache::lonnet::dump($simplepages{$item}{'db'},$cdom,$cnum);   $makepath.='/'.$dirs[$i];
                 my %contents;   unless (-e $makepath) {
                 foreach my $field (keys(%fields)) {      unless(mkdir($makepath,0777)) { $fail=1; }
                     if ($field =~ /^(?:aaa|bbb|ccc)_(\w+)$/) {   }
                         my $name = $1;      }
                         my $msg = $fields{$field};      $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ');
                         if ($name eq 'webreferences') {      if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
                             if ($msg =~ m{^https?://}) {   if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
                                 $contents{$name} = '<a href="'.$msg.'"><tt>'.$msg.'</tt></a>';      print $fh &Apache::lonclonecourse::rewritefile(
                             }           &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),
                         } else {       (%replacehash,$crs => '')
                             $msg = &Encode::decode('utf8',$msg);      );
                             $msg = $gateway->process_outgoing_html($msg,1);   } else {
                             $contents{$name} = $msg;      print $fh
                         }           &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);
                     } elsif ($field eq 'uploaded.photourl') {         }
                         my $marker = $simplepages{$item}{marker};   $fh->close();
                         if ($fields{$field} =~ m{^\Q$prefix\E(simplepage/$marker/.+)$}) {      } else {
                             my $filepath = $1;   $fail=1;
                             my ($relpath,$fname) = ($filepath =~ m{^(.+/)([^/]+)$});      }
                             if ($fname ne '') {      if ($fail) {
                                 $fname=~s/\.(\w+)$//;   $r->print('<span class="LC_error">'.&mt('fail').'</span>');
                                 my $ext=$1;      } else {
                                 $fname = &clean($fname);   $r->print('<span class="LC_success">'.&mt('ok').'</span>');
                                 $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">'.&mt('Content').'</h4>'.  
 $contents{content}.'  
 </div>';  
                 }  
                 if ($contents{webreferences}) {  
                     $content .= '  
 <div class="LC_Box">  
 <h4 class="LC_hcell">'.&mt('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 {
         my ($navmap,$errormsg) =          $r->print(&mt('Searching ...').'<br />');
             &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');          $r->rflush();
         if (!ref($navmap)) {  # Input form
             $r->print($errormsg);          $r->print('<form name="dumpdoc" action="" method="post">'."\n");
         } else {   unless ($home==1) {
             $r->print('<div id="searching">'.&mt('Searching ...').'</div>');      $r->print('<div class="LC_left_float">'.
             $r->rflush();        '<fieldset><legend>'.
             my ($preamble,$formname);                        &mt('Select the Authoring Space').
             $formname = 'dumpdoc';                        '</legend><select name="authorspace">');
             unless ($home==1) {   }
                 $preamble = '<div class="LC_left_float">'.   foreach my $key (sort(keys(%outhash))) {
                             '<fieldset><legend>'.      if ($key=~/^home_(.+)$/) {
                             &mt('Select the Authoring Space').   if ($home==1) {
                             '</legend><select name="authorspace">';      $r->print(
             }    '<input type="hidden" name="authorspace" value="'.$1.'" />');
             my @orderspaces = ();   } else {
             foreach my $key (sort(keys(%outhash))) {      $r->print('<option value="'.$1.'">'.$1.' - '.
                 if ($key=~/^home_(.+)$/) {        &Apache::loncommon::plainname(split(/\:/,$1)).'</option>');
                     if ($1 eq $env{'user.name'}.':'.$env{'user.domain'}) {   }
                         unshift(@orderspaces,$1);      }
                     } else {   }
                         push(@orderspaces,$1);   unless ($home==1) {
                     }      $r->print('</select></fieldset></div>'."\n");
                 }   }
             }   my $title=$origcrsdata{'description'};
             if ($home>1) {   $title=~s/[\/\s]+/\_/gs;
                 $preamble .= '<option value="" selected="selected">'.&mt('Select').'</option>';   $title=&clean($title);
             }   $r->print('<div class="LC_left_float">'.
             foreach my $user (@orderspaces) {                    '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                 if ($home==1) {                    '<input type="text" size="50" name="authorfolder" value="'.
                     $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />';                    $title.'" />'.
                 } else {                    '</fieldset></div><br clear="all" />'."\n");
                     $preamble .= '<option value="'.$user.'">'.$user.' - '.   &tiehash();
                                  &Apache::loncommon::plainname(split(/\:/,$user)).'</option>';   $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>'
                 }                   .&Apache::loncommon::start_data_table()
             }                   .&Apache::loncommon::start_data_table_header_row()
             unless ($home==1) {                   .'<th>'.&mt('Internal Filename').'</th>'
                 $preamble .= '</select></fieldset></div>'."\n";                   .'<th>'.&mt('Title').'</th>'
             }                   .'<th>'.&mt('Save as ...').'</th>'
             my $title=$origcrsdata{'description'};                   .&Apache::loncommon::end_data_table_header_row());
             $title=~s/[\/\s]+/\_/gs;   foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
             $title=&clean($title);      $r->print(&Apache::loncommon::start_data_table_row()
             $preamble .= '<div class="LC_left_float">'.                       .'<td>'.$file.'</td>');
                          '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.      my ($ext)=($file=~/\.(\w+)$/);
                          '<input type="text" size="50" name="authorfolder" value="'.      my $title=$hash{'title_'.$hash{
                          $title.'" />'.   'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};
                          '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";      $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
             my %uploadedfiles;      if (!$title) {
             &tiehash();   $title=$file;
             foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {      } else {
                 my ($ext)=($file=~/\.(\w+)$/);   $title=~s|/|_|g;
 # FIXME Check supplemental here      }
                 my $title=$hash{'title_'.$hash{      $title=~s/\.(\w+)$//;
                                 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};      $title=&clean($title);
                 if (!$title) {      $title.='.'.$ext;
                     $title=$file;      $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"
                 } else {                       .&Apache::loncommon::end_data_table_row());
                     $title=~s|/|_|g;   }
                 }   $r->print(&Apache::loncommon::end_data_table());
                 $title=~s/\.(\w+)$//;   &untiehash();
                 $title=&clean($title);   $r->print(
                 $title.='.'.$ext;    '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>');
 #           $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 606  sub group_import { Line 288  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 615  sub group_import { Line 297  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 640  sub group_import { Line 304  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'));
  }   }
     }      }
     if ($importuploaded) {      return &storemap($coursenum, $coursedom, $folder.'.'.$container,1);
         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 807  sub docs_change_log { Line 391  sub docs_change_log {
     my %orderhash;      my %orderhash;
     my $container='sequence';      my $container='sequence';
     my $pathitem;      my $pathitem;
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.pagepath'}) {
         $container='page';          $container='page';
           $pathitem = '<input type="hidden" name="pagepath" value="'.
                       &HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />';
       } else {
           my $folderpath=$env{'form.folderpath'};
           if ($folderpath eq '') {
               $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents'));
           }
           $pathitem = '<input type="hidden" name="folderpath" value="'.
                       &HTML::Entities::encode($folderpath,'<>&"').'" />';
     }      }
     my $folderpath=$env{'form.folderpath'};  
     if ($folderpath eq '') {  
         $folderpath = 'default&'.&escape(&mt('Main Content').':::::');  
     }  
     $pathitem = '<input type="hidden" name="folderpath" value="'.  
                 &HTML::Entities::encode($folderpath,'<>&"').'" />';  
     my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";      my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
     my $jumpto = $readfile;      my $jumpto = $readfile;
     $jumpto =~ s{^/}{};      $jumpto =~ s{^/}{};
Line 977  sub docs_change_log { Line 564  sub docs_change_log {
   
 sub update_paste_buffer {  sub update_paste_buffer {
     my ($coursenum,$coursedom,$folder) = @_;      my ($coursenum,$coursedom,$folder) = @_;
     my (@possibles,%removals,%cuts,$output);  
     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 (@possibles == 0);      return if (!defined($env{'form.markcopy'}));
     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);  
   
     my %curr_groups = &Apache::longroup::coursegroups();  
   
 # Retrieve current paste buffer suffixes.      return if ($fatal);
     my @currpaste = split(/,/,$env{'docs.markedcopies'});  
     my (%pasteurls,@newpaste);  
   
 # Construct identifiers for current contents of user's paste buffer  
     if (@currpaste) {  
         foreach my $suffix (@currpaste) {  
              my $cid = $env{'docs.markedcopy_crs_'.$suffix};  
              my $url = $env{'docs.markedcopy_url_'.$suffix};  
              if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&  
                  ($url ne '')) {  
                  $pasteurls{$cid.'_'.$url} = 1;  
              }  
         }  
     }  
   
 # Mark items for copying (skip any items already in user's paste buffer)  # Mark for copying
     my %addtoenv;      my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
                         if (&is_supplemental_title($title)) {
     foreach my $item (@possibles) {          &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});
         my ($orderidx,$cmd) = split(/:/,$item);   ($title) = &Apache::loncommon::parse_supplemental_title($title);
         next if ($orderidx =~ /\D/);      } elsif ($env{'docs.markedcopy_supplemental'}) {
         next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove'));          &Apache::lonnet::delenv('docs.markedcopy_supplemental');
         my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]);      }
         my %denied = &action_restrictions($coursenum,$coursedom,      $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
                                           &LONCAPA::map::qtescape($url),  
                                           $env{'form.folderpath'},\%curr_groups);      (my $cmd,undef)=split('_',$env{'form.cmd'});
         next if ($denied{'copy'});  
         $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      my %addtoenv = (
         next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));                      'docs.markedcopy_title' => $title,
         my ($suffix,$errortxt,$locknotfreed) =                      'docs.markedcopy_url'   => $url,
             &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');                      'docs.markedcopy_cmd'   => $cmd,
         if ($suffix ne '') {                     );
             push(@newpaste,$suffix);      &Apache::lonnet::delenv('docs.markedcopy_nested');
         } else {      &Apache::lonnet::delenv('docs.markedcopy_nestednames');
             if ($locknotfreed) {      if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {
                 return $locknotfreed;          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'} = $nested;
             }              }
         }              if ($nestednames ne '') {
         if (&is_supplemental_title($title)) {                  $addtoenv{'docs.markedcopy_nestednames'} = $nestednames;
             &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 ($locknotfreed) {  
             $output = $locknotfreed;  
             last;  
         }  
     }  
     if (@newpaste) {  
         $addtoenv{'docs.markedcopies'} = join(',',(@currpaste,@newpaste));  
     }      }
     &Apache::lonnet::appenv(\%addtoenv);      &Apache::lonnet::appenv(\%addtoenv);
     delete($env{'form.markcopy'});      delete($env{'form.markcopy'});
     return $output;  
 }  }
   
 sub recurse_uploaded_maps {  sub recurse_uploaded_maps {
Line 1124  sub recurse_uploaded_maps { Line 646  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.markedcopies'}));      return if (!defined($env{'docs.markedcopy_url'}));
   
     unless (($env{'form.pastemarked'}) || ($env{'form.clearmarked'})) {      my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent);
         return if ($env{'docs.markedcopies'} eq '');      my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];
       if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {
           $is_external = 1;
     }      }
   
     my @currpaste = split(/,/,$env{'docs.markedcopies'});      my ($canpaste,$nopaste,$othercrs,$areachange,$is_uploaded_map);
     my ($pasteitems,@pasteable);      if ($folder =~ /^supplemental/) {
     my $clipboardcount = 0;          $canpaste = &supp_pasteable($env{'docs.markedcopy_url'});
           unless ($canpaste) {
 # Construct identifiers for current contents of user's paste buffer              $nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.');
     foreach my $suffix (@currpaste) {          } 
         next if ($suffix =~ /\D/);      } else {
         my $cid = $env{'docs.markedcopy_crs_'.$suffix};          $canpaste = 1;
         my $url = $env{'docs.markedcopy_url_'.$suffix};      }
         if (($cid =~ /^$match_domain\_$match_courseid$/) &&  
             ($url ne '')) {      if ($canpaste) {
             $clipboardcount ++;          if ($env{'docs.markedcopy_url'} =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
             my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,              my $srcdom = $1;
                 $canpaste,$nopaste,$othercrs,$areachange);              my $srcnum = $2;
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];              my $rem = $3;
             if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {              if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                 $is_external = 1;                  $othercourse = 1;
             }                  if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
             if ($folder =~ /^supplemental/) {                      if ($canpaste) {
                 $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});                          $othercrs = '<br />'.&mt('(from another course).');  
                 unless ($canpaste) {                      }
                     $nopaste = &mt('Paste into Supplemental Content unavailable.');                  } else {
                       $canpaste = 0;
                       $nopaste = &mt('Paste from another course unavailable.') 
                 }                  }
             } else {  
                 $canpaste = 1;  
             }              }
             if ($canpaste) {              if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {
                 if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {                  my $prefix = $1;
                     my $srcdom = $1;                  $parent = $2;
                     my $srcnum = $2;                  if ($folder !~ /^\Q$prefix\E/) {
                     my $rem = $3;                      $areachange = 1;
                     if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {                  }
                         $othercourse = 1;                  $is_uploaded_map = 1;
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {              }
                             if ($canpaste) {          }
                                 $othercrs = '<br />'.&mt('(from another course)');      }
                             }  
                         } else {      $r->print('<fieldset>'
                             $canpaste = 0;               .'<legend>'.&mt('Clipboard').'</legend>');
                             $nopaste = &mt('Paste from another course unavailable.');       my ($type,$buffer);
                         }      if ($is_external) {
                     }          $type = &mt('External Resource');
                     if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {          $buffer = $type.': '.
                         my $prefix = $1;                    &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
                         $parent = $2;                    &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';
                         if ($folder !~ /^\Q$prefix\E/) {      }  else {
                             $areachange = 1;          my $icon = &Apache::loncommon::icon($extension);
           if ($extension eq 'sequence' &&
               $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
               $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
               $icon .= '/navmap.folder.closed.gif';
           }
           $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
           $buffer = $icon.$type.': '.  &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}));
       }
       if ($canpaste) {
           $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);
           if (($is_uploaded_map) && (!$areachange)) {
               if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) {
                   $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.
                             '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.
                             &mt('Show Paste Options').'</a></span><br />'.
                             '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).
                             '<label>'.
                             '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.
                             &mt('Copy to new folder').'</label>'.('&nbsp;' x2).
                             '<label>'.   
                             '<input type="radio" name="docs.markedcopy_options" value="move" />'.
                             &mt('Move old folder').'</label><br />');
                   if ($env{'docs.markedcopy_nested'}) {
                       $r->print('<br />'.&mt('Folder to paste contains sub-folders').
                                 '<br /><table border="0">');
                       my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});
                       my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames'});
                       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_'.$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>';
                         }                          }
                         $is_uploaded_map = 1;  
                     }                      }
                       &recurse_print($r,$parent,\%deps,\%display);
                       $r->print('</table>');
                 }                  }
                   $r->print('</div>');
             }              }
             if ($canpaste) {  
                push(@pasteable,$suffix);  
             }  
             my $buffer;  
             if ($is_external) {  
                 $buffer = &mt('External Resource').': '.  
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.  
                     &LONCAPA::map::qtescape($url).')';  
             } else {  
                 my $icon = &Apache::loncommon::icon($extension);  
                 if ($extension eq 'sequence' &&  
                     $url =~ m{/default_\d+\.sequence$}x) {  
                     $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));  
                     $icon .= '/navmap.folder.closed.gif';  
                 }  
                 my $title = $env{'docs.markedcopy_title_'.$suffix};  
                 if ($title eq '') {  
                     ($title) = ($url =~ m{/([^/]+)$});  
                 }  
                 $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'.  
                           ': '.  
                           &Apache::loncommon::parse_supplemental_title(  
                              &LONCAPA::map::qtescape($title));  
             }  
             $pasteitems .= '<div class="LC_left_float">';  
             my ($options,$onclick);  
             if (($canpaste) && (!$areachange) && (!$othercourse) &&  
                 ($env{'docs.markedcopy_cmd_'.$suffix} eq 'cut')) {  
                 if (($is_uploaded_map) ||  
                     ($url =~ /(bulletinboard|smppg)$/) ||  
                     ($url =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {  
                     $options = &paste_options($suffix,$is_uploaded_map,$parent);  
                     $onclick= 'onclick="showOptions(this,'."'$suffix'".');" ';  
                 }  
             }  
             $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';  
             if ($nopaste) {  
                  $pasteitems .= $nopaste;     
             } else {  
                 if ($othercrs) {  
                     $pasteitems .= $othercrs;  
                 }  
                 if ($options) {  
                     $pasteitems .= $options;  
                 }  
             }  
             $pasteitems .= '</div>';  
         }          }
     }          $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs);
     if ($pasteitems eq '') {          if ($container eq 'page') {
         &Apache::lonnet::delenv('docs.markedcopies');              $r->print('
     }          <input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />
     my ($pasteform,$form_start,$buttons,$form_end);          <input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />
     if ($pasteitems) {  ');
         $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>';          } else {
         $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post" onsubmit="return validateClipboard();">';              $r->print('
         if (@pasteable) {          <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
             my $value = &mt('Paste to current folder');  ');
             if ($container eq 'page') {  
                 $value = &mt('Paste to current page');  
             }  
             $buttons = '<input type="submit" name="pastemarked" value="'.$value.'" />'.('&nbsp;'x2);  
         }  
         $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.('&nbsp;'x2);  
         if ($clipboardcount > 1) {  
             $buttons .=  
                 '<span style="text-decoration:line-through">'.('&nbsp;'x20).'</span>'.('&nbsp;'x2).  
                 '<input type="button" name="checkallclip" value="'.&mt('Check all').'" style="height:20px;" onclick="checkClipboard();" />'.  
                 ('&nbsp;'x2).  
                 '<input type="button" name="uncheckallclip" value="'.&mt('Uncheck all').'" style="height:20px;" onclick="uncheckClipboard();" />'.  
                 ('&nbsp;'x2);  
         }          }
         $form_end = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'.          $r->print('</form>');
                     '</form>';  
     } else {  
         $pasteitems = &mt('Clipboard is empty');  
     }  
     $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 {      } else {
         $copytext = &mt('Copy to new file');          $r->print(&mt('Paste buffer contains:').' '.$buffer.
         $movetext = &mt('Move');                    '<br /><p class="LC_info">'.$nopaste.'</p>');
     }      }
     my $output = '<br />'.      $r->print('</fieldset>');
                  '<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 ($outputref,$dir,$deps,$display) = @_;      my ($r,$dir,$deps,$display) = @_;
     $$outputref .= $display->{$dir}."\n";      $r->print($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($outputref,$subdir,$deps,$display);              &recurse_print($r,$subdir,$deps,$display);
         }          }
     }      }
 }  }
Line 1353  sub supp_pasteable { Line 802  sub supp_pasteable {
 }  }
   
 sub paste_popup_js {  sub paste_popup_js {
     my %html_js_lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           show => 'Show Options',                                            show => 'Show Paste Options',
                                           hide => 'Hide Options',                                            hide => 'Hide Paste Options',
                                         );                                          );
     my %js_lt = &Apache::lonlocal::texthash(  
                                           none => 'No items selected from clipboard.',  
                                         );  
     &html_escape(\%html_js_lt);  
     &js_escape(\%html_js_lt);  
     &js_escape(\%js_lt);  
     return <<"END";      return <<"END";
   
 function showPasteOptions(suffix) {  function showPasteOptions() {
     document.getElementById('pasteoptions_'+suffix).style.display='block';      document.getElementById('pasteoptions').style.display='block';
     document.getElementById('pasteoptionstext_'+suffix).innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:hidePasteOptions(\\''+suffix+'\\');" class="LC_menubuttons_link">$html_js_lt{'hide'}</a>';      document.getElementById('pasteoptions').style.textAlign='left';
     return;      document.getElementById('pasteoptions').style.textFace='normal';
 }      document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:hidePasteOptions();" class="LC_menubuttons_link">$lt{'hide'}</a><br />';
   
 function hidePasteOptions(suffix) {  
     document.getElementById('pasteoptions_'+suffix).style.display='none';  
     document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$html_js_lt{'show'}</a>';  
     return;      return;
 }  }
   
 function showOptions(caller,suffix) {  function hidePasteOptions() {
     if (document.getElementById('pasteoptionstext_'+suffix)) {      document.getElementById('pasteoptions').style.display='none';
         if (caller.checked) {      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">$html_js_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("$js_lt{'none'}");  
         return false;  
     }  
 }  
   
 function checkClipboard() {  
     if (document.pasteform.pasting.length > 1) {  
         for (var i=0; i<document.pasteform.pasting.length; i++) {  
             document.pasteform.pasting[i].checked = true;  
         }  
     }  
     return;  
 }  
   
 function uncheckClipboard() {  
     if (document.pasteform.pasting.length >1) {  
         for (var i=0; i<document.pasteform.pasting.length; i++) {  
             document.pasteform.pasting[i].checked = false;  
         }  
     }  
     return;      return;
 }  }
   
Line 1436  END Line 826  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 (@currpaste == 0) {      if (!$env{'form.pastemarked'}) {
         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);  
     }      }
   
 # Early out if nothing available to paste  
     if (@topaste == 0) {  
         return();  
     }  
   
     my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,  
         %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult);  
   
     foreach my $suffix (@topaste) {  
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});  
 # Supplemental content may only include certain types of content  # Supplemental content may only include certain types of content
 # Early out if pasted content is not supported in Supplemental area  # Early out if pasted content is not supported in Supplemental area
         if ($folder =~ /^supplemental/) {      if ($folder =~ /^supplemental/) {
             unless (&supp_pasteable($url)) {          unless (&supp_pasteable($env{'docs.markedcopy_url'})) {
                 $notinsupp{$suffix} = 1;              return (&mt('Paste failed: content type is not supported within Supplemental Content'));
                 next;  
             }  
         }          }
         if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) {      }
             my $srcd = $1;  
             my $srcn = $2;  # Prepare to paste resource at end of list
       my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
       my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
   
       my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove);
       if ($url=~/\.(page|sequence)$/) {
           $is_map = 1; 
       }
       if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) {
           $srcdom = $1;
           $srcnum = $2;
           my $oldprefix = $3;
 # 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 (($srcd ne $coursedom) || ($srcn ne $coursenum)) {          if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                 unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {              unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                     $notincrs{$suffix} = 1;                  return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.'));
                     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{$suffix} = 'docstosupp';              $prefixchg = 1;
             } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {              %before = ( map => 'default',
                 $prefixchg{$suffix} = 'supptodocs';                          doc => 'docs');
             }              %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.
             if ($env{'docs.markedcopy_nested_'.$suffix}) {          my @nested;
                 my @nested;          if ($env{'docs.markedcopy_nested'}) {
                 my ($type) = ($oldprefix =~ /^(default|supplemental)/);              my ($type) = ($oldprefix =~ /^(default|supplemental)/);
                 my @items = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});              my @items = split(/\&/,$env{'docs.markedcopy_nested'});
                 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) {              }
                     if ($env{'form.docs.markedcopy_'.$suffix.'_'.$item} eq 'move') {              foreach my $item (@nested) {
                         push(@{$marktomove{$suffix}},$type.'_'.$item);                  if ($env{'form.docs.markedcopy_'.$item} eq 'move') {
                     }                      $tomove{$type.'_'.$item} = 1;
                 }                  }
             }              }
         }          }
     }      }
   
 # Early out if nothing available to paste  # Maps need to be copied first
     if (@dopaste == 0) {      my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
         return ();          %dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls);
     }      $oldurl = $url;
       if ($is_map) {
 # Populate message hash and hashes used for main content <=> supplemental content          if ($folder =~ /^default/) {
 # changes                  my $lastchange = &Apache::lonnet::get_coursechange($coursedom,$coursenum);
               if ($lastchange > $env{'request.course.tied'}) {
     %msgs = &Apache::lonlocal::texthash (                  &reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"}); 
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',              }
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',          }
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',  # If pasting a map, check if map contains other maps
             );          my (%allmaps,%hierarchy,%titles);
           if ($folder =~ /^default/) {
     %before = (              my $navmap = Apache::lonnavmaps::navmap->new();
                  docstosupp => {              if (defined($navmap)) {
                                    map => 'default',                  foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) {
                                    doc => 'docs',                      $allmaps{$res->src()} = 1;
                                },                  }
                  supptodocs => {              }
                                    map => 'supplemental',          }
                                    doc => 'supplemental',          &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                                },                               \%addedmaps,\%hierarchy,\%titles,\%allmaps);
               );          if ($url=~ m{^/uploaded/}) {
               my $newurl;
     %after = (              unless ($env{'form.docs.markedcopy_options'} eq 'move') {
                  docstosupp => {                  ($newurl,my $error) = 
                                    map => 'supplemental',                      &get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum,
                                    doc => 'supplemental'                                      $srcdom,$srcnum,\$title,\%allmaps,\%newurls);
                                },                  if ($error) {
                  supptodocs => {                      return ($error);
                                    map => 'default',                  }
                                    doc => 'docs',                  if ($newurl ne '') {
                                },                      if ($newurl ne $url) {
              );                          if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {
                               $newsubdir{$url} = $1;
 # Retrieve information about all course maps in main content area                           }
                           $mapchanges{$url} = 1;
     my $allmaps = {};                      }
     if ($folder =~ /^default/) {                  }
         $allmaps =              }
             &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,              if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) ||
                                                  $env{"course.$env{'request.course.id'}.home"},                  (($newurl ne '') && ($newurl ne $url))) {
                                                  $env{'request.course.id'});                  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);
   
     my (@toclear,%mapurls,%lockerrs,%msgerrs,%results);  # 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.
   
 # Loop over the items to paste      my $newidx;
     foreach my $suffix (@dopaste) {      unless ($is_map) {
 # Maps need to be copied first  # Now insert the URL at the bottom
         my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,          $newidx = &LONCAPA::map::getresidx($url);
             %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir,          if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
             %newurls,%tomove);              my $relpath = $1;
         if (ref($marktomove{$suffix}) eq 'ARRAY') {              if ($relpath ne '') {
             map { $tomove{$_} = 1; } @{$marktomove{$suffix}};                  my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
         }                  my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});                  my $newprefix = $newloc;
         my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});                  if ($newloc eq 'default') {
         my $oldurl = $url;                      $newprefix = 'docs';
         if ($is_map{$suffix}) {                  }
 # If pasting a map, check if map contains other maps                  if ($newdocsdir eq '') {
             my (%hierarchy,%titles);                      $newdocsdir = 'default';
             &contained_map_check($url,$folder,\%removefrommap,\%removeparam,                  }
                                  \%addedmaps,\%hierarchy,\%titles,$allmaps);                  if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
             if ($url=~ m{^/uploaded/}) {                      my $newpath = "$newprefix/$newdocsdir/$newidx/$rem";
                 my $newurl;                      $url =
                 unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {                          &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
                     ($newurl,my $error) =                                                              &Apache::lonnet::getfile($oldurl));
                         &get_newmap_url($url,$folder,$prefixchg{$suffix},$coursedom,                      if ($url eq '/adm/notfound.html') {
                                         $coursenum,$srcdom{$suffix},$srcnum{$suffix},                          return (&mt('Paste failed: an error occurred saving the file.'));
                                         \$title,$allmaps,\%newurls);                      } else {
                     if ($error) {                          my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
                         $allerrors{$suffix} = $error;                          $newsubpath =~ s{/+$}{/};
                         next;                          $docmoves{$oldurl} = $newsubpath;
                     }  
                     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)$}) {      }
             my $prefix = $1;  # Apply any changes to maps, or copy dependencies for uploaded HTML pages 
             #need to copy the db contents to a new one, unless this is a move.      my ($result,$save_err);
             my %info = (      $result =
                          src  => $url,          &apply_fixups($folder,$is_map,$prefixchg,$coursedom,$coursenum,$oldurl,
                          cdom => $coursedom,                        $url,\%removefrommap,\%removeparam,\%rewrites,\%retitles,
                          cnum => $coursenum,                        \%copies,\%dbcopies,\%zombies,\%params,\%docmoves,
             );                        \%mapmoves,\%newsubdir,$errors,\%before,\%after);
             unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {      if ($result eq 'ok') {
                 my (%lockerr,$msg);           if ($is_map) { 
                 my ($newurl,$result,$errtext) =              my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
                     &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);                                              $folder.'.'.$container);
                 if ($result eq 'ok') {              return $errtext if ($fatal);
                     $url = $newurl;  
                     $title=&mt('Copy of').' '.$title;              if ($#LONCAPA::map::order<1) {
                 } else {                  my $idx=&LONCAPA::map::getresidx();
                     if ($prefix eq 'smppg') {                  if ($idx<=0) { $idx=1; }
                         $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;                  $LONCAPA::map::order[0]=$idx;
                     } elsif ($prefix eq 'bulletinboard') {                  $LONCAPA::map::resources[$idx]='';
                         $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);
         }          }
         $title = &LONCAPA::map::qtunescape($title);          if ($env{'docs.markedcopy_supplemental'}) {
         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_'.$suffix});                      &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'});
             }              }
         } else {          } else {
             if ($folder=~/^supplemental/) {              if ($folder=~/^supplemental/) {
Line 1696  sub do_paste_from_buffer { Line 1056  sub do_paste_from_buffer {
                        $env{'user.domain'}.'___&&&___'.$title;                         $env{'user.domain'}.'___&&&___'.$title;
             }              }
         }          }
           $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
 # For uploaded files (excluding pages/sequences) path in copied file is changed          push(@LONCAPA::map::order, $newidx);
 # 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);     
     my $msgsarray;      if ($env{'form.docs.markedcopy_options'} eq 'move') {
     foreach my $suffix (keys(%msgs)) {          &Apache::lonnet::delenv('docs.markedcopy');
          if (ref($msgs{$suffix}) eq 'ARRAY') {          &Apache::lonnet::delenv('docs.markedcopy_nested');
              $msgsarray .= join(',',@{$msgs{$suffix}});          &Apache::lonnet::delenv('docs.markedcopy_nestednames');
          }  
     }  
     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;      return ($result,$save_err);
 }  
   
 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 1918  sub get_newmap_url { Line 1136  sub get_newmap_url {
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;      my ($url,$coursedom,$coursenum) = @_;
     my ($url,$result,$errtext);      if ($url=~ m{/smppg$}) {
     $url = $dbref->{'src'};          my $db_name = &Apache::lonsimplepage::get_db_name($url);
     if (ref($dbref) eq 'HASH') {          if ($db_name =~ /^smppage_/) {
         if ($url =~ m{/(smppg|bulletinboard)$}) {              #simple pages, need to copy the db contents to a new one.
             my $prefix = $1;              my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum);
             if (($dbref->{'cdom'} =~ /^$match_domain$/) &&              my $now = time();
                 ($dbref->{'cnum'} =~ /^$match_courseid$/)) {              $db_name =~ s{_\d*$ }{_$now}x;
                 my $db_name;              my $result=&Apache::lonnet::put($db_name,\%contents,
                 my $marker = (split(m{/},$url))[4];                                              $coursedom,$coursenum);
                 $marker=~s/\D//g;              $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
                 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,$result,$errtext);      return $url;
 }  }
   
 sub uniqueness_check {  sub uniqueness_check {
Line 2050  sub contained_map_check { Line 1190  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 2074  sub contained_map_check { Line 1214  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,$fromcdom,$fromcnum,$allmaps,      my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies,
         $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,          $dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_;
         $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 2104  sub url_paste_fixups { Line 1252  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}{$id} = $ressrc;                      $retitles->{$oldurl}{$ressrc} = $id;
                 }                  }
             }              }
             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}{$id} = $ressrc;                  $zombies->{$oldurl}{$ressrc} = $id;
                 $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 2122  sub url_paste_fixups { Line 1270  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,                          &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,
                                           $srcdom,$srcnum,$allmaps,$rewrites,                                            $rewrites,$retitles,$copies,$dbcopies,$zombies,
                                           $retitles,$copies,$dbcopies,$zombies,                                            $params,$mapmoves,$mapchanges,$tomove,$newsubdir,
                                           $params,$mapmoves,$mapchanges,$tomove,                                            $newurls);
                                           $newsubdir,$newurls);  
                         next;                          next;
                     } else {                      } else {
                         ($newurl,my $error) =                          ($newurl,my $error) =
Line 2144  sub url_paste_fixups { Line 1291  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}{$id} = $ressrc;                          $rewrites->{$oldurl}{$ressrc} = $id;
                         $mapchanges->{$ressrc} = 1;                          $mapchanges->{$ressrc} = 1;
                         unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,                          unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps,
                                                   $cnum,$srcdom,$srcnum,$allmaps,                                                    $rewrites,$retitles,$copies,$dbcopies,$zombies,
                                                   $rewrites,$retitles,$copies,$dbcopies,                                                    $params,$mapmoves,$mapchanges,$tomove,$newsubdir,
                                                   $zombies,$params,$mapmoves,$mapchanges,                                                    $newurls)) {
                                                   $tomove,$newsubdir,$newurls)) {  
                             $mapmoves->{$ressrc} = 1;                              $mapmoves->{$ressrc} = 1;
                         }                          }
                         $changed = 1;                          $changed = 1;
                     } else {                      } else {
                         $rewrites->{$oldurl}{$id} = $ressrc;                          $rewrites->{$oldurl}{$ressrc} = $id;
                         $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}{$id} = $ressrc;                      $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;  
                 }  
             } 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 2184  sub url_paste_fixups { Line 1320  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)) {
                     $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;                      $rewrites->{$oldurl}{$ressrc} = $id;
                     $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;                      $dbcopies->{$oldurl}{$ressrc} = $id;
                     $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;  
                     $changed = 1;                      $changed = 1;
                 }                  }
             }              }
Line 2206  sub url_paste_fixups { Line 1341  sub url_paste_fixups {
 }  }
   
 sub apply_fixups {  sub apply_fixups {
     my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg,      my ($folder,$is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap,
         $oldurl,$url,$caller) = @_;          $removeparam,$rewrites,$retitles,$copies,$dbcopies,$zombies,$params,
     my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,          $docmoves,$mapmoves,$newsubdir,$errors,$before,$after) = @_;
         %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,      foreach my $key (keys(%{$copies}),keys(%{$docmoves})) {
         %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 (exists($copies{$key})) {          if (ref($copies->{$key}) eq 'HASH') {
             if (ref($copies{$key}) eq 'HASH') {              my %added;
                 my %added;              foreach my $innerkey (keys(%{$copies->{$key}})) {
                 foreach my $innerkey (keys(%{$copies{$key}})) {                  if (($innerkey ne '') && (!$added{$innerkey})) {
                     if (($innerkey ne '') && (!$added{$innerkey})) {                      push(@allcopies,$innerkey);
                         push(@allcopies,$innerkey);                      $added{$innerkey} = 1;
                         $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 2285  sub apply_fixups { Line 1371  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) && (exists($docmoves{$key}))) {                          if (($key eq $oldurl) && (ref($docmoves) eq 'HASH') && (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 && $before{'doc'} && $after{'doc'}) {                              if ($prefixchg) {
                                 $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 2302  sub apply_fixups { Line 1388  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 (exists($docmoves{$oldurl})) {                              if ((ref($docmoves) eq 'HASH') && (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 2313  sub apply_fixups { Line 1399  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 && $before{'map'} && $after{'map'}) {          if ($prefixchg) {
             $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 2340  sub apply_fixups { Line 1426  sub apply_fixups {
     }      }
     my %updates;      my %updates;
     if ($is_map) {      if ($is_map) {
         if (ref($updated) eq 'HASH') {          foreach my $key (keys(%{$rewrites})) {
             foreach my $type (keys(%{$updated})) {              $updates{$key} = 1;
                 if (ref($updated->{$type}) eq 'HASH') {          }
                     foreach my $key (keys(%{$updated->{$type}})) {          foreach my $key (keys(%{$zombies})) {
                         $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') {              if (ref($retitles->{$key}) eq 'HASH') {
                 %toretitle = %{$retitles{$key}};                  %toretitle = %{$retitles->{$key}};
             }              }
             if (ref($removefrommap{$key}) eq 'HASH') {              if (ref($removefrommap->{$key}) eq 'HASH') {
                 %toremove = %{$removefrommap{$key}};                  %toremove = %{$removefrommap->{$key}};
             }              }
             if (ref($removeparam{$key}) eq 'HASH') {              if (ref($removeparam->{$key}) eq 'HASH') {
                 %remparam = %{$removeparam{$key}};                  %remparam = %{$removeparam->{$key}};
             }              }
             if (ref($zombies{$key}) eq 'HASH') {              if (ref($zombies->{$key}) eq 'HASH') {
                 %zombie = %{$zombies{$key}};                  %zombie = %{$zombies->{$key}};
             }              }
             if (ref($dbcopies{$key}) eq 'HASH') {              if (ref($dbcopies->{$key}) eq 'HASH') {
                 foreach my $idx (keys(%{$dbcopies{$key}})) {                  foreach my $item (keys(%{$dbcopies->{$key}})) {
                     if (ref($dbcopies{$key}{$idx}) eq 'HASH') {                      $newdb{$item} = &dbcopy($item);
                         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{$i} eq $src) {                      if ($zombie{$src} eq $i) {
                         undef($LONCAPA::map::zombies[$i]);                          undef($LONCAPA::map::zombies[$i]);
                     }                      }
                 }                  }
             }              }
             for (my $i=0; $i<@LONCAPA::map::order; $i++) {              for (my $i=0; $i<@LONCAPA::map::resources; $i++) {
                 my $idx = $LONCAPA::map::order[$i];                  if (defined($LONCAPA::map::resources[$i])) {
                 if (defined($LONCAPA::map::resources[$idx])) {  
                     my $changed;                      my $changed;
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$idx]);                      my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$i]);
                     if ((exists($toremove{$idx})) &&                       if ($toremove{$src} eq $i) {
                         ($toremove{$idx} eq &LONCAPA::map::qtescape($src))) {  
                         splice(@LONCAPA::map::order,$i,1);                          splice(@LONCAPA::map::order,$i,1);
                         if (ref($currparam{$idx}) eq 'ARRAY') {                          if (ref($currparam{$i}) eq 'ARRAY') {
                             foreach my $name (@{$currparam{$idx}}) {                              foreach my $name (@{$currparam{$i}}) {
                                 &LONCAPA::map::delparameter($idx,'parameter_'.$name);                                  &LONCAPA::map::delparameter($i,'parameter_'.$name);
                             }                              }
                         }                          }
                         next;                          next;
                     }                      }
                     my $origsrc = $src;                      my $origsrc = $src;
                     if ((exists($toretitle{$idx})) && ($toretitle{$idx} eq $src)) {                      if ((exists($toretitle{$src})) && ($toretitle{$src} eq $i)) {
                         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{$idx})) && ($torewrite{$idx} eq $src)) {                      if ((exists($torewrite{$src})) && ($torewrite{$src} eq $i)) {
                         $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 && $before{'map'} && $after{'map'}) {                              if ($prefixchg) {
                                 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 ($origsrc =~ /\.(page|sequence)$/) {                              if ($newsubdir->{$origsrc}) {
                                 if ($newsubdir{$origsrc}) {                                  if ($src =~ /\.(page|sequence)$/) {
                                     $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{$idx} ne '') {                      } elsif ($newdb{$src} ne '') {
                         $src = $newdb{$idx};                          $src = $newdb{$src};
                         $changed = 1;                          $changed = 1;
                     }                      }
                     if ($changed) {                      if ($changed) {
                         $LONCAPA::map::resources[$idx] = join(':',($title,&LONCAPA::map::qtunescape($src),$ext,$type));                          $LONCAPA::map::resources[$i] = join(':',($title,$src,$ext,$type));
                     }                      }
                 }                  }
             }              }
Line 2451  sub apply_fixups { Line 1535  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 2461  sub apply_fixups { Line 1542  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 && $before{'map'} && $after{'map'}) {                  if ($prefixchg) {
                     $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) {
                 if ($caller eq 'paste') {                  return &mt('Paste failed: an error occurred saving the folder or page.');
                     return (&mt('Paste failed: an error occurred saving the folder or page.'));  
                 }  
             }              }
         }          }
     }      }
     return ('ok',\@msgs,$lockmsg);      return 'ok';
 }  }
   
 sub copy_dependencies {  sub copy_dependencies {
Line 2546  my %parameter_type = ( 'randompick' Line 1625  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') {  
         my (@allidx,@allmapidx,%allchecked,%currchecked);      return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
         %allchecked = (  
                          'hiddenresource' => {},      my $which = $env{'form.changeparms'};
                          'encrypturl'     => {},      my $idx = $env{'form.setparms'};
                          'randompick'     => {},      if ($env{'form.'.$which.'_'.$idx}) {
                          'randomorder'    => {},   my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx}
                       );                                       : 'yes';
         foreach my $which (keys(%allchecked)) {   &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
             $env{'form.all'.$which} =~ s/,$//;        $parameter_type{$which});
             if ($which eq 'randompick') {   &remember_parms($idx,$which,'set',$value);
                 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 {
         my $haschanges = 0;   &LONCAPA::map::delparameter($idx,'parameter_'.$which);
         return $haschanges if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);  
   
         my $which = $env{'form.changeparms'};   &remember_parms($idx,$which,'del');
         my $idx = $env{'form.setparms'};  
         my $oldvalue = 0;  
         my $newvalue = 0;  
         my $current = (&LONCAPA::map::getparameter($idx,'parameter_'.$which))[0];  
         if ($which eq 'randompick') {  
             if ($current =~ /^(\d+)$/) {  
                 $oldvalue = $1;  
             }  
         } elsif ($current =~ /^yes$/i) {  
             $oldvalue = 1;  
         }  
         if ($env{'form.'.$which.'_'.$idx}) {  
             $newvalue = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx}  
                                                  : 1;  
         }  
         if ($oldvalue ne $newvalue) {  
             $haschanges = 1;  
             if ($newvalue) {  
                 my $storeval = 'yes';  
                 if ($which eq 'randompick') {  
                     $storeval = $newvalue;  
                 }  
                 &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $storeval,  
                                               $parameter_type{$which});  
                 &remember_parms($idx,$which,'set',$storeval);  
             } else {  
                 &LONCAPA::map::delparameter($idx,'parameter_'.$which);  
                 &remember_parms($idx,$which,'del');  
             }  
         }  
         return $haschanges;  
     }      }
     return;      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 'remove') {      if ($cmd eq 'del') {
  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 2689  sub handle_edit_cmd { Line 1674  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 2697  sub handle_edit_cmd { Line 1683  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 2707  sub handle_edit_cmd { Line 1692  sub handle_edit_cmd {
 sub editor {  sub editor {
     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,      my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,
         $supplementalflag,$orderhash,$iconpath,$pathitem)=@_;          $supplementalflag,$orderhash,$iconpath,$pathitem)=@_;
     my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container);      my $container= ($env{'form.pagepath'}) ? 'page'
                              : 'sequence';
       my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order);
     if ($allowed) {      if ($allowed) {
         (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,          (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
          $is_random_order,$container) =  
             &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1);              &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1);
         $r->print($breadcrumbtrail);          $r->print($breadcrumbtrail);
     } elsif ($env{'form.folderpath'} =~ /\:1$/) {  
         $container = 'page';   
     } else {  
         $container = 'sequence';  
     }      }
   
     my $jumpto;      my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
   
     unless ($supplementalflag) {  
         $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";  
     }  
   
     unless ($allowed) {      unless ($allowed) {
         $randompick = -1;          $randompick = -1;
Line 2748  sub editor { Line 1726  sub editor {
  &snapshotbefore();   &snapshotbefore();
   
  if (&update_parameter()) {   if (&update_parameter()) {
     ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,1);      ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
     return $errtext if ($fatal);      return $errtext if ($fatal);
  }   }
   
Line 2763  sub editor { Line 1741  sub editor {
   
  if ($env{'form.pastemarked'}) {   if ($env{'form.pastemarked'}) {
             my %paste_errors;              my %paste_errors;
             my ($paste_res,$save_error,$pastemsgarray,$lockerror) =              my ($paste_res,$save_error) =
                 &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,                  &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,
                                       \%paste_errors);                                        \%paste_errors);
             if (ref($pastemsgarray) eq 'ARRAY') {                  if ($save_error ne '') {
                 if (@{$pastemsgarray} > 0) {                      return $save_error; 
                     $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 class="LC_warning">'."\n".                  $r->print('<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 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 2800  sub editor { Line 1759  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'} =~ m{^(remove|cut)_}) {              if ($env{'form.cmd'} =~ /^(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 $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) = 
                             &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2);                              &newmap_suffix($1,$2,$coursedom,$coursenum);
                         if ($locknotfreed) {                          if ($locknotfreed) {
                             $r->print($locknotfreed);                              $r->print($locknotfreed);
                         }                          }
Line 2893  sub editor { Line 1789  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,my $fixuperrors) =      ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
                 &group_import($coursenum, $coursedom, $folder,$container,      $container,'londocs',@imports);
                               '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 2987  sub editor { Line 1851  sub editor {
         $r->print('</div>');          $r->print('</div>');
     }      }
   
     my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);      my ($to_show,$output);
     %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 3005  sub editor { Line 1860  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);
                               \%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;  
         if ($allowed || &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
             $toolslink = '<table><tr><td>'  
                        .&Apache::loncommon::help_open_menu('Navigation Screen',  
                                                            'Navigation_Screen',undef,'RAT')  
                        .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'  
                        .'<td align="left"><ul id="LC_toolbar">'  
                        .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '  
                        .'id="LC_content_toolbar_edittoplevel" '  
                        .'class="LC_toolbarItem" '  
                        .'title="'.&mt('Supplemental Content Editor').'">'  
                        .'</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 colspan="2">'.&mt('Actions').'</th>'                            .'<th>'.&mt('Actions').'</th>'
                           .'<th>'.&mt('Document').'</th>';                            .'<th colspan="2">'.&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()
                 if ($folder !~ /^supplemental/) {                             .$output.' '
                     $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();
             } else {              } else {
                 $to_show .= $toolslink                  $to_show = '<table><tr><td>'.&Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT')
                              .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'
                              .'<td align="left"><ul id="LC_toolbar">'
                              .'<li><a href="/adm/coursedocs?forcesupplement=1" '
                              .'id="LC_content_toolbar_edittoplevel" '
                              .'class="LC_toolbarItem" '
                              .'title="'.&mt('Supplemental Content Editor').'">'
                              .'</a></li></ul></td></tr></table><br />'
                            .&Apache::loncommon::start_data_table('LC_tableOfContent')                             .&Apache::loncommon::start_data_table('LC_tableOfContent')
                            .$output.' '                             .$output.' '
                            .&Apache::loncommon::end_data_table();                             .&Apache::loncommon::end_data_table();
             }              }
         } else {          } else {
             if (!$allowed) {  
                 $to_show .= $toolslink;  
             }  
             $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 empty')                         .&mt('Currently no documents.')
                        .'</div>'                         .'</div>'
                        .&Apache::loncommon::end_scrollbox();                         .&Apache::loncommon::end_scrollbox();
         }          }
Line 3109  sub editor { Line 1914  sub editor {
                       .'</div>';                        .'</div>';
         } else {          } else {
             $to_show = '<div class="LC_info" id="contentlist">'              $to_show = '<div class="LC_info" id="contentlist">'
                       .&mt('Currently empty')                        .&mt('Currently no documents.')
                       .'</div>'                        .'</div>'
         }          }
     }      }
Line 3119  sub editor { Line 1924  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,          $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto,
                                        $jumpto,$readfile,$need_save,"$folder.$container"));                                         $readfile));
         &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 3128  sub editor { Line 1933  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,$crstype) = @_;      my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
 # 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.coursecode'}) {  
         $quotatype = 'official';  
     } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.textbook'}) {  
         $quotatype = 'textbook';  
     }  
     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',$quotatype);  
         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 3233  sub process_file_upload { Line 1948  sub process_file_upload {
         my $errtext='';          my $errtext='';
         my $fatal=0;          my $fatal=0;
         my $container='sequence';          my $container='sequence';
         if ($env{'form.folderpath'} =~ /:1$/) {          if ($env{'form.pagepath'}) {
             $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 3251  sub process_file_upload { Line 1970  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 3316  sub process_file_upload { Line 2031  sub process_file_upload {
                     $$upload_output .= &mt('No embedded items identified').'<br />';                      $$upload_output .= &mt('No embedded items identified').'<br />';
                 }                  }
                 $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';                  $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';
             } elsif ((&Apache::loncommon::is_archive_file($mimetype)) &&              } elsif (&Apache::loncommon::is_archive_file($mimetype)) {
                      ($env{'form.uploaddoc.filename'} =~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/i)) {  
                 $nextphase = 'decompress_uploaded';                  $nextphase = 'decompress_uploaded';
                 my $position = scalar(@LONCAPA::map::order)-1;                  my $position = scalar(@LONCAPA::map::order)-1;
                 my $noextract = &return_to_editor();                  my $noextract = &return_to_editor();
                 my $archiveurl = &HTML::Entities::encode($url,'<>&"');                  my $archiveurl = &HTML::Entities::encode($url,'<>&"');
                 my %archiveitems = (                  my %archiveitems = (
                     folderpath => $env{'form.folderpath'},                      folderpath => $env{'form.folderpath'},
                       pagepath   => $env{'form.pagepath'},
                     cmd        => $nextphase,                      cmd        => $nextphase,
                     newidx     => $newidx,                      newidx     => $newidx,
                     position   => $position,                      position   => $position,
Line 3378  sub is_supplemental_title { Line 2093  sub is_supplemental_title {
   
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups)=@_;          $crstype,$pathitem,$supplementalflag)=@_;
     my ($foldertitle,$renametitle,$oldtitle);      my ($foldertitle,$pagetitle,$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);
    $pagetitle = $foldertitle;
     } else {      } else {
  $title=&HTML::Entities::encode($title,'"<>&\'');   $title=&HTML::Entities::encode($title,'"<>&\'');
  $renametitle=$title;   $renametitle=$title;
  $foldertitle=$title;   $foldertitle=$title;
    $pagetitle=$title;
     }      }
   
     my $orderidx=$LONCAPA::map::order[$index];      my $orderidx=$LONCAPA::map::order[$index];
   
     $renametitle=~s/\\/\\\\/g;      $renametitle=~s/\\/\\\\/g;
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/g;
     $renametitle=~s/"/%22/g;  
     $renametitle=~s/ /%20/g;      $renametitle=~s/ /%20/g;
     $oldtitle = $renametitle;  
     $renametitle=~s/\&#39\;/\\\'/g;  
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end,$form_common,$form_param);      my ($form_start,$form_end,$form_common);
 # Edit commands  # Edit commands
     my ($esc_path, $path, $symb);      my ($container, $type, $esc_path, $path, $symb);
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
    $type = 'folder';
           $container = 'sequence';
  $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'},'<>&"');
  # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');   # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
     }      }
       if ($env{'form.pagepath'}) {
           $type = $container = 'page';
           $esc_path=&escape($env{'form.pagepath'});
    $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
       }
     my $isexternal;      my $isexternal;
     if ($residx) {      if ($residx) {
         my $currurl = $url;          my $currurl = $url;
Line 3421  sub entryline { Line 2142  sub entryline {
                                                  &Apache::lonnet::declutter($currurl));                                                   &Apache::lonnet::declutter($currurl));
         }          }
     }      }
     my ($renamelink,%lt,$ishash);      my %lt;
     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 3475  END Line 2179  END
                 'ul' => 'URL',                  'ul' => 'URL',
                 'ti' => 'Title',                   'ti' => 'Title', 
                 );                  );
  my %denied = &action_restrictions($coursenum,$coursedom,$url,   my $nocopy=0;
                                           $env{'form.folderpath'},          my $nocut=0;
                                           $currgroups);          my $noremove=0;
         my ($copylink,$cutlink,$removelink);          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,$renamelink);
  my $skip_confirm = 0;   my $skip_confirm = 0;
  if ( $folder =~ /^supplemental/   if ( $folder =~ /^supplemental/
      || ($url =~ m{( /smppg$       || ($url =~ m{( /smppg$
Line 3491  END Line 2252  END
     $skip_confirm = 1;      $skip_confirm = 1;
  }   }
   
  if ($denied{'copy'}) {   if ($nocopy) {
             $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);
 <form name="$formname" method="post" action="/adm/coursedocs">  <a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$symb','$folder');" class="LC_docs_copy">$lt{'cp'}</a>
 $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 ($denied{'cut'}) {   if ($nocut) {
             $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);
 <form name="$formname" method="post" action="/adm/coursedocs">  <a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$symb','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a>
 $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 ($denied{'remove'}) {          if ($noremove) {
             $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);
 <form name="$formname" method="post" action="/adm/coursedocs">  <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
 $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);  
             }  
         }          }
         $renamelink=(<<ENDREN);          $renamelink=(<<ENDREN);
 <a href='javascript:changename("$esc_path","$index","$oldtitle");' class="LC_docs_rename">$lt{'rn'}</a>  <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' 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;folderpath=$esc_path&amp;symb=$symb'>    <a href='/adm/coursedocs?cmd=up_$index&amp;${type}path=$esc_path&amp;${type}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;folderpath=$esc_path&amp;symb=$symb'>    <a href='/adm/coursedocs?cmd=down_$index&amp;${type}path=$esc_path&amp;${type}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 LC_nobreak">  <td class="LC_docs_entry_commands"><span class="LC_nobreak">
 $removelink  $removelink
   $renamelink
 $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+)$/);
     my $uploaded=($url=~/^\/*uploaded\//);      my $uploaded=($url=~/^\/*uploaded\//);
     my $icon=&Apache::loncommon::icon($url);      my $icon=&Apache::loncommon::icon($url);
     my $isfolder;      my $isfolder=0;
     my $ispage;      my $ispage=0;
     my $containerarg;      my $folderarg;
       my $pagearg;
       my $pagefile;
     if ($uploaded) {      if ($uploaded) {
         if (($extension eq 'sequence') || ($extension eq 'page')) {          if (($extension eq 'sequence') || ($extension eq 'page')) {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;              $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
             $containerarg = $1;              my $containerarg = $1;
     if ($extension eq 'sequence') {      if ($extension eq 'sequence') {
         $icon=$iconpath.'navmap.folder.closed.gif';          $icon=$iconpath.'navmap.folder.closed.gif';
                   $folderarg=$containerarg;
                 $isfolder=1;                  $isfolder=1;
             } else {              } else {
                 $icon=$iconpath.'page.gif';                  $icon=$iconpath.'page.gif';
                   $pagearg=$containerarg;
                 $ispage=1;                  $ispage=1;
             }              }
             if ($allowed) {              if ($allowed) {
Line 3602  END Line 2353  END
  }   }
     }      }
   
     my ($editlink,$extresform);      my $editlink;
     my $orig_url = $url;      my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
     $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};      $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
     if (!$supplementalflag && $residx && $symb) {      if (!$supplementalflag && $residx && $symb) {
           if ($container eq 'page') {
               $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
               $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
           } 
         if ((!$isfolder) && (!$ispage)) {          if ((!$isfolder) && (!$ispage)) {
     (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);      (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
     $url=&Apache::lonnet::clutter($url);      $url=&Apache::lonnet::clutter($url);
Line 3631  END Line 2386  END
  }   }
     }      }
     my ($rand_pick_text,$rand_order_text);      my ($rand_pick_text,$rand_order_text);
     if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') {      if ($isfolder || $extension eq 'sequence') {
  my $foldername=&escape($foldertitle);   my $foldername=&escape($foldertitle);
  my $folderpath=$env{'form.folderpath'};   my $folderpath=$env{'form.folderpath'};
  if ($folderpath) { $folderpath.='&' };   if ($folderpath) { $folderpath.='&' };
         if (!$allowed && $supplementalflag) {          if (!$allowed && $supplementalflag) {
             $folderpath.=$containerarg.'&'.$foldername;              $folderpath.=$folderarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);              $url.='folderpath='.&escape($folderpath);
         } else {          } else {
 # Append randompick number, hidden, and encrypted with ":" to foldername,  # Append randompick number, hidden, and encrypted with ":" to foldername,
 # so it gets transferred between levels  # so it gets transferred between levels
     $folderpath.=$containerarg.'&'.$foldername.      $folderpath.=$folderarg.'&'.$foldername.
                                               ':'.(&LONCAPA::map::getparameter($orderidx,                                                ':'.(&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randompick'))[0]                                                'parameter_randompick'))[0]
                                                .':'.((&LONCAPA::map::getparameter($orderidx,                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
Line 3649  END Line 2404  END
                                                .':'.((&LONCAPA::map::getparameter($orderidx,                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_encrypturl'))[0]=~/^yes$/i)                                                'parameter_encrypturl'))[0]=~/^yes$/i)
                                                .':'.((&LONCAPA::map::getparameter($orderidx,                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randomorder'))[0]=~/^yes$/i)                                                'parameter_randomorder'))[0]=~/^yes$/i);
                                                .':'.$ispage;  
     $url.='folderpath='.&escape($folderpath);      $url.='folderpath='.&escape($folderpath);
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,              my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
                                                         'parameter_randompick'))[0];                                                          'parameter_randompick'))[0];
             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_randompick_'.$orderidx;              my $formname = 'edit_rpick_'.$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="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.'">';  '<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.'" />';
             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></span>'.              $rand_pick_text .= '</span></form>';
                                $form_end;         my $ro_set=
             my $ro_set;          ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
             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 action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".  $form_start.
 $form_param."\n".  $form_common.'
 $form_common."\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>';
 '<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 3697  $form_end; Line 2438  $form_end;
             $url .= '&amp;idx='.$orderidx;              $url .= '&amp;idx='.$orderidx;
         }          }
     }      }
     my ($tdalign,$tdwidth);      if ($ispage) {
           my $pagename=&escape($pagetitle);
           my $pagepath;
           my $folderpath=$env{'form.folderpath'};
           if ($folderpath) { $pagepath = $folderpath.'&' };
           $pagepath.=$pagearg.'&'.$pagename;
    $url.='pagepath='.&escape($pagepath).
       '&amp;pagesymb='.&escape($symb);
       }
     if ($allowed) {      if ($allowed) {
         my $fileloc =           my $fileloc = 
             &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));              &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));
         if ($isexternal) {          if ($isexternal) {
             ($editlink,$extresform) =               $editlink = '&nbsp;'.
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem);                  &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem);
         } elsif (!$isfolder && !$ispage) {          } elsif (!$isfolder && !$ispage) {
             my ($cfile,$home,$switchserver,$forceedit,$forceview) =               my ($cfile,$home,$switchserver,$forceedit,$forceview) = 
Line 3714  $form_end; Line 2463  $form_end;
                                                             $forceedit,                                                              $forceedit,
                                                             undef,$symb,                                                              undef,$symb,
                                                             &escape($env{'form.folderpath'}),                                                              &escape($env{'form.folderpath'}),
                                                             $renametitle,'','',1);                                                              $renametitle);
                 if ($jscall) {                  if ($jscall) {
                     $editlink = '<a class="LC_docs_ext_edit" href="javascript:'.                      $editlink = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:'.
                                 $jscall.'" >'.&mt('Edit').'</a>&nbsp;'."\n";                                  $jscall.'" >'.&mt('Edit').'</a>';
                 }                  }
             }              }
         }          }
         $tdalign = ' align="right" valign="top"';  
         $tdwidth = ' width="80%"';  
     }      }
     my $reinit;      my $reinit;
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $reinit = &mt('(re-initialize community to access)');          $reinit = &mt('(re-initialize community to access)');
     } else {      } else {
         $reinit = &mt('(re-initialize course to access)');          $reinit = &mt('(re-initialize course to access)');
     }      }  
     $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;      $line.='<td>';
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';         $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
     } elsif ($url) {      } elsif ($url) {
Line 3739  $form_end; Line 2486  $form_end;
     } else {      } else {
        $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';         $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
     }      }
     $line.='</span></td><td'.$tdwidth.'>';      $line.='</td><td>';
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'">'.$title.'</a>';         $line.='<a href="'.$url.'">'.$title.'</a>';
     } elsif ($url) {      } elsif ($url) {
Line 3748  $form_end; Line 2495  $form_end;
     } else {      } else {
        $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';         $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';
     }      }
     $line.="$extresform</td>";      $line.=$editlink."</td>";
     $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');      $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');
     $rand_order_text = '&nbsp;' if ($rand_order_text eq '');      $rand_order_text = '&nbsp;' if ($rand_order_text eq '');
     if (($allowed) && ($folder!~/^supplemental/)) {      if (($allowed) && ($folder!~/^supplemental/)) {
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
        'ec' => 'URL hidden');         'ec' => 'URL hidden');
         my ($enctext,$hidtext);   my $enctext=
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {      ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');
             $enctext = ' checked="checked"';   my $hidtext=
             if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {      ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');
                 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 action="/adm/coursedocs" method="post" name="$formhidden">      $form_start
     $form_param  
     $form_common      $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext /> $lt{'hd'}</label>      <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label>
     $form_end      $form_end
     <br />      <br />
     <form action="/adm/coursedocs" method="post" name="$formurlhidden">      $form_start
     $form_param  
     $form_common      $form_common
     <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'encrypturl','settings');" $enctext /> $lt{'ec'}</label>      <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $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 3792  ENDPARMS Line 2526  ENDPARMS
     return $line;      return $line;
 }  }
   
 sub action_restrictions {  sub newmap_suffix {
     my ($cnum,$cdom,$url,$folderpath,$currgroups) = @_;      my ($area,$container,$coursedom,$coursenum) = @_;
     my %denied = (      my ($prefix,$idtype,$errtext,$locknotfreed);
                    cut    => 0,      $prefix = 'docs';
                    copy   => 0,      if ($area eq 'supplemental') {
                    remove => 0,          $prefix = 'supp';
                  );  
     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';  
         $idtype = 'addcode';  
     } 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';
     my ($suffix,$freedlock,$error) =      my ($suffix,$freedlock,$error) =
         &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num,$idtype);          &Apache::lonnet::get_timebased_id($prefix,'num','uploadedmaps',
                                             $coursedom,$coursenum);
     if (!$suffix) {      if (!$suffix) {
         if ($type eq 'paste') {          $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');
             $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 =          $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>';
             '<div class="LC_error">'.  
             &mt('There was a problem removing a lockfile.').' ';  
         if ($type eq 'paste') {  
             if ($freedlock eq 'nolock') {  
                 $locknotfreed =  
                     '<div class="LC_error">'.  
                     &mt('A lockfile was not released when you added content to the clipboard earlier in this session.').' '.  
   
                     &mt('As a result addition of items to the clipboard will be unavailable until your next log-in.');  
             } else {  
                 $locknotfreed .=  
                     &mt('This will prevent addition of items to the clipboard until your next log-in.');  
             }  
         } elsif ($type eq 'map') {  
             $locknotfreed .=  
                 &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 4018  sub checkonthis { Line 2645  sub checkonthis {
              $r->print('<span class="LC_error">'.&mt('connection down').'</span>');               $r->print('<span class="LC_error">'.&mt('connection down').'</span>');
           } elsif ($result eq 'not_found') {            } elsif ($result eq 'not_found') {
       unless ($url=~/\$/) {        unless ($url=~/\$/) {
   $r->print('<span class="LC_error">'.&mt('not found').'</span>');    $r->print('<span class="LC_error">'.&mt('not found').'</b></span>');
       } else {        } else {
   $r->print('<span class="LC_error">'.&mt('unable to verify variable URL').'</span>');    $r->print('<span class="LC_error">'.&mt('unable to verify variable URL').'</span>');
       }        }
Line 4064  sub list_symbs { Line 2691  sub list_symbs {
             $r->print(&Apache::loncommon::start_data_table_row().              $r->print(&Apache::loncommon::start_data_table_row().
                       '<td>'.$res->compTitle().'</td>'.                        '<td>'.$res->compTitle().'</td>'.
                       '<td>'.$res->symb().'</td>'.                        '<td>'.$res->symb().'</td>'.
                       &Apache::loncommon::end_data_table_row());                        &Apache::loncommon::start_data_table_row());
             $count ++;              $count ++;
         }          }
         if (!$count) {          if (!$count) {
Line 4074  sub list_symbs { Line 2701  sub list_symbs {
         }          }
         $r->print(&Apache::loncommon::end_data_table());          $r->print(&Apache::loncommon::end_data_table());
     }      }
     $r->print(&endContentScreen());  
 }  }
   
   
 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.' Content'));      $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));
     $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 4105  sub verifycontent { Line 2731  sub verifycontent {
    }     }
    &untiehash();     &untiehash();
    $r->print('<p class="LC_success">'.&mt('Done').'</p>');     $r->print('<p class="LC_success">'.&mt('Done').'</p>');
     $r->print(&endContentScreen());  
 }  }
   
   
Line 4118  sub devalidateversioncache { Line 2743  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 Resource Versions"));      $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Resource Versions"));      $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
   
     my $header='';      my $header='';
Line 4184  sub checkversions { Line 2809  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 content in '.$crstype);   $header=&mt('All Documents in '.$crstype);
  $allsel=' selected="selected"';   $allsel=1;
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^ids\_(\/res\/.+)$/) {      if ($key=~/^ids\_(\/res\/.+)$/) {
  my $src=$1;   my $src=$1;
Line 4206  sub checkversions { Line 2831  sub checkversions {
  .&mt('seconds');   .&mt('seconds');
     if ($env{'form.timerange'}==-1) {      if ($env{'form.timerange'}==-1) {
  $seltext='since start of course';   $seltext='since start of course';
  $startsel=' selected="selected"';   $startsel='selected';
  $env{'form.timerange'}=time;   $env{'form.timerange'}=time;
     }      }
     $starttime=time-$env{'form.timerange'};      $starttime=time-$env{'form.timerange'};
     if ($env{'form.timerange'}==2592000) {      if ($env{'form.timerange'}==2592000) {
  $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $monthsel=' selected="selected"';   $monthsel='selected';
     } elsif ($env{'form.timerange'}==604800) {      } elsif ($env{'form.timerange'}==604800) {
  $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $weeksel=' selected="selected"';   $weeksel='selected';
     } elsif ($env{'form.timerange'}==86400) {      } elsif ($env{'form.timerange'}==86400) {
  $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $daysel=' selected="selected"';   $daysel='selected';
     }      }
     $header=&mt('Content changed').' '.$seltext;      $header=&mt('Content changed').' '.$seltext;
  } else {   } else {
Line 4256  sub checkversions { Line 2881  sub checkversions {
 <fieldset>  <fieldset>
 <legend>$lt{'cd'}</legend>  <legend>$lt{'cd'}</legend>
 <select name="timerange">  <select name="timerange">
 <option value='all'$allsel>$lt{'al'}</option>  <option value='all' $allsel>$lt{'al'}</option>
 <option value="-1"$startsel>$lt{'st'}</option>  <option value="-1" $startsel>$lt{'st'}</option>
 <option value="2592000"$monthsel>$lt{'lm'}</option>  <option value="2592000" $monthsel>$lt{'lm'}</option>
 <option value="604800"$weeksel>$lt{'lw'}</option>  <option value="604800" $weeksel>$lt{'lw'}</option>
 <option value="86400"$daysel>$lt{'sy'}</option>  <option value="86400" $daysel>$lt{'sy'}</option>
 </select>  </select>
 <input type="submit" name="display" value="$lt{'sd'}" />  <input type="submit" name="display" value="$lt{'sd'}" />
 </fieldset>  </fieldset>
Line 4275  $lt{'sc'}: <input type="submit" name="se Line 2900  $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'}" />
   <table border="0">
 ENDHEADERS  ENDHEADERS
     #number of columns for version history      #number of columns for version history
     my %changedbytime;      my $num_ver_col = 1;
     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>'.      "<th>$lt{'mr'}</th>".
         "<th>$lt{'mr'}</th>".      "<th>$lt{'ve'}</th>".
         "<th>$lt{'ve'}</th>".      "<th>$lt{'vu'}</th>".
         "<th>$lt{'vu'}</th>".      '<th colspan="'.$num_ver_col.'">'.&mt('History').'</th>'.
         '<th>'.&mt('History').'</th>'.      '</b>');
         &Apache::loncommon::end_data_table_header_row()      foreach my $key (sort(keys(%changes))) {
     );          #excludes not versionable problems from resource version history:
     foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) {          if ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/) {
         foreach my $key (sort(@{$changedbytime{$chg}})) {      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::end_data_table_header_row().
                 '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.              &Apache::loncommon::start_data_table_row().
                 '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.              '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br>'.
                 '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.              '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.
                 &Apache::lonlocal::locallocaltime($chg).')</span></td>'.              '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br>('.
                 '<td align="right">'              &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'.
             );              '<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{
                     $r->print($usedversion);                      $r->print($usedversion);
                 }                  }
       } else {
    $r->print($currentversion);
       }
       $r->print('</td><td title="'.$lt{'vu'}.'">');
   # Set version
       $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
         'set_version_'.$linkurl,
         {'select_form_order' =>
          ['',1..$currentversion,'mostrecent'],
          '' => '',
          'mostrecent' => &mt('most recent'),
          map {$_,$_} (1..$currentversion)}));
       my $lastold=1;
       for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
    my $url=$root.'.'.$prevvers.'.'.$extension;
    if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
       $starttime) {
       $lastold=$prevvers;
    }
       }
               #
               # Code to figure out how many version entries should go in
               # each of the four columns
               my $entries_per_col = 0;
               my $num_entries = ($currentversion-$lastold);
               if ($num_entries % $num_ver_col == 0) {
                   $entries_per_col = $num_entries/$num_ver_col;
             } else {              } else {
                 $r->print($currentversion);                  $entries_per_col = $num_entries/$num_ver_col + 1;
             }  
             $r->print('</td><td title="'.$lt{'vu'}.'">');  
             # Set version  
             $r->print(&Apache::loncommon::select_form(  
                       $setversions{$linkurl},  
                       'set_version_'.$linkurl,  
                       {'select_form_order' => ['',1..$currentversion,'mostrecent'],  
                        '' => '',  
                        'mostrecent' => &mt('most recent'),  
                        map {$_,$_} (1..$currentversion)}));  
             my $lastold=1;  
             for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {  
                 my $url=$root.'.'.$prevvers.'.'.$extension;  
                 if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {  
                     $lastold=$prevvers;  
                 }  
             }              }
             $r->print('</td>');              my $entries_count = 0;
             # List all available versions  
             $r->print('<td valign="top"><span class="LC_fontsize_medium">');              $r->print('<td valign="top"><span class="LC_fontsize_medium">');
               my $cols_output = 1;
             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(   $r->print('<span class="LC_nobreak"><a href="'.&Apache::lonnet::clutter($url).
                     '<span class="LC_nobreak">'    '">'.&mt('Version').' '.$prevvers.'</a> ('.
                    .'<a href="'.&Apache::lonnet::clutter($url).'">'    &Apache::lonlocal::locallocaltime(
                    .&mt('Version [_1]',$prevvers).'</a>'                                  &Apache::lonnet::metadata($url,
                    .' ('.&Apache::lonlocal::locallocaltime(                                                            'lastrevisiondate')
                          &Apache::lonnet::metadata($url,'lastrevisiondate'))                                                              ).
                    .')');    ')');
                 if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {   if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
                     $r->print(                      $r->print(' <a href="/adm/diff?filename='.
                         ' <a href="/adm/diff?filename='.        &Apache::lonnet::clutter($root.'.'.$extension).
                         &Apache::lonnet::clutter($root.'.'.$extension).        '&versionone='.$prevvers.
                         &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').        '" target="diffs">'.&mt('Diffs').'</a>');
                         '" target="diffs">'.&mt('Diffs').'</a>');   }
    $r->print('</span><br />');
                   if (++$entries_count % $entries_per_col == 0) {
                       $r->print('</span></td>');
                       if ($cols_output != $num_ver_col) {
                           $r->print('<td valign="top"><span class="LC_fontsize_medium">');
                           $cols_output++;
                       }
                 }                  }
                 $r->print('</span><br />');      }
               while($cols_output++ < $num_ver_col) {
                   $r->print('</span></td><td>');
             }              }
             $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());   }
         }  
     }      }
     $r->print(      $r->print('</td>'.&Apache::loncommon::end_data_table_row().
         &Apache::loncommon::end_data_table().              &Apache::loncommon::end_data_table().
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'.              '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />');
         '</form>'  
     );  
   
     &untiehash();      &untiehash();
     $r->print(&endContentScreen());  
     return;  
 }  }
   
 sub mark_hash_old {  sub mark_hash_old {
Line 4415  sub changewarning { Line 3037  sub changewarning {
     my $pathvar='folderpath';      my $pathvar='folderpath';
     my $path=&escape($env{'form.folderpath'});      my $path=&escape($env{'form.folderpath'});
     if (!defined($url)) {      if (!defined($url)) {
    if (defined($env{'form.pagepath'})) {
       $pathvar='pagepath';
       $path=&escape($env{'form.pagepath'});
       $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
    }
  $url='/adm/coursedocs?'.$pathvar.'='.$path;   $url='/adm/coursedocs?'.$pathvar.'='.$path;
     }      }
     my $course_type = &Apache::loncommon::course_type();      my $course_type = &Apache::loncommon::course_type();
Line 4438  $help{'Caching'}.'</p></form>'."\n\n"); Line 3065  $help{'Caching'}.'</p></form>'."\n\n");
   
   
 sub init_breadcrumbs {  sub init_breadcrumbs {
     my ($form,$text,$help)=@_;      my ($form,$text)=@_;
     &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 => $help});                                              help => 'Docs_Adding_Course_Doc'});
     &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 4480  sub startContentScreen { Line 3107  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('Main 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('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 4503  sub endContentScreen { Line 3131  sub endContentScreen {
 }  }
   
 sub supplemental_base {  sub supplemental_base {
     return 'supplemental&'.&escape(&mt('Supplemental Content'));      return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content'));
 }  }
   
 sub handler {  sub handler {
Line 4527  sub handler { Line 3155  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','Course_Roster','Web_Page',                         'Uploading_From_Harddrive',
                        'Dropbox','Simple_Problem') {                 'Check_Resource_Versions','Verify_Content') {
  $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 4536  sub handler { Line 3164  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 4550  sub handler { Line 3181  sub handler {
         $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});          $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver',
   if ($allowed && $env{'form.verify'}) {                                              'inhibitmenu']);
       &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content');    if ($allowed && $env{'form.chooseserver'}) {
         &choose_dump_server($r);
         return OK;
     } elsif ($allowed && $env{'form.verify'}) {
         &init_breadcrumbs('verify','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 4565  sub handler { Line 3200  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','Docs_Check_Resource_Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions');
       &checkversions($r);        &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Dump '.&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 4580  sub handler { Line 3215  sub handler {
 # Get the parameters that may be needed  # Get the parameters that may be needed
 #  #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['folderpath',                                              ['folderpath','pagepath',
                                              'forcesupplement','forcestandard',                                               'pagesymb','forcesupplement','forcestandard',
                                              'tools','symb','command','supppath']);                                               'tools','symb','command','supppath']);
   
 # standard=1: this is a "new-style" course with an uploaded map as top level  # standard=1: this is a "new-style" course with an uploaded map as top level
Line 4594  sub handler { Line 3229  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=($unesc_folderpath=~/^supplemental/);      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
     if (($unesc_folderpath=~/^default/) || ($unesc_folderpath eq "")) {      if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) {
        $supplementalflag=0;         $supplementalflag=0;
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
Line 4615  sub handler { Line 3250  sub handler {
   
 # Do we directly jump somewhere?  # Do we directly jump somewhere?
   
    if (($env{'form.command'} eq 'direct') || ($env{'form.command'} eq 'directnav')) {     if ($env{'form.command'} eq 'direct') {
          my ($mapurl,$id,$resurl);
        if ($env{'form.symb'} ne '') {         if ($env{'form.symb'} ne '') {
            $env{'form.folderpath'}=             ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'});
                &Apache::loncommon::symb_to_docspath($env{'form.symb'});             if ($resurl=~/\.(sequence|page)$/) {
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>                 $mapurl=$resurl;
                $env{'form.command'}.'_'.$env{'form.symb'}});             } elsif ($resurl eq 'adm/navmaps') {
                  $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'};
              }
              my $mapresobj;
              my $navmap = Apache::lonnavmaps::navmap->new();
              if (ref($navmap)) {
                  $mapresobj = $navmap->getResourceByUrl($mapurl);
              }
              $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1};
              my $type=$2;
              my $path;
              if (ref($mapresobj)) {
                  my $pcslist = $mapresobj->map_hierarchy();
                  if ($pcslist ne '') {
                      foreach my $pc (split(/,/,$pcslist)) {
                          next if ($pc <= 1);
                          my $res = $navmap->getByMapPc($pc);
                          if (ref($res)) {
                              my $thisurl = $res->src();
                              $thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; 
                              my $thistitle = $res->title();
                              $path .= '&'.
                                       &Apache::lonhtmlcommon::entity_encode($thisurl).'&'.
                                       &Apache::lonhtmlcommon::entity_encode($thistitle).
                                       ':'.$res->randompick().
                                       ':'.$res->randomout().
                                       ':'.$res->encrypted().
                                       ':'.$res->randomorder();
                          }
                      }
                  }
                  $path =~ s/^\&//;
                  my $maptitle = $mapresobj->title();
                  if ($mapurl eq 'default') {
                      $maptitle = 'Main Course Documents';
                  }
                  $path .= (($path ne '')? '&' : '').
                       &Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
                       &Apache::lonhtmlcommon::entity_encode($maptitle).
                       ':'.$mapresobj->randompick().
                       ':'.$mapresobj->randomout().
                       ':'.$mapresobj->encrypted().
                       ':'.$mapresobj->randomorder();
              } else {
                  my $maptitle = &Apache::lonnet::gettitle($mapurl);
                  if ($mapurl eq 'default') {
                      $maptitle = 'Main Course Documents';
                  }
                  $path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
                          &Apache::lonhtmlcommon::entity_encode($maptitle).'::::';
              }
              unless ($mapurl eq 'default') {
                  $path = 'default&'.
                          &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
                          '::::&'.$path;
              }
              if ($type eq 'sequence') {
                  $env{'form.folderpath'}=$path;
                  $env{'form.pagepath'}='';
              } else {
                  $env{'form.pagepath'}=$path;
                  $env{'form.folderpath'}='';
              }
        } 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&'.
                                  &escape(&mt('Main Content').':::::');                                    &Apache::lonhtmlcommon::entity_encode('Main Course Content');
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}});          $env{'form.pagepath'}='';
    } elsif ($env{'form.command'} eq 'editsupp') {     } elsif ($env{'form.command'} eq 'editsupp') {
        $env{'form.folderpath'} = 'supplemental&'.          $env{'form.folderpath'} = 'default&'.
                                   &escape('Supplemental Content');                                    &Apache::lonhtmlcommon::entity_encode('Supplemental Content');
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'});          $env{'form.pagepath'}='';
    } 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) {
        $stored_folderpath='docs_sup_folderpath';         $stored_folderpath='docs_sup_folderpath';
     }      }
   
 # No folderpath, and in edit mode, see if we have something stored  # No folderpath, no pagepath, and in edit mode, see if we have something stored
     if ((!$env{'form.folderpath'}) && $allowed) {      if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'}) && $allowed) {
         &Apache::loncommon::restore_course_settings($stored_folderpath,          &Apache::loncommon::restore_course_settings($stored_folderpath,
                                           {'folderpath' => 'scalar'});                                            {'folderpath' => 'scalar'});
         unless (&unescape($env{'form.folderpath'}) =~ m{^(default|supplemental)&}) {  
             undef($env{'form.folderpath'});  
         }  
     }      }
         
 # If we are not allowed to make changes, all we can see are supplemental docs  # If we are not allowed to make changes, all we can see are supplemental docs
     if (!$allowed) {      if (!$allowed) {
           $env{'form.pagepath'}='';
         unless ($env{'form.folderpath'} =~ /^supplemental/) {          unless ($env{'form.folderpath'} =~ /^supplemental/) {
             $env{'form.folderpath'} = &supplemental_base();              $env{'form.folderpath'} = &supplemental_base();
         }          }
     }      }
   # If we still not have a folderpath, see if we can resurrect at pagepath
       if (!$env{'form.folderpath'} && $allowed) {
           &Apache::loncommon::restore_course_settings($stored_folderpath,
                                                 {'pagepath' => 'scalar'});
       }
 # Make the zeroth entry in supplemental docs page paths, so we can get to top level  # Make the zeroth entry in supplemental docs page paths, so we can get to top level
     if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {      if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
         $env{'form.folderpath'} = &supplemental_base()          $env{'form.folderpath'} = &supplemental_base()
Line 4669  sub handler { Line 3363  sub handler {
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
 # If after all of this, we still don't have any paths, make them  # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {      unless (($env{'form.pagepath'}) || ($env{'form.folderpath'})) {
        if ($supplementalflag) {         if ($supplementalflag) {
           $env{'form.folderpath'}=&supplemental_base();            $env{'form.folderpath'}=&supplemental_base();
        } else {         } else {
           $env{'form.folderpath'}='default&'.&escape(&mt('Main Content').            $env{'form.folderpath'}='default';
                                   ':::::');  
        }         }
     }      }
   
Line 4682  sub handler { Line 3375  sub handler {
     unless ($toolsflag) {      unless ($toolsflag) {
         if ($allowed) {          if ($allowed) {
             &Apache::loncommon::store_course_settings($stored_folderpath,              &Apache::loncommon::store_course_settings($stored_folderpath,
                                                       {'folderpath' => 'scalar'});                                                        {'pagepath' => 'scalar',
                                                          'folderpath' => 'scalar'});
         }          }
         my $folderpath;  
         if ($env{'form.folderpath'}) {          if ($env{'form.folderpath'}) {
             $folderpath = $env{'form.folderpath'};      my (@folderpath)=split('&',$env{'form.folderpath'});
     my (@folders)=split('&',$env{'form.folderpath'});      $env{'form.foldername'}=&unescape(pop(@folderpath));
     $env{'form.foldername'}=&unescape(pop(@folders));      $env{'form.folder'}=pop(@folderpath);
             if ($env{'form.foldername'} =~ /\:1$/) {              $container='sequence';
                 $container = 'page';          }
             } else {          if ($env{'form.pagepath'}) {
                 $container = 'sequence';              my (@pagepath)=split('&',$env{'form.pagepath'});
             }              $env{'form.pagename'}=&unescape(pop(@pagepath));
     $env{'form.folder'}=pop(@folders);              $env{'form.folder'}=pop(@pagepath);
               $container='page';
               $containertag = '<input type="hidden" name="pagepath" value="" />'.
                       '<input type="hidden" name="pagesymb" value="" />';
               $pathitem = 
                   '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
           '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'.
                   '<input type="hidden" name="folderpath" value="" />';
         } else {          } else {
             if ($env{'form.folder'} eq '' ||              my $folderpath=$env{'form.folderpath'};
                 $env{'form.folder'} eq 'supplemental') {              if (!$folderpath) {
                 $folderpath='default&'.                  if ($env{'form.folder'} eq '' ||
                             &escape(&mt('Main Content').':::::');                      $env{'form.folder'} eq 'supplemental') {
                       $folderpath='default&'.
                           &escape(&mt('Main '.$crstype.' Documents'));
                   }
             }              }
               $containertag = '<input type="hidden" name="folderpath" value="" />';
               $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
         }          }
         $containertag = '<input type="hidden" name="folderpath" value="" />';  
         $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';  
         if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {          if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
            $showdoc='/'.$1;             $showdoc='/'.$1;
         }          }
Line 4736  sub handler { Line 3439  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.pagepath'}) {
                     unshift(@tabids,'001');                      unshift(@tabids,'001');
                     push(@tabids,('dd1','ee1'));                      push(@tabids,('dd1','ee1'));
                 }                  }
Line 4752  sub handler { Line 3453  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,$tid).                         &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr).
                        &Apache::lonextresedit::extedit_javascript();                         &Apache::lonextresedit::extedit_javascript();
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
                           };                            };
         }          }
         $script .= &paste_popup_js();           if ($env{'docs.markedcopy_url'}) {
               $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 4777  sub handler { Line 3480  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 4792  sub handler { Line 3487  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 4812  sub handler { Line 3508  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,$crstype);                                                \%allfiles,\%codebase,$context);
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
Line 4862  sub handler { Line 3558  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' => 'Upload Content',                  'upld' => 'Import 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 Upload',                  'imsf' => 'IMS Import',
                 'imsl' => 'Upload IMS package',                  'imsl' => 'Import 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',
                 'bb5'      => 'Blackboard 5',    );
                 'bb6'      => 'Blackboard 6',  
                 'angel5'   => 'ANGEL 5.5',  
                 'webctce4' => 'WebCT 4 Campus Edition',  
         );  
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
  $lt{'file'}:<br />   $lt{'file'}:<br />
Line 4928  CHBO Line 3627  CHBO
         $lt{'cms'}:&nbsp;           $lt{'cms'}:&nbsp; 
         <select name="source">          <select name="source">
         <option value="-1" selected="selected">$lt{'se'}</option>          <option value="-1" selected="selected">$lt{'se'}</option>
         <option value="bb5">$lt{'bb5'}</option>          <option value="bb5">Blackboard 5</option>
         <option value="bb6">$lt{'bb6'}</option>          <option value="bb6">Blackboard 6</option>
         <option value="angel5">$lt{'angel5'}</option>          <option value="angel5">ANGEL 5.5</option>
         <option value="webctce4">$lt{'webctce4'}</option>          <option value="webctce4">WebCT 4 Campus Edition</option>
         </select>          </select>
         <input type="hidden" name="folder" value="$imsfolder" />          <input type="hidden" name="folder" value="$imsfolder" />
         </p>          </p>
Line 4996  SEDFFORM Line 3695  SEDFFORM
         if ($folder eq '') {          if ($folder eq '') {
             $folder='default';              $folder='default';
         }          }
  my $output = &update_paste_buffer($coursenum,$coursedom,$folder);   &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 5038  HIDDENFORM Line 3734  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('Main Content'));     $env{'form.folderpath'}='default&'.&escape(&mt('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 5055  HIDDENFORM Line 3751  HIDDENFORM
        }         }
        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.sequence';         my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.sequence';
        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.page';         my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.page';
    my $container='sequence';
    if ($env{'form.pagepath'}) {
       $container='page';
    }
  my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;   my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
   
  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="ee" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'navc'}=/adm/navmaps" />   value="$lt{'navc'}=/adm/navmaps" />
Line 5069  HIDDENFORM Line 3769  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="ee" />   <input type="hidden" name="active" value="cc" />
  $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 5083  NSPFORM Line 3783  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 5094  NSPROBFORM Line 3794  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 5110  NEXUFORM Line 3809  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="dd" />   <input type="hidden" name="active" value="cc" />
  $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 5120  NBFORM Line 3819  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="dd" />   <input type="hidden" name="active" value="cc" />
  $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 5131  NAMFORM Line 3830  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="dd" />   <input type="hidden" name="active" value="cc" />
  $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="dd" />   <input type="hidden" name="active" value="cc" />
  $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 5185  my $newfolderb; Line 3864  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="ee" />   <input type="hidden" name="active" value="cc" />
  <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 5196  NPFORM Line 3875  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="" />   <input type="hidden" name="active" value="aa" />
  <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="ee" />   <input type="hidden" name="active" value="cc" />
  $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 5215  NSYLFORM Line 3894  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="dd" />   <input type="hidden" name="active" value="cc" />
  $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 5228  NGFFORM Line 3907  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));
   
   
         my @importdoc = (          my @importdoc = (
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform}          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform},
         );          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform},
         unless ($container eq 'page') {          {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform,
             push(@importdoc,          });
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform}  
             );  
         }  
         push(@importdoc,  
             {'<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));
   
         @gradingforma=(          @gradingforma=(
Line 5264  NGFFORM Line 3936  NGFFORM
         $communityform = &create_form_ul(&create_list_elements(@communityforma));          $communityform = &create_form_ul(&create_list_elements(@communityforma));
   
 my %orderhash = (  my %orderhash = (
                 'aa' => ['Upload',$fileuploadform],                  'aa' => ['Import Content',$fileuploadform],
                 'bb' => ['Import',$importpubform],                  'bb' => ['Published Content',$importpubform],
                 'cc' => ['Grading',$gradingform],                  'cc' => ['Grading Resources',$gradingform],
                 );                  );
 unless ($container eq 'page') {  unless ($env{'form.pagepath'}) {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
     $orderhash{'dd'} = ['Collaboration',$communityform];      $orderhash{'dd'} = ['Collaboration',$communityform];
     $orderhash{'ee'} = ['Other',$specialdocumentsform];      $orderhash{'ee'} = ['Special Pages',$specialdocumentsform];
 }  }
   
  $hadchanges=0;   $hadchanges=0;
Line 5301  unless ($container eq 'page') { Line 3973  unless ($container eq 'page') {
        } elsif ($allowed) {         } elsif ($allowed) {
   $env{'form.folderpath'} = $savefolderpath;    $env{'form.folderpath'} = $savefolderpath;
        }         }
          $env{'form.pagepath'} = '';
        $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'},'<>&"').'" />';
        if ($allowed) {         if ($allowed) {
Line 5332  SUPDOCFORM Line 4005  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="" />   <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:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a>    <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> 
Line 5366  SNSFORM Line 4039  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 5405  my @supimportdoc = ( Line 4056  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' => ['Upload',$supupdocform],                  'ee' => ['Import Content',$supupdocform],
                 'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]                  'ff' => ['Special Pages',&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) {
Line 5504  sub decompression_info { Line 4142  sub decompression_info {
     my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};      my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $container='sequence';      my $container='sequence';
     my ($pathitem,$hiddenelem);      my ($pathitem,$hiddenelem);
     my @hiddens = ('newidx','comment','position','folderpath','archiveurl');      my @hiddens = ('newidx','comment','position');
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.pagepath'}) {
         $container='page';          $container='page';
           $pathitem = 'pagepath';
       } else {
           $pathitem = 'folderpath';
     }      }
     unshift(@hiddens,$pathitem);      unshift(@hiddens,$pathitem);
     foreach my $item (@hiddens) {      foreach my $item (@hiddens) {
         if ($env{'form.'.$item}) {          if ($env{'form.'.$item}) {
             $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.              $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
                            &HTML::Entities::encode($env{'form.'.$item},'<>&"').'" />'."\n";                             $env{'form.'.$item}.'" />'."\n";
         }          }
     }      }
     return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,      return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
Line 5569  sub remove_archive { Line 4210  sub remove_archive {
         } else {          } else {
             $delwarning = &mt('An error occurred retrieving the contents of the current folder.');              $delwarning = &mt('An error occurred retrieving the contents of the current folder.');
         }          }
         $delwarning .= ' '.&mt('As a result the archive file has not been removed.');          $delwarning .= &mt('As a result the archive file has not been removed.');
     } else {      } else {
         my $currcmd = $env{'form.cmd'};          my $currcmd = $env{'form.cmd'};
         my $position = $env{'form.position'};          my $position = $env{'form.position'};
         my $archiveidx = $position;          if ($position > 0) { 
         if ($position > 0) {              $env{'form.cmd'} = 'del_'.$position;
             if (($env{'form.autoextract_camtasia'}) && (scalar(@LONCAPA::map::order) == 2)) {              my ($title,$url,@rrest) = 
                 $archiveidx = $position-1;                  split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]);
             }              if (&handle_edit_cmd($docuname,$docudom)) {
             $env{'form.cmd'} = 'remove_'.$archiveidx;                  ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);
             my ($title,$url,@rrest) =                  if ($fatal) {
                 split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$archiveidx]]);                      if ($container eq 'page') {
             if ($url eq $env{'form.archiveurl'}) {                          $delwarning = &mt('An error occurred updating the contents of the current page.');
                 if (&handle_edit_cmd($docuname,$docudom)) {  
                     ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);  
                     if ($fatal) {  
                         if ($container eq 'page') {  
                             $delwarning = &mt('An error occurred updating the contents of the current page.');  
                         } else {  
                             $delwarning = &mt('An error occurred updating the contents of the current folder.');  
                         }  
                     } else {                      } else {
                         $delresult = &mt('Archive file removed.');                          $delwarning = &mt('An error occurred updating the contents of the current folder.');
                     }                      }
                   } else {
                       $delresult = &mt('Archive file removed.');
                 }                  }
             } else {  
                 $delwarning .=  &mt('Archive file had unexpected item number in folder.').  
                                 ' '.&mt('As a result the archive file has not been removed.');  
             }              }
         }          }
         $env{'form.cmd'} = $currcmd;          $env{'form.cmd'} = $currcmd;
Line 5618  sub generate_admin_menu { Line 4250  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= ( # do not translate here      my %lt=&Apache::lonlocal::texthash (
                                          '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'  => "Copy $crstype Content to Authoring Space",                                           'dcd'  => "Dump $crstype Content to Authoring Space",
             );                                         );
     my ($candump,$dumpurl);      my ($candump,$dumpurl);
     if ($home + $other > 0) {      if ($home + $other > 0) {
         $candump = 'F';          $candump = 'F';
Line 5635  sub generate_admin_menu { Line 4267  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 5654  sub generate_admin_menu { Line 4286  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       => 'Docs_Verify_Content',                      help       => '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       => 'Docs_Check_Resource_Versions',                      help       => '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 5686  sub generate_admin_menu { Line 4318  sub generate_admin_menu {
                 {   linktext   => $lt{'dcd'},                  {   linktext   => $lt{'dcd'},
                     url        => $dumpurl,                      url        => $dumpurl,
                     permission => $candump,                      permission => $candump,
                     help       => 'Docs_Dump_Course_Docs',                      #help => '',
                     icon       => 'dump.png',                      icon       => 'dump.png',
                     linktitle  => $lt{'dcd'},                      linktitle  => $lt{'dcd'},
                 },                  },
Line 5699  sub generate_admin_menu { Line 4331  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 '') && ($env{'form.active'} ne '00')) {      if($env{'form.active'} ne ''){
         $activetab = $env{'form.active'};          $activetab = $env{'form.active'};
     }      }
     my $backicon = $iconpath.'clickhere.gif';      my $backicon = $iconpath.'clickhere.gif';
     my $backtext = &mt('Exit Editor');      my $backtext = &mt('Exit');
     $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 5741  sub generate_edit_table { Line 4372  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 style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";      $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";
   
  }   }
     }      }
Line 5749  sub generate_edit_table { Line 4380  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 '') {
         my $saveform;          $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'."\n";
         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 5799  END Line 4402  END
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag) = @_;      my ($udom,$uname,$supplementalflag) = @_;
     my %js_lt = &Apache::lonlocal::texthash(      my $now = time();
       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',
                                           p_mnp => 'Name of New Page',                                            p_mnp => 'Name of New Page',
Line 5809  sub editing_js { Line 4413  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 5818  sub editing_js { Line 4421  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.',  
                                         );                                          );
   
     &js_escape(\%js_lt);  
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"');      my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"');
       my $docs_pagepath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.pagepath'},'<>&"');
     my $main_container_page;      my $main_container_page;
     if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {      if ($docs_folderpath eq '') {
         $main_container_page = 1;          if ($docs_pagepath ne '') {
               $main_container_page = 1;
           }
     }      }
     my $toplevelmain =       my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents';
         &escape(&mt('Main Content').':::::');  
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
     my $backtourl;      my $backtourl = '/adm/navmaps';
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {      if ($supplementalflag) {
         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,'<>&"');  
                 $backtourl = &Apache::loncommon::escape_single($backtourl);   
             } 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','ims'";
     unless ($main_container_page) {  
         $fieldsets .=",'ims'";  
     }  
     if ($supplementalflag) {      if ($supplementalflag) {
         $fieldsets = "'suppext','suppdoc'";          $fieldsets = "'suppext','suppdoc'";
     }      }
   
     return <<ENDNEWSCRIPT;      return <<ENDNEWSCRIPT;
 function makenewfolder(targetform,folderseq) {  function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$js_lt{{"p_mnf"}','$js_lt{{"t_mnf"}');      var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
     if (foldername) {      if (foldername) {
        targetform.importdetail.value=escape(foldername)+"="+folderseq;         targetform.importdetail.value=escape(foldername)+"="+folderseq;
         targetform.submit();          targetform.submit();
Line 5891  function makenewfolder(targetform,folder Line 4464  function makenewfolder(targetform,folder
 }  }
   
 function makenewpage(targetform,folderseq) {  function makenewpage(targetform,folderseq) {
     var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}');      var pagename=prompt('$lt{"p_mnp"}','$lt{"t_mnp"}');
     if (pagename) {      if (pagename) {
         targetform.importdetail.value=escape(pagename)+"="+folderseq;          targetform.importdetail.value=escape(pagename)+"="+folderseq;
         targetform.submit();          targetform.submit();
Line 5899  function makenewpage(targetform,folderse Line 4472  function makenewpage(targetform,folderse
 }  }
   
 function makeexamupload() {  function makeexamupload() {
    var title=prompt('$js_lt{"p_mxu"}');     var title=prompt('$lt{"p_mxu"}');
    if (title) {     if (title) {
     this.document.forms.newexamupload.importdetail.value=      this.document.forms.newexamupload.importdetail.value=
  escape(title)+'=/res/lib/templates/examupload.problem';   escape(title)+'=/res/lib/templates/examupload.problem';
Line 5908  function makeexamupload() { Line 4481  function makeexamupload() {
 }  }
   
 function makesmppage() {  function makesmppage() {
    var title=prompt('$js_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/new/smppg';   escape(title)+'=/adm/$udom/$uname/$now/smppg';
     this.document.forms.newsmppg.submit();      this.document.forms.newsmppg.submit();
    }     }
 }  }
   
 function makewebpage(type) {  
    var title=prompt('$js_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('$js_lt{"p_msb"}');     var title=prompt('$lt{"p_msb"}');
    if (title) {     if (title) {
     this.document.forms.newsmpproblem.importdetail.value=      this.document.forms.newsmpproblem.importdetail.value=
  escape(title)+'=/res/lib/templates/simpleproblem.problem';   escape(title)+'=/res/lib/templates/simpleproblem.problem';
Line 5941  function makesmpproblem() { Line 4499  function makesmpproblem() {
 }  }
   
 function makedropbox() {  function makedropbox() {
    var title=prompt('$js_lt{"p_mdb"}');     var title=prompt('$lt{"p_mdb"}');
    if (title) {     if (title) {
     this.document.forms.newdropbox.importdetail.value=      this.document.forms.newdropbox.importdetail.value=
         escape(title)+'=/res/lib/templates/DropBox.problem';          escape(title)+'=/res/lib/templates/DropBox.problem';
Line 5950  function makedropbox() { Line 4508  function makedropbox() {
 }  }
   
 function makebulboard() {  function makebulboard() {
    var title=prompt('$js_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/new/bulletinboard';   escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
     this.document.forms.newbul.submit();      this.document.forms.newbul.submit();
    }     }
 }  }
   
 function makeabout() {  function makeabout() {
    var user=prompt("$js_lt{'p_mab'}");     var user=prompt("$lt{'p_mab'}");
    if (user) {     if (user) {
        var comp=new Array();         var comp=new Array();
        comp=user.split(':');         comp=user.split(':');
        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {         if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
    if ((comp[0]) && (comp[1])) {     if ((comp[0]) && (comp[1])) {
        this.document.forms.newaboutsomeone.importdetail.value=         this.document.forms.newaboutsomeone.importdetail.value=
    '$js_lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';     '$lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
        this.document.forms.newaboutsomeone.submit();         this.document.forms.newaboutsomeone.submit();
    } else {     } else {
        alert("$js_lt{'p_mab_alrt1'}");         alert("$lt{'p_mab_alrt1'}");
    }     }
 } else {  } else {
    alert("$js_lt{'p_mab_alrt2'}");     alert("$lt{'p_mab_alrt2'}");
 }  }
 }  }
 }  }
Line 6010  function toggleMap(caller) { Line 4568  function toggleMap(caller) {
   
 function makeims(imsform) {  function makeims(imsform) {
     if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {      if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {
         alert("$js_lt{'imsfile'}");          alert("$lt{'imsfile'}");
         return;          return;
     }      }
     if (imsform.source.selectedIndex == 0) {      if (imsform.source.selectedIndex == 0) {
         alert("$js_lt{'imscms'}");          alert("$lt{'imscms'}");
         return;          return;
     }      }
     newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes");      newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes");
     imsform.submit();      imsform.submit();
 }  }
   
 function changename(folderpath,index,oldtitle) {  function changename(folderpath,index,oldtitle,container,pagesymb) {
 var title=prompt('$js_lt{"p_chn"}',oldtitle);  var title=prompt('$lt{"p_chn"}',oldtitle);
 if (title) {  if (title) {
 this.document.forms.renameform.markcopy.value='';  this.document.forms.renameform.markcopy.value=-1;
 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;  if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
   }
   if (container == 'page') {
       this.document.forms.renameform.pagepath.value=folderpath;
       this.document.forms.renameform.pagesymb.value=pagesymb;
   }
   this.document.forms.renameform.submit();
   }
   }
   
   function removeres(folderpath,index,oldtitle,container,pagesymb,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;
   if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
   }
   if (container == 'page') {
       this.document.forms.renameform.pagepath.value=folderpath;
       this.document.forms.renameform.pagesymb.value=pagesymb;
   }
   this.document.forms.renameform.submit();
   }
   }
   
   function cutres(folderpath,index,oldtitle,container,pagesymb,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;
   if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
   }
   if (container == 'page') {
       this.document.forms.renameform.pagepath.value=folderpath;
       this.document.forms.renameform.pagesymb.value=pagesymb;
   }
 this.document.forms.renameform.submit();  this.document.forms.renameform.submit();
 }  }
 }  }
   
   function markcopy(folderpath,index,oldtitle,container,pagesymb,folder) {
   this.document.forms.renameform.markcopy.value=index;
   this.document.forms.renameform.copyfolder.value=folder+'.'+container;
   if (container == 'sequence') {
   this.document.forms.renameform.folderpath.value=folderpath;
   }
   if (container == 'page') {
   this.document.forms.renameform.pagepath.value=folderpath;
   this.document.forms.renameform.pagesymb.value=pagesymb;
   }
   this.document.forms.renameform.submit();
   }
   
 function updatePick(targetform,index,caller) {  function updatePick(targetform,index,caller) {
     var pickitem;      var pickitem = document.getElementById('rpick_'+index);
     var picknumitem;      var picknumitem = document.getElementById('rpicknum_'+index);
     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('$js_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;
                 if (index == 'all') {                  return;
                     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;
                 if (index == 'all') {                  targetform.changeparms.value='randompick';
                     picknumtext.innerHTML = '&nbsp;<a href="javascript:updatePick(document.cumulativesettings,\\'all\\',\\'link\\');">'+picknum+'</a>';                  targetform.submit();
                     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') {
                     if (index == 'all') {                      pickitem.checked=false;
                         picknumtext.innerHTML = '';  
                         if (caller == 'link') {  
                             propagateState(targetform,'rpicknum');  
                         }  
                     } else {  
                         pickitem.checked=false;  
                         checkForSubmit(targetform,'randompick','settings');  
                     }  
                 }                  }
                 return;                  return;
             }              }
         }          }
     } else {      } else {
         picknumitem.value = '';          picknumitem.value = 0;
         picknumtext.innerHTML = '';          targetform.changeparms.value='randompick';
         if (index == 'all') {          targetform.submit();
             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('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'" $js_lt{"p_rmr2b"}')) {  
                     targetform.markcopy.value='';  
                     targetform.copyfolder.value='';  
                     targetform.submit();  
                 }  
             }  
             if (param == 'cut') {  
                 if (skip_confirm || confirm('$js_lt{"p_ctr1a"}\\n$js_lt{"p_ctr1b"}\\n\\n$js_lt{"p_ctr2a"} "'+oldtitle+'" $js_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) {
Line 6306  for (i = 0; i < currentLis.length; i++) Line 4689  for (i = 0; i < currentLis.length; i++)
   
 function hideAll(current, nav, data) {  function hideAll(current, nav, data) {
 unselectInactive(nav);  unselectInactive(nav);
 if (current) {  if(current.className == 'right'){
     if (current.className == 'right'){  
  current.className = 'right active'   current.className = 'right active'
     } else {   }else{
  current.className = 'active';   current.className = 'active';
     }  
 }  }
 currentData = document.getElementById(data);  currentData = document.getElementById(data);
 currentDivs = currentData.getElementsByTagName('DIV');  currentDivs = currentData.getElementsByTagName('DIV');
Line 6342  function openTabs(pageId) { Line 4723  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);
         if ((currstate == 'active') || (currstate == 'right active')) {   current.className = '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 6367  function showPage(current, pageId, nav, Line 4734  function showPage(current, pageId, nav,
         toggleMap();          toggleMap();
         if (nav == 'mainnav') {          if (nav == 'mainnav') {
             var storedpath = "$docs_folderpath";              var storedpath = "$docs_folderpath";
               if (storedpath == '') {
                   storedpath = "$docs_pagepath";
               }
             var storedpage = "$main_container_page";              var storedpage = "$main_container_page";
             var reg = new RegExp("^supplemental");              var reg = new RegExp("^supplemental");
             if (pageId == 'mainCourseDocuments') {              if (pageId == 'mainCourseDocuments') {
Line 6402  function showPage(current, pageId, nav, Line 4772  function showPage(current, pageId, nav,
   
 function toContents(jumpto) {  function toContents(jumpto) {
     var newurl = '$backtourl';      var newurl = '$backtourl';
     if ((newurl == '/adm/navmaps') && (jumpto != '')) {      if (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;">$js_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;">$js_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;">$js_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('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr3a"} '+remwarnings+' $js_lt{"p_rmr3b"}')) {  
                         return false;  
                     }  
                 }  
                 if (cutwarnings > 0) {  
                     if (!confirm('$js_lt{"p_ctr1a"}\\n$js_lt{"p_ctr1b"}\\n\\n$js_lt{"p_ctr3a"} '+cutwarnings+' $js_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("$js_lt{'noor'}");  
     } else {  
         if (dosettings == 1) {  
             alert("$js_lt{'noch'}");  
         } else {  
             alert("$js_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 6746  ENDINJECT Line 4808  ENDINJECT
   
 sub dump_switchserver_js {  sub dump_switchserver_js {
     my @hosts = @_;      my @hosts = @_;
     my %js_lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         dump => 'Copying content to Authoring Space requires switching server.',          dump => 'Dumping to Authoring Space requires switching server.',
         swit => 'Switch server?',  
     );  
     my %html_js_lt = &Apache::lonlocal::texthash(  
         swit => 'Switch server?',          swit => 'Switch server?',
         duco => 'Copying Content to Authoring Space',          duco => 'Dump 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',
     );      );
     &js_escape(\%js_lt);  
     &html_escape(\%html_js_lt);  
     &js_escape(\%html_js_lt);  
     my $role = $env{'request.role'};      my $role = $env{'request.role'};
     my $js = <<"ENDSWJS";      my $js = <<"ENDSWJS";
 <script type="text/javascript">  <script type="text/javascript">
Line 6799  ENDSWJS Line 4855  ENDSWJS
   
 function dump_needs_switchserver(url) {  function dump_needs_switchserver(url) {
     if (url!='' && url!= null) {      if (url!='' && url!= null) {
         if (confirm("$js_lt{'dump'}\\n$js_lt{'swit'}")) {          if (confirm("$lt{'dump'}\\n$lt{'swit'}")) {
             go(url);              go(url);
         }          }
     }      }
Line 6810  function choose_switchserver_window() { Line 4866  function choose_switchserver_window() {
     newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes')      newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes')
     newWindow.document.open();      newWindow.document.open();
     newWindow.document.writeln('$startpage');      newWindow.document.writeln('$startpage');
     newWindow.document.write('<h3>$html_js_lt{'duco'}<\\/h3>\\n'+      newWindow.document.write('<h3>$lt{'duco'}<\\/h3>\\n'+
        '<p>$html_js_lt{'yone'}<\\/p>\\n'+         '<p>$lt{'yone'}<\\/p>\\n'+
        '<div class="LC_left_float"><fieldset><legend>$html_js_lt{'chos'}<\\/legend>\\n'+         '<div class="LC_left_float"><fieldset><legend>$lt{'chos'}<\\/legend>\\n'+
        '<form name="setserver" method="post" action="" \\/>\\n'+         '<form name="setserver" method="post" action="" \\/>\\n'+
        '$hostpicker\\n'+         '$hostpicker\\n'+
        '<br \\/><br \\/>\\n'+         '<br \\/><br \\/>\\n'+
        '<input type="button" name="makeswitch" value="$html_js_lt{'swit'}" '+         '<input type="button" name="makeswitch" value="$lt{'swit'}" '+
        'onclick="write_switchserver();" \\/>\\n'+         'onclick="write_switchserver();" \\/>\\n'+
        '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n');         '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n');
     newWindow.document.writeln('$endpage');      newWindow.document.writeln('$endpage');
Line 6902  Return hash with valid author names Line 4958  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 6914  Return hash with valid author names Line 4966  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.62  
changed lines
  Added in v.1.516


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.