Diff for /loncom/interface/londocs.pm between versions 1.484.2.70 and 1.523

version 1.484.2.70, 2017/03/15 02:05:20 version 1.523, 2012/12/07 17:04:01
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 139  sub clean { Line 132  sub clean {
     return $title;      return $title;
 }  }
   
 sub default_folderpath {  
     my ($coursenum,$coursedom,$navmapref) = @_;  
     return unless ($coursenum && $coursedom && ref($navmapref));  
 # Check if entire course is hidden and/or encrypted  
     my ($hiddenmap,$encryptmap,$folderpath,$hiddentop);  
     my $toplevel = "uploaded/$coursedom/$coursenum/default.sequence";  
     unless (ref($$navmapref)) {  
         $$navmapref = Apache::lonnavmaps::navmap->new();  
     }  
     if (ref($$navmapref)) {  
         if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.hiddenresource")) eq 'yes') {  
             my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };  
             my @resources = $$navmapref->retrieveResources($toplevel,$filterFunc,1,1);  
             unless (@resources) {  
                 $hiddenmap = 1;  
                 unless ($env{'request.role.adv'}) {  
                     $hiddentop = 1;  
                     if ($env{'form.folder'}) {  
                         undef($env{'form.folder'});  
                     }  
                 }  
             }  
         }  
         if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.encrypturl")) eq 'yes') {  
             $encryptmap = 1;  
         }  
     }  
     unless ($hiddentop) {  
         $folderpath='default&'.&escape(&mt('Main Content')).  
                     '::'.$hiddenmap.':'.$encryptmap.'::';  
     }  
     if (wantarray) {  
         return ($folderpath,$hiddentop);  
     } else {  
         return $folderpath;  
     }  
 }  
   
 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 216  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 642  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 651  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 676  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 827  sub log_docs { Line 375  sub log_docs {
 }  }
   
 sub docs_change_log {  sub docs_change_log {
     my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_;
     my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
     my $navmap;     
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".               '// <![CDATA['."\n".
              &Apache::loncommon::display_filter_js('docslog')."\n".               &Apache::loncommon::display_filter_js('docslog')."\n".
              &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag,               &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag)."\n".
                          $coursedom,$coursenum,$canedit,\$navmap)."\n".  
              &history_tab_js()."\n".               &history_tab_js()."\n".
              &Apache::lonratedt::editscript('simple')."\n".               &Apache::lonratedt::editscript('simple')."\n".
              '// ]]>'."\n".               '// ]]>'."\n".
Line 850  sub docs_change_log { Line 396  sub docs_change_log {
     }      }
     my $folderpath=$env{'form.folderpath'};      my $folderpath=$env{'form.folderpath'};
     if ($folderpath eq '') {      if ($folderpath eq '') {
         $folderpath = &default_folderpath($coursenum,$coursedom,\$navmap);          $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents').':::::');
     }      }
     undef($navmap);  
     $pathitem = '<input type="hidden" name="folderpath" value="'.      $pathitem = '<input type="hidden" name="folderpath" value="'.
                 &HTML::Entities::encode($folderpath,'<>&"').'" />';                  &HTML::Entities::encode($folderpath,'<>&"').'" />';
     my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";      my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
Line 1016  sub docs_change_log { Line 561  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 1163  sub recurse_uploaded_maps { Line 643  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 = 1;  
             }  
             if ($canpaste) {  
                 if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {  
                     my $srcdom = $1;  
                     my $srcnum = $2;  
                     my $rem = $3;  
                     if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {  
                         $othercourse = 1;  
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {  
                             if ($canpaste) {  
                                 $othercrs = '<br />'.&mt('(from another course)');  
                             }  
                         } else {  
                             $canpaste = 0;  
                             $nopaste = &mt('Paste from another course unavailable.');   
                         }  
                     }  
                     if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {  
                         my $prefix = $1;  
                         $parent = $2;  
                         if ($folder !~ /^\Q$prefix\E/) {  
                             $areachange = 1;  
                         }  
                         $is_uploaded_map = 1;  
                     }                      }
                   } else {
                       $canpaste = 0;
                       $nopaste = &mt('Paste from another course unavailable.') 
                 }                  }
             }              }
             if ($canpaste) {              if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) {
                push(@pasteable,$suffix);                  my $prefix = $1;
             }                  $parent = $2;
             my $buffer;                  if ($folder !~ /^\Q$prefix\E/) {
             if ($is_external) {                      $areachange = 1;
                 $buffer = &mt('External Resource').': '.                  }
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.                  $is_uploaded_map = 1;
                     &LONCAPA::map::qtescape($url).')';              }
             } else {          }
                 my $icon = &Apache::loncommon::icon($extension);      }
                 if ($extension eq 'sequence' &&  
                     $url =~ m{/default_\d+\.sequence$}x) {      $r->print('<fieldset>'
                     $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));               .'<legend>'.&mt('Clipboard').'</legend>');
                     $icon .= '/navmap.folder.closed.gif';      my ($type,$buffer);
                 }      if ($is_external) {
                 my $title = $env{'docs.markedcopy_title_'.$suffix};          $type = &mt('External Resource');
                 if ($title eq '') {          $buffer = $type.': '.
                     ($title) = ($url =~ m{/([^/]+)$});                    &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
                 }                    &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')';
                 $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'.      }  else {
                           ': '.          my $icon = &Apache::loncommon::icon($extension);
                           &Apache::loncommon::parse_supplemental_title(          if ($extension eq 'sequence' &&
                              &LONCAPA::map::qtescape($title));              $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
             }              $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
             $pasteitems .= '<div class="LC_left_float">';              $icon .= '/navmap.folder.closed.gif';
             my ($options,$onclick);          }
             if (($canpaste) && (!$areachange) && (!$othercourse) &&          $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
                 ($env{'docs.markedcopy_cmd_'.$suffix} eq 'cut')) {          $buffer = $icon.$type.': '.  &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}));
                 if (($is_uploaded_map) ||      }
                     ($url =~ /(bulletinboard|smppg)$/) ||      if ($canpaste) {
                     ($url =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {          $r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer);
                     $options = &paste_options($suffix,$is_uploaded_map,$parent);          if (($is_uploaded_map) && (!$areachange)) {
                     $onclick= 'onclick="showOptions(this,'."'$suffix'".');" ';              if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) {
                 }                  $r->print(('&nbsp;'x 4).'<span id="pasteoptionstext">'.
             }                            '<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'.
             $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';                            &mt('Show Paste Options').'</a></span><br />'.
             if ($nopaste) {                            '<div id="pasteoptions" class="LC_dccid">'.('&nbsp;'x 4).
                  $pasteitems .= $nopaste;                               '<label>'.
             } else {                            '<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'.
                 if ($othercrs) {                            &mt('Copy to new folder').'</label>'.('&nbsp;' x2).
                     $pasteitems .= $othercrs;                            '<label>'.   
                 }                            '<input type="radio" name="docs.markedcopy_options" value="move" />'.
                 if ($options) {                            &mt('Move old folder').'</label><br />');
                     $pasteitems .= $options;                  if ($env{'docs.markedcopy_nested'}) {
                 }                      $r->print('<br />'.&mt('Folder to paste contains sub-folders').
             }                                '<br /><table border="0">');
             $pasteitems .= '</div>';                      my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'});
         }                      my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames'});
     }                      my $lastdir = $parent;
     if ($pasteitems eq '') {                      my %depths = (
         &Apache::lonnet::delenv('docs.markedcopies');                                     $lastdir => 0,
     }                                   );
     my ($pasteform,$form_start,$buttons,$form_end);                      my (%display,%deps); 
     if ($pasteitems) {                      for (my $i=0; $i<@pastemaps; $i++) {
         $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>';                          ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);
         $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post" onsubmit="return validateClipboard();">';                          my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);
         if (@pasteable) {                          my @subfolders = split(/,/,$subfolderstr);
             my $value = &mt('Paste to current folder');                          $deps{$lastdir} = \@subfolders;
             if ($container eq 'page') {                          my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);
                 $value = &mt('Paste to current page');                          my $depth = $depths{$lastdir} + 1;
             }                          my $offset = int($depth * 4);
             $buttons = '<input type="submit" name="pastemarked" value="'.$value.'" />'.('&nbsp;'x2);                          my $indent = ('&nbsp;' x $offset);
         }                          for (my $j=0; $j<@subfolders; $j++) {
         $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.('&nbsp;'x2);                              $depths{$subfolders[$j]} = $depth;
         if ($clipboardcount > 1) {                              $display{$subfolders[$j]} = 
             $buttons .=                                    '<tr><td>'.$indent.$subfoldertitles[$j].'&nbsp;</td>'.
                 '<span style="text-decoration:line-through">'.('&nbsp;'x20).'</span>'.('&nbsp;'x2).                                    '<td><label>'.
                 '<input type="button" name="checkallclip" value="'.&mt('Check all').'" style="height:20px;" onclick="checkClipboard();" />'.                                    '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.('&nbsp;' x2).
                 ('&nbsp;'x2).                                    '<label>'.
                 '<input type="button" name="uncheckallclip" value="'.&mt('Uncheck all').'" style="height:20px;" onclick="uncheckClipboard();" />'.                                    '<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="move" />'.
                 ('&nbsp;'x2);                                    &mt('Move old').'</label>'.
         }                                    '</td></tr>';
         $form_end = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'.                          }
                     '</form>';                      }
     } else {                      &recurse_print($r,$parent,\%deps,\%display);
         $pasteitems = &mt('Clipboard is empty');                      $r->print('</table>');
     }                  }
     $r->print($form_start                  $r->print('</div>');
              .'<fieldset>'              }
              .'<legend>'.&mt('Clipboard').('&nbsp;' x2).$buttons.'</legend>'          }
              .$pasteitems          $r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs);
              .'</fieldset>'          $r->print('
              .$form_end);          <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
 }  ');
           $r->print('</form>');
 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 />'.  
                  '<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>';      $r->print('</fieldset>');
     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 1392  sub supp_pasteable { Line 792  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;  
 }  
   
 function showOptions(caller,suffix) {  
     if (document.getElementById('pasteoptionstext_'+suffix)) {  
         if (caller.checked) {  
             document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$html_js_lt{'show'}</a>';  
         } else {  
             document.getElementById('pasteoptionstext_'+suffix).innerHTML ='';  
         }  
         if (document.getElementById('pasteoptions_'+suffix)) {  
             document.getElementById('pasteoptions_'+suffix).style.display='none';  
         }  
     }  
     return;      return;
 }  }
   
 function validateClipboard() {  function hidePasteOptions() {
     var numchk = 0;      document.getElementById('pasteoptions').style.display='none';
     if (document.pasteform.pasting.length > 1) {      document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>';
         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 1475  END Line 816  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 1735  sub do_paste_from_buffer { Line 1046  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 1957  sub get_newmap_url { Line 1126  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 2089  sub contained_map_check { Line 1180  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 2113  sub contained_map_check { Line 1204  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 2143  sub url_paste_fixups { Line 1242  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 2161  sub url_paste_fixups { Line 1260  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 2183  sub url_paste_fixups { Line 1281  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 2223  sub url_paste_fixups { Line 1310  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 2245  sub url_paste_fixups { Line 1331  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 2324  sub apply_fixups { Line 1361  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 2341  sub apply_fixups { Line 1378  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 2352  sub apply_fixups { Line 1389  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 2379  sub apply_fixups { Line 1416  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 2490  sub apply_fixups { Line 1525  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 2500  sub apply_fixups { Line 1532  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 2585  my %parameter_type = ( 'randompick' Line 1615  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 2728  sub handle_edit_cmd { Line 1664  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 2736  sub handle_edit_cmd { Line 1673  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 2745  sub handle_edit_cmd { Line 1681  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,$canedit,$navmapref,          $supplementalflag,$orderhash,$iconpath,$pathitem)=@_;
         $hiddentop)=@_;  
     my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container);      my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container);
     if ($allowed) {      if ($allowed) {
         (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,          (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,
Line 2759  sub editor { Line 1694  sub editor {
         $container = 'sequence';          $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;
     }      }
   
     my ($errtext,$fatal);      my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
     if (($folder eq '') && (!$supplementalflag)) {      $folder.'.'.$container);
         if (@LONCAPA::map::order) {      return $errtext if ($fatal);
             undef(@LONCAPA::map::order);  
             undef(@LONCAPA::map::resources);  
             undef(@LONCAPA::map::resparms);  
             undef(@LONCAPA::map::zombies);  
         }  
         $folder = 'default';  
         $container = 'sequence';  
     } else {  
         ($errtext,$fatal) = &mapread($coursenum,$coursedom,  
                                      $folder.'.'.$container);  
         return $errtext if ($fatal);  
     }  
   
     if ($#LONCAPA::map::order<1) {      if ($#LONCAPA::map::order<1) {
  my $idx=&LONCAPA::map::getresidx();   my $idx=&LONCAPA::map::getresidx();
Line 2795  sub editor { Line 1714  sub editor {
 # ------------------------------------------------------------ Process commands  # ------------------------------------------------------------ Process commands
   
 # ---------------- if they are for this folder and user allowed to make changes  # ---------------- if they are for this folder and user allowed to make changes
     if (($allowed && $canedit) && ($env{'form.folder'} eq $folder)) {      if (($allowed) && ($env{'form.folder'} eq $folder)) {
 # set parameters and change order  # set parameters and change order
  &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 2815  sub editor { Line 1734  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 2852  sub editor { Line 1752  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($coursenum,$coursedom)) {  
             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 2945  sub editor { Line 1782  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 3039  sub editor { Line 1844  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 3057  sub editor { Line 1853  sub editor {
         $url=&LONCAPA::map::qtescape($url);          $url=&LONCAPA::map::qtescape($url);
         unless ($name) {  $name=(split(/\//,$url))[-1]; }          unless ($name) {  $name=(split(/\//,$url))[-1]; }
         unless ($name) { $idx++; next; }          unless ($name) { $idx++; next; }
         push(@allidx,$res);  
         if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {  
             push(@allmapidx,$res);  
         }  
   
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,          $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
                               $coursenum,$coursedom,$crstype,                                $coursenum,$coursedom,$crstype,
                               $pathitem,$supplementalflag,$container,                                $pathitem,$supplementalflag,$container);
                               \%filters,\%curr_groups,$canedit,  
                               $isencrypted,$navmapref);  
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
     &Apache::loncommon::end_data_table_count();      &Apache::loncommon::end_data_table_count();
   
     my $need_save;      if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {
     if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {          my $toolslink = '<table><tr><td>'
         my $toolslink;  
         if ($allowed) {  
             $toolslink = '<table><tr><td>'  
                        .&Apache::loncommon::help_open_menu('Navigation Screen',                         .&Apache::loncommon::help_open_menu('Navigation Screen',
                                                            'Navigation_Screen',undef,'RAT')                                                             'Navigation_Screen',undef,'RAT')
                        .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'                         .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'
                        .'<td align="left"><ul id="LC_toolbar">'                         .'<td align="left"><ul id="LC_toolbar">'
                        .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '                         .'<li><a href="/adm/coursedocs?forcesupplement=1" '
                        .'id="LC_content_toolbar_edittoplevel" '                         .'id="LC_content_toolbar_edittoplevel" '
                        .'class="LC_toolbarItem" '                         .'class="LC_toolbarItem" '
                        .'title="'.&mt('Supplemental Content Editor').'">'                         .'title="'.&mt('Supplemental Content Editor').'">'
                        .'</a></li></ul></td></tr></table><br />';                         .'</a></li></ul></td></tr></table><br />';
         }  
         if ($shown) {          if ($shown) {
             if ($allowed) {              if ($allowed) {
                 $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')                  $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
                           .&Apache::loncommon::start_data_table(undef,'contentlist')                            .&Apache::loncommon::start_data_table(undef,'contentlist')
                           .&Apache::loncommon::start_data_table_header_row()                            .&Apache::loncommon::start_data_table_header_row()
                           .'<th colspan="2">'.&mt('Move').'</th>'                            .'<th colspan="2">'.&mt('Move').'</th>'
                           .'<th 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,$canedit).  
                                 '</td>'.  
                                 '<td>&nbsp;</td>'.  
                                 '<td>&nbsp;</td>'.  
                                 '<td colspan="4">'.  
                                 &multiple_check_form('settings',\%lists,$canedit).  
                                 '</td>'.  
                                 &Apache::loncommon::end_data_table_row();  
                              $need_save = 1;  
                         }  
                     }  
                 }  
                 $to_show .= $output.' '  
                            .&Apache::loncommon::end_data_table()                             .&Apache::loncommon::end_data_table()
                            .'<br style="line-height:2px;" />'                             .'<br style="line-height:2px;" />'
                            .&Apache::loncommon::end_scrollbox();                             .&Apache::loncommon::end_scrollbox();
Line 3148  sub editor { Line 1898  sub editor {
             if (!$allowed) {              if (!$allowed) {
                 $to_show .= $toolslink;                  $to_show .= $toolslink;
             }              }
             my $noresmsg;  
             if ($allowed && $hiddentop && !$supplementalflag) {  
                 $noresmsg = &mt('Main Content Hidden');  
             } else {  
                 $noresmsg = &mt('Currently empty');  
             }  
             $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">'
                        .$noresmsg                         .&mt('Currently no documents.')
                        .'</div>'                         .'</div>'
                        .&Apache::loncommon::end_scrollbox();                         .&Apache::loncommon::end_scrollbox();
         }          }
Line 3169  sub editor { Line 1913  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 3179  sub editor { Line 1923  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",$canedit));                                         $readfile));
         if ($canedit) {          &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);
     }      }
     return;      return;
 }  }
   
 sub multiple_check_form {  
     my ($caller,$listsref,$canedit) = @_;  
     return unless (ref($listsref) eq 'HASH');  
     my $disabled;  
     unless ($canedit) {  
         $disabled = 'disabled="disabled"';  
     }  
     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'".')"'.$disabled.' />'.&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'".');"'.$disabled.' />'.&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'".')"'.$disabled.' />'.&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'".')"'.$disabled.' />'.&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'".')"'.$disabled.' />'.&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'".');"'.$disabled.' />'.&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'".')"'.$disabled.' />'.&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 3303  sub process_file_upload { Line 1951  sub process_file_upload {
             $container='page';              $container='page';
         }          }
         ($errtext,$fatal)=          ($errtext,$fatal)=
             &mapread($coursenum,$coursedom,$folder.'.'.$container);                &mapread($coursenum,$coursedom,$folder.'.'.$container);
         if ($#LONCAPA::map::order<1) {          if ($#LONCAPA::map::order<1) {
             $LONCAPA::map::order[0]=1;              $LONCAPA::map::order[0]=1;
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
           if ($fatal) {
               $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';
               return;
           }
         my $destination = 'docs/';          my $destination = 'docs/';
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
             $destination = 'supplemental/';              $destination = 'supplemental/';
Line 3317  sub process_file_upload { Line 1969  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 3382  sub process_file_upload { Line 2030  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();
Line 3444  sub is_supplemental_title { Line 2091  sub is_supplemental_title {
   
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,          $crstype,$pathitem,$supplementalflag,$container)=@_;
         $canedit,$isencrypted,$navmapref)=@_;      my ($foldertitle,$renametitle);
     my ($foldertitle,$renametitle,$oldtitle);  
     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);
     } else {      } else {
Line 3455  sub entryline { Line 2101  sub entryline {
  $foldertitle=$title;   $foldertitle=$title;
     }      }
   
     my ($disabled,$readonly,$js_lt);  
     unless ($canedit) {  
         $disabled = 'disabled="disabled"';  
         $readonly = 1;  
     }  
   
     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 ($type, $esc_path, $path, $symb);
       if ($container eq 'page') {
           $type = 'page';
       } else {
           $type = 'folder';
       }
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
  $esc_path=&escape($env{'form.folderpath'});   $esc_path=&escape($env{'form.folderpath'});
  $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
Line 3494  sub entryline { Line 2136  sub entryline {
                                                  &Apache::lonnet::declutter($currurl));                                                   &Apache::lonnet::declutter($currurl));
         }          }
     }      }
     my ($renamelink,%lt,$ishash);      my ($renamelink,%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 3524  END Line 2149  END
      ne '')) {       ne '')) {
     $selectbox=      $selectbox=
  '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.   '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
  '<select name="newpos" onchange="this.form.submit()"'.$disabled.'>';   '<select name="newpos" onchange="this.form.submit()">';
     for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {      for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
  if ($i==$incindex) {   if ($i==$incindex) {
     $selectbox.='<option value="" selected="selected">('.$i.')</option>';      $selectbox.='<option value="" selected="selected">('.$i.')</option>';
Line 3546  END Line 2171  END
                 'pr' => 'Preview',                  'pr' => 'Preview',
                 'sv' => 'Save',                  'sv' => 'Save',
                 'ul' => 'URL',                  'ul' => 'URL',
                 'ti' => 'Title',                  'ti' => 'Title', 
                 'er' => 'Editing rights unavailable for your current role.',    
                 );                  );
  my %denied = &action_restrictions($coursenum,$coursedom,$url,   my $nocopy=0;
                                           $env{'form.folderpath'},          my $nocut=0;
                                           $currgroups);          my $noremove=0;
           if ($url=~ m{^/res/.+\.(page|sequence)$}) {
       # no copy for published maps
       $nocopy=1;
    }
           if ($url=~/^\/res\/lib\/templates\//) {
              $nocopy=1;
              $nocut=1;
           }
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           if ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {
               if ($env{'form.folderpath'} =~ /^default&[^\&]+$/) {
                   my %curr_groups = &Apache::longroup::coursegroups();
                   if (keys(%curr_groups) > 0) {
                       $noremove=1;
                   }
                   $nocut=1;
                   $nocopy=1;
               }
           } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) {
               my $group = $1;
               if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) {
                   my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
                   if (keys(%curr_group) > 0) {
                       $noremove=1;
                   }
               }
               $nocut=1;
               $nocopy=1;
           } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) {
               my $group = $1;
               if ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) {
                   my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
                   my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});
                   if (keys(%groupsettings) > 0) {
                       $noremove=1;
                   }
                   $nocut=1;
                   $nocopy=1;
               }
           } elsif ($env{'form.folderpath'} =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) {
               my $group = $1;
               my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
               if ($url =~ /group_boards_\Q$group\E/) {
                   my %curr_group = &Apache::longroup::coursegroups($cdom,$cnum,$group);
                   my %groupsettings = &Apache::longroup::get_group_settings($curr_group{$group});
                   if (keys(%groupsettings) > 0) {
                       if (ref($groupsettings{'functions'}) eq 'HASH') {
                           if ($groupsettings{'functions'}{'discussion'} eq 'on') {
                               $noremove=1;
                           }
                       }
                   }
                   $nocut=1;
                   $nocopy=1;
               }
           }
         my ($copylink,$cutlink,$removelink);          my ($copylink,$cutlink,$removelink);
  my $skip_confirm = 0;   my $skip_confirm = 0;
         my $confirm_removal = 0;  
  if ( $folder =~ /^supplemental/   if ( $folder =~ /^supplemental/
      || ($url =~ m{( /smppg$       || ($url =~ m{( /smppg$
     |/syllabus$      |/syllabus$
Line 3565  END Line 2245  END
              || $isexternal) {               || $isexternal) {
     $skip_confirm = 1;      $skip_confirm = 1;
  }   }
         if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&  
             ($url!~/$LONCAPA::assess_page_seq_re/)) {  
             $confirm_removal = 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','$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" $disabled /><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','$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" $disabled /><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,'$container','$folder',$confirm_removal);";  
             $removelink=(<<ENDREM);              $removelink=(<<ENDREM);
 <form name="$formname" method="post" action="/adm/coursedocs">  <a href='javascript:removeres("$esc_path","$index","$renametitle",$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="hidden" name="confirm_rem_$orderidx" id="confirm_removal_$orderidx" value="$confirm_removal" />  
 <input type="checkbox" name="remove" id="remove_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','remove');" class="LC_hidden" $disabled /><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);          unless ($isexternal) {
 <a href='javascript:changename("$esc_path","$index","$oldtitle");' class="LC_docs_rename">$lt{'rn'}</a>              $renamelink=(<<ENDREN);
   <a href='javascript:changename("$esc_path","$index","$renametitle");' class="LC_docs_rename">$lt{'rn'}</a>
 ENDREN  ENDREN
         my ($uplink,$downlink);  
         if ($canedit) {  
             $uplink = "/adm/coursedocs?cmd=up_$index&amp;folderpath=$esc_path&amp;symb=$symb";  
             $downlink = "/adm/coursedocs?cmd=down_$index&amp;folderpath=$esc_path&amp;symb=$symb";  
         } else {  
             $uplink = "javascript:alert('".&js_escape($lt{'er'})."');";  
             $downlink = $uplink;  
         }          }
    $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="$uplink">    <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="$downlink">    <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
 $cutlink  $cutlink
 $copylink  $copylink
   </span>
 </td>  </td>
 END  END
   
     }      }
 # Figure out what kind of a resource this is  # Figure out what kind of a resource this is
     my ($extension)=($url=~/\.(\w+)$/);      my ($extension)=($url=~/\.(\w+)$/);
Line 3669  END Line 2323  END
     my $isfolder;      my $isfolder;
     my $ispage;      my $ispage;
     my $containerarg;      my $containerarg;
     my $folderurl;  
     if ($uploaded) {      if ($uploaded) {
         if (($extension eq 'sequence') || ($extension eq 'page')) {          if (($extension eq 'sequence') || ($extension eq 'page')) {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;              $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
Line 3681  END Line 2334  END
                 $icon=$iconpath.'page.gif';                  $icon=$iconpath.'page.gif';
                 $ispage=1;                  $ispage=1;
             }              }
             $folderurl = &Apache::lonnet::declutter($url);  
             if ($allowed) {              if ($allowed) {
                 $url='/adm/coursedocs?';                  $url='/adm/coursedocs?';
             } else {              } else {
Line 3692  END Line 2344  END
  }   }
     }      }
   
     my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);      my ($editlink,$extresform);
     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/};
Line 3710  END Line 2362  END
         } elsif ($url!~/\.(sequence|page)$/) {          } elsif ($url!~/\.(sequence|page)$/) {
     $url='/adm/coursedocs/showdoc'.$url;      $url='/adm/coursedocs/showdoc'.$url;
         }          }
             } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {      } elsif ($url=~m|^/ext/|) {
                 my $wrapped = $1;          $url='/adm/wrapper'.$url;
                 my $exturl = $2;  
                 if ($wrapped eq '') {  
                     $url='/adm/wrapper'.$url;  
                 }  
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {  
                     $nomodal = 1;  
                 }  
             } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {  
                 if (($ENV{'SERVER_PORT'} == 443) &&  
                     ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                     $nomodal = 1;  
                 }  
     }      }
             if (&Apache::lonnet::symbverify($symb,$url)) {              if (&Apache::lonnet::symbverify($symb,$url)) {
                 my $shownsymb = $symb;          $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                 if ($isexternal) {  
                     if ($url =~ /^([^#]+)#([^#]+)$/) {  
                         $url = $1;  
                         $anchor = $2;  
                         if ($symb =~ m{^([^#]+)\Q#$anchor\E$}) {  
                             $shownsymb = $1.&escape('#').$anchor;  
                         }  
                     }  
                 }  
                 unless ($env{'request.role.adv'}) {  
                     if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {  
                         $url = '';  
                     }  
                     if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) {  
                         $url = '';  
                         $hiddenres = 1;  
                     }  
                 }  
                 if ($url ne '') {  
                     $url.=(($url=~/\?/)?'&':'?').'symb='.&HTML::Entities::encode($shownsymb,'"<>&');  
                 }  
             } elsif (!$env{'request.role.adv'}) {  
                 my $checkencrypt;  
                 if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||  
                       $isencrypted || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {  
                     $checkencrypt = 1;  
                 } elsif (ref($navmapref)) {  
                     unless (ref($$navmapref)) {  
                         $$navmapref = Apache::lonnavmaps::navmap->new();  
                     }  
                     if (ref($$navmapref)) {  
                         if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') {  
                             $checkencrypt = 1;  
                         }  
                     }  
                 }  
                 if ($checkencrypt) {  
                     my $shownsymb = &Apache::lonenc::encrypted($symb);  
                     my $shownurl = &Apache::lonenc::encrypted($url);  
                     if (&Apache::lonnet::symbverify($shownsymb,$shownurl)) {  
                         $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&HTML::Entities::encode($shownsymb,'"<>&');  
                         if ($env{'request.enc'} ne '') {  
                             delete($env{'request.enc'});  
                         }  
                     } else {  
                         $url='';  
                     }  
                 } else {  
                     $url='';  
                 }  
             } else {              } else {
                 $url='';                  $url='';
             }              }
  }   }
     } elsif ($supplementalflag) {  
         if ($isexternal) {  
             if ($url =~ /^([^#]+)#([^#]+)$/) {  
                 $url = $1;  
                 $anchor = $2;  
                 if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {  
                     $nomodal = 1;  
                 }  
             }  
         } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {  
             if (($ENV{'SERVER_PORT'} == 443) &&  
                 ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                 $nomodal = 1;  
             }  
         }  
     }      }
     my ($rand_pick_text,$rand_order_text,$hiddenfolder);      my ($rand_pick_text,$rand_order_text);
     my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };  
     if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') {      if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') {
  my $foldername=&escape($foldertitle);   my $foldername=&escape($foldertitle);
  my $folderpath=$env{'form.folderpath'};   my $folderpath=$env{'form.folderpath'};
Line 3807  END Line 2381  END
             $folderpath.=$containerarg.'&'.$foldername;              $folderpath.=$containerarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);              $url.='folderpath='.&escape($folderpath);
         } else {          } else {
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,  
                                                         'parameter_randompick'))[0];  
             my $randorder = ((&LONCAPA::map::getparameter($orderidx,  
                                               'parameter_randomorder'))[0]=~/^yes$/i);  
             my $hiddenmap = ((&LONCAPA::map::getparameter($orderidx,  
                                               'parameter_hiddenresource'))[0]=~/^yes$/i);  
             my $encryptmap = ((&LONCAPA::map::getparameter($orderidx,  
                                               'parameter_encrypturl'))[0]=~/^yes$/i);  
             unless ($hiddenmap) {  
                 if (ref($navmapref)) {  
                     unless (ref($$navmapref)) {  
                         $$navmapref = Apache::lonnavmaps::navmap->new();  
                     }  
                     if (ref($$navmapref)) {  
                         if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {  
                             my @resources = $$navmapref->retrieveResources($folderurl,$filterFunc,1,1);  
                             unless (@resources) {  
                                 $hiddenmap = 1;  
                                 unless ($env{'request.role.adv'}) {  
                                     $url = '';  
                                     $hiddenfolder = 1;  
                                 }  
                             }  
                         }  
                     }  
                 }  
             }  
             unless ($encryptmap) {  
                 if ((ref($navmapref)) && (ref($$navmapref))) {  
                     if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.encrypturl")) eq 'yes') {  
                         $encryptmap = 1;  
                     }  
                 }  
             }  
   
 # 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.=$containerarg.'&'.$foldername.
                          ':'.$rpicknum.':'.$hiddenmap.':'.$encryptmap.':'.$randorder.':'.$ispage;                                                ':'.(&LONCAPA::map::getparameter($orderidx,
             unless ($url eq '') {                                                'parameter_randompick'))[0]
                 $url.='folderpath='.&escape($folderpath);                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
             }                                                'parameter_hiddenresource'))[0]=~/^yes$/i)
                                                  .':'.((&LONCAPA::map::getparameter($orderidx,
                                                 'parameter_encrypturl'))[0]=~/^yes$/i)
                                                  .':'.((&LONCAPA::map::getparameter($orderidx,
                                                 'parameter_randomorder'))[0]=~/^yes$/i)
                                                  .':'.$ispage;
       $url.='folderpath='.&escape($folderpath);
               my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
                                                           '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.$disabled.' /> '.&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 ($randorder) {  
                 $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.$disabled.' /> '.&mt('Random Order').' </label></span>'.  
 $form_end;  
         }          }
     } elsif ($supplementalflag && !$allowed) {      } elsif ($supplementalflag && !$allowed) {
         $url .= ($url =~ /\?/) ? '&amp;':'?';          $url .= ($url =~ /\?/) ? '&amp;':'?';
Line 3891  $form_end; Line 2425  $form_end;
         if ($isexternal && $orderidx) {          if ($isexternal && $orderidx) {
             $url .= '&amp;idx='.$orderidx;              $url .= '&amp;idx='.$orderidx;
         }          }
         if ($anchor ne '') {  
             $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');  
         }  
     }      }
     my ($tdalign,$tdwidth);      my ($tdalign,$tdwidth);
     if ($allowed) {      if ($allowed) {
Line 3901  $form_end; Line 2432  $form_end;
             &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));              &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));
         if ($isexternal) {          if ($isexternal) {
             ($editlink,$extresform) =               ($editlink,$extresform) = 
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,                  &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem);
                                                      undef,undef,undef,$disabled);  
         } elsif (!$isfolder && !$ispage) {          } elsif (!$isfolder && !$ispage) {
             my ($cfile,$home,$switchserver,$forceedit,$forceview) =               my ($cfile,$home,$switchserver,$forceedit,$forceview) = 
                 &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);                  &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);
             if (($cfile ne '') && ($symb ne '' || $supplementalflag)) {              if (($cfile ne '') && ($symb ne '' || $supplementalflag)) {
                 my $suppanchor;  
                 if ($supplementalflag) {  
                     $suppanchor = $anchor;  
                 }  
                 my $jscall =                   my $jscall = 
                     &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,                      &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,
                                                             $switchserver,                                                              $switchserver,
                                                             $forceedit,                                                              $forceedit,
                                                             undef,$symb,                                                              undef,$symb,
                                                             &escape($env{'form.folderpath'}),                                                              &escape($env{'form.folderpath'}),
                                                             $renametitle,'','',1,$suppanchor);                                                              $renametitle);
                 if ($jscall) {                  if ($jscall) {
                     $editlink = '<a class="LC_docs_ext_edit" href="javascript:'.                      $editlink = '<a class="LC_docs_ext_edit" href="javascript:'.
                                 $jscall.'" >'.&mt('Edit').'</a>&nbsp;'."\n";                                  $jscall.'" >'.&mt('Edit').'</a>&nbsp;'."\n";
Line 3934  $form_end; Line 2460  $form_end;
         $reinit = &mt('(re-initialize course to access)');          $reinit = &mt('(re-initialize course to access)');
     }      }
     $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;      $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;
     my $link;  
     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) {
        if ($anchor ne '') {         $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes',
            if ($supplementalflag) {                                               '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500);
                $anchor = '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');  
            } else {  
                $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&');  
            }  
        }  
        $link = &js_escape($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.  
                                                (($anchor ne '')?$anchor:''));  
        if ($nomodal) {  
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.  
                   '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>';  
        } else {  
            $line.=&Apache::loncommon::modal_link($link,  
                                                  '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500);  
        }  
     } else {      } else {
        $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';         $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
     }      }
Line 3961  $form_end; Line 2472  $form_end;
     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) {
        if ($nomodal) {         $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes',
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.                                               $title,600,500);
                   $title.'</a>';  
        } else {  
            $line.=&Apache::loncommon::modal_link($link,$title,600,500);  
        }  
     } elsif (($hiddenfolder) || ($hiddenres)) {  
        $line.=$title.' <span class="LC_warning LC_docs_reinit_warn">'.&mt('(Hidden)').'</span>';  
     } else {      } else {
        $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';         $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';
     }      }
Line 3979  $form_end; Line 2484  $form_end;
   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 $disabled /> $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 $disabled /> $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 4016  ENDPARMS Line 2508  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 4305  sub list_symbs { Line 2690  sub list_symbs {
 sub verifycontent {  sub verifycontent {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' 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 4340  sub devalidateversioncache { Line 2725  sub devalidateversioncache {
 }  }
   
 sub checkversions {  sub checkversions {
     my ($r,$canedit) = @_;      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 4361  sub checkversions { Line 2746  sub checkversions {
   
     $hashtied=0;      $hashtied=0;
     &tiehash();      &tiehash();
     if ($canedit) {      my %newsetversions=();
         my %newsetversions=();      if ($env{'form.setmostrecent'}) {
         if ($env{'form.setmostrecent'}) {   $haschanged=1;
     $haschanged=1;   foreach my $key (keys(%hash)) {
     foreach my $key (keys(%hash)) {      if ($key=~/^ids\_(\/res\/.+)$/) {
         if ($key=~/^ids\_(\/res\/.+)$/) {   $newsetversions{$1}='mostrecent';
     $newsetversions{$1}='mostrecent';                  &devalidateversioncache($1);
                     &devalidateversioncache($1);  
         }  
     }  
         } elsif ($env{'form.setcurrent'}) {  
     $haschanged=1;  
     foreach my $key (keys(%hash)) {  
         if ($key=~/^ids\_(\/res\/.+)$/) {  
     my $getvers=&Apache::lonnet::getversion($1);  
     if ($getvers>0) {  
         $newsetversions{$1}=$getvers;  
         &devalidateversioncache($1);  
     }  
         }  
     }      }
         } elsif ($env{'form.setversions'}) {   }
     $haschanged=1;      } elsif ($env{'form.setcurrent'}) {
     foreach my $key (keys(%env)) {   $haschanged=1;
         if ($key=~/^form\.set_version_(.+)$/) {   foreach my $key (keys(%hash)) {
     my $src=$1;      if ($key=~/^ids\_(\/res\/.+)$/) {
     if (($env{$key}) && ($env{$key} ne $setversions{$src})) {   my $getvers=&Apache::lonnet::getversion($1);
         $newsetversions{$src}=$env{$key};   if ($getvers>0) {
         &devalidateversioncache($src);      $newsetversions{$1}=$getvers;
     }      &devalidateversioncache($1);
         }   }
     }      }
         }   }
         if ($haschanged) {      } elsif ($env{'form.setversions'}) {
             if (&Apache::lonnet::put('resourceversions',\%newsetversions,   $haschanged=1;
       $env{'course.'.$env{'request.course.id'}.'.domain'},   foreach my $key (keys(%env)) {
       $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {      if ($key=~/^form\.set_version_(.+)$/) {
         $r->print(&Apache::loncommon::confirmwrapper(   my $src=$1;
                     &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved'))));   if (($env{$key}) && ($env{$key} ne $setversions{$src})) {
     } else {      $newsetversions{$src}=$env{$key};
         $r->print(&Apache::loncommon::confirmwrapper(      &devalidateversioncache($src);
                     &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1)));   }
     }      }
     &mark_hash_old();   }
         }      }
         &changewarning($r,'');      if ($haschanged) {
           if (&Apache::lonnet::put('resourceversions',\%newsetversions,
     $env{'course.'.$env{'request.course.id'}.'.domain'},
     $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
       $r->print(&Apache::loncommon::confirmwrapper(
                   &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved'))));
    } else {
       $r->print(&Apache::loncommon::confirmwrapper(
                   &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1)));
    }
    &mark_hash_old();
     }      }
       &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=' selected="selected"';
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^ids\_(\/res\/.+)$/) {      if ($key=~/^ids\_(\/res\/.+)$/) {
Line 4474  sub checkversions { Line 2857  sub checkversions {
        'save' => 'Save changes',         'save' => 'Save changes',
                'vers' => 'Version choice(s) for specific resources',                  'vers' => 'Version choice(s) for specific resources', 
        'act' => 'Actions');         'act' => 'Actions');
     my ($disabled,$readonly);  
     unless ($canedit) {  
         $disabled = 'disabled="disabled"';  
         $readonly = 1;  
     }  
     $r->print(<<ENDHEADERS);      $r->print(<<ENDHEADERS);
 <h4 class="LC_info">$header</h4>  <h4 class="LC_info">$header</h4>
 <form action="/adm/coursedocs" method="post">  <form action="/adm/coursedocs" method="post">
Line 4499  sub checkversions { Line 2877  sub checkversions {
 <div class="LC_left_float">  <div class="LC_left_float">
 <fieldset>  <fieldset>
 <legend>$lt{'act'}</legend>  <legend>$lt{'act'}</legend>
 $lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" $disabled /><br />  $lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" /><br />
 $lt{'sc'}: <input type="submit" name="setcurrent" value="Go" $disabled />  $lt{'sc'}: <input type="submit" name="setcurrent" value="Go" />
 </fieldset>  </fieldset>
 </div>  </div>
 <br clear="all" />  <br clear="all" />
 <hr />  <hr />
 <h4>$lt{'vers'}</h4>  <h4>$lt{'vers'}</h4>
   <input type="submit" name="setversions" value="$lt{'save'}" />
 ENDHEADERS  ENDHEADERS
     #number of columns for version history      #number of columns for version history
     my %changedbytime;  
     foreach my $key (keys(%changes)) {  
         #excludes not versionable problems from resource version history:  
         next if ($key =~ /^\/res\/lib\/templates/);  
         my $chg;  
         if ($env{'form.timerange'} eq 'all') {  
             my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);  
             $chg = &Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate');  
         } else {  
             $chg = $changes{$key};  
             next if ($chg < $starttime);  
         }  
         push(@{$changedbytime{$chg}},$key);  
     }  
     if (keys(%changedbytime) == 0) {  
         &untiehash();  
         $r->print(&mt('No content changes in imported content in specified time frame').  
                   &endContentScreen());  
         return;  
     }  
     $r->print(      $r->print(
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$disabled.' />'.  
         &Apache::loncommon::start_data_table().          &Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row().          &Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Resources').'</th>'.          '<th>'.&mt('Resources').'</th>'.
Line 4539  ENDHEADERS Line 2897  ENDHEADERS
         '<th>'.&mt('History').'</th>'.          '<th>'.&mt('History').'</th>'.
         &Apache::loncommon::end_data_table_header_row()          &Apache::loncommon::end_data_table_header_row()
     );      );
     foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) {      foreach my $key (sort(keys(%changes))) {
         foreach my $key (sort(@{$changedbytime{$chg}})) {          #excludes not versionable problems from resource version history:
             my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);          next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/);
             my $currentversion=&Apache::lonnet::getversion($key);          my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
             if ($currentversion<0) {          my $currentversion=&Apache::lonnet::getversion($key);
                 $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';          if ($currentversion<0) {
             }              $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';
             my $linkurl=&Apache::lonnet::clutter($key);          }
             $r->print(          my $linkurl=&Apache::lonnet::clutter($key);
                 &Apache::loncommon::start_data_table_row().          $r->print(
                 '<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          );
             my $usedversion=$hash{'version_'.$linkurl};          # Used in course
             if (($usedversion) && ($usedversion ne 'mostrecent')) {          my $usedversion=$hash{'version_'.$linkurl};
           if (($usedversion) && ($usedversion ne 'mostrecent')) {
                 if ($usedversion != $currentversion) {                  if ($usedversion != $currentversion) {
                     $r->print('<span class="LC_warning">'.$usedversion.'</span>');                      $r->print('<span class="LC_warning">'.$usedversion.'</span>');
                 } else {                  } else {
Line 4566  ENDHEADERS Line 2925  ENDHEADERS
             } else {              } else {
                 $r->print($currentversion);                  $r->print($currentversion);
             }              }
             $r->print('</td><td title="'.$lt{'vu'}.'">');          $r->print('</td><td title="'.$lt{'vu'}.'">');
             # Set version          # Set version
             $r->print(&Apache::loncommon::select_form(          $r->print(&Apache::loncommon::select_form(
                       $setversions{$linkurl},              $setversions{$linkurl},
                       'set_version_'.$linkurl,              'set_version_'.$linkurl,
                       {'select_form_order' => ['',1..$currentversion,'mostrecent'],              {'select_form_order' => ['',1..$currentversion,'mostrecent'],
                        '' => '',               '' => '',
                        'mostrecent' => &mt('most recent'),               'mostrecent' => &mt('most recent'),
                        map {$_,$_} (1..$currentversion)},'',$readonly));               map {$_,$_} (1..$currentversion)}));
             my $lastold=1;          my $lastold=1;
             for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {          for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                 my $url=$root.'.'.$prevvers.'.'.$extension;              my $url=$root.'.'.$prevvers.'.'.$extension;
                 if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {              if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {
                     $lastold=$prevvers;                  $lastold=$prevvers;
                 }              }
             }          }
             $r->print('</td>');          $r->print('</td>');
             # List all available versions          # List all available versions
             $r->print('<td valign="top"><span class="LC_fontsize_medium">');          $r->print('<td valign="top"><span class="LC_fontsize_medium">');
             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {          for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
                 my $url=$root.'.'.$prevvers.'.'.$extension;              my $url=$root.'.'.$prevvers.'.'.$extension;
                 $r->print(              $r->print(
                     '<span class="LC_nobreak">'                  '<span class="LC_nobreak">'
                    .'<a href="'.&Apache::lonnet::clutter($url).'">'                 .'<a href="'.&Apache::lonnet::clutter($url).'">'
                    .&mt('Version [_1]',$prevvers).'</a>'                 .&mt('Version [_1]',$prevvers).'</a>'
                    .' ('.&Apache::lonlocal::locallocaltime(                 .' ('.&Apache::lonlocal::locallocaltime(
                          &Apache::lonnet::metadata($url,'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).
                         &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').                      &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').
                         '" target="diffs">'.&mt('Diffs').'</a>');                      '" target="diffs">'.&mt('Diffs').'</a>');
                 }  
                 $r->print('</span><br />');  
             }              }
             $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());              $r->print('</span><br />');
         }          }
           $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());
     }      }
     $r->print(      $r->print(
         &Apache::loncommon::end_data_table().          &Apache::loncommon::end_data_table().
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$disabled.' />'.          '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'.
         '</form>'          '</form>'
     );      );
   
     &untiehash();      &untiehash();
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
     return;  
 }  }
   
 sub mark_hash_old {  sub mark_hash_old {
Line 4669  $help{'Caching'}.'</p></form>'."\n\n"); Line 3026  $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 4711  sub startContentScreen { Line 3068  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 4734  sub endContentScreen { Line 3092  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 4758  sub handler { Line 3116  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 4767  sub handler { Line 3125  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,$canedit,$canview,$disabled);      
       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') {
         # does this user have privileges to modify content.            # does this user have privileges to modify content.  
         if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {          $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
             $allowed = 1;  
             $canedit = 1;  
             $canview = 1;  
         } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) {  
             $allowed = 1;  
             $canview = 1;  
         }  
     }      }
     unless ($canedit) {  
         $disabled = ' disabled="disabled"';      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver',
     }                                              'inhibitmenu']);
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);    if ($allowed && $env{'form.chooseserver'}) {
   if ($allowed && $env{'form.verify'}) {        &choose_dump_server($r);
       &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content');        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 4803  sub handler { Line 3159  sub handler {
       if ($folder eq '') {        if ($folder eq '') {
           $folder='default';            $folder='default';
       }        }
       &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit);        &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,$canedit);        &checkversions($r);
   } elsif ($canedit && $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 4834  sub handler { Line 3190  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 "")) {
        $supplementalflag=0;         $supplementalflag=0;
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
Line 4852  sub handler { Line 3208  sub handler {
     my $container;      my $container;
     my $containertag;      my $containertag;
     my $pathitem;      my $pathitem;
     my $hiddentop;  
     my $navmap;  
     my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };  
   
 # 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'}=             $env{'form.folderpath'}=
                &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap);                 &Apache::loncommon::symb_to_docspath($env{'form.symb'});
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>  
                $env{'form.command'}.'_'.$env{'form.symb'}});  
        } elsif ($env{'form.supppath'} ne '') {         } elsif ($env{'form.supppath'} ne '') {
            $env{'form.folderpath'}=$env{'form.supppath'};             $env{'form.folderpath'}=$env{'form.supppath'};
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>  
                $env{'form.command'}.'_'.$env{'form.supppath'}});  
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
        $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap);          $env{'form.folderpath'} = 'default&'.
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}});                                    &Apache::lonhtmlcommon::entity_encode('Main Course Content').
                                     ':::::';
    } elsif ($env{'form.command'} eq 'editsupp') {     } elsif ($env{'form.command'} eq 'editsupp') {
        $env{'form.folderpath'} = &supplemental_base();          $env{'form.folderpath'} = 'default&'.
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'});                                    &Apache::lonhtmlcommon::entity_encode('Supplemental Content');
    } elsif ($env{'form.command'} eq 'contents') {  
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'});  
    } elsif ($env{'form.command'} eq 'home') {  
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/menu'});  
    }     }
   
   
 # Where do we store these for when we come back?  # Where do we store these for when we come back?
     my $stored_folderpath='docs_folderpath';      my $stored_folderpath='docs_folderpath';
     if ($supplementalflag) {      if ($supplementalflag) {
Line 4891  sub handler { Line 3238  sub handler {
     if ((!$env{'form.folderpath'}) && $allowed) {      if ((!$env{'form.folderpath'}) && $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)&}) {
         if (&unescape($env{'form.folderpath'}) =~ m{^(default|supplemental)&}) {  
             if ($supplementalflag) {  
                 undef($env{'form.folderpath'}) if ($1 eq 'default');  
             } else {  
                 undef($env{'form.folderpath'}) if ($1 eq 'supplemental');  
             }  
         } else {  
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         }          }
     }      }
Line 4915  sub handler { Line 3255  sub handler {
                                   .'&'.                                    .'&'.
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
 # If allowed and user's role is not advanced check folderpath is not hidden  
     if (($allowed) && (!$env{'request.role.adv'}) &&  
         ($env{'form.folderpath'} ne '') && (!$supplementalflag)) {  
         my $folderurl;  
         my @pathitems = split(/\&/,$env{'form.folderpath'});  
         my $folder = $pathitems[-2];  
         if ($folder eq '') {  
             undef($env{'form.folderpath'});  
         } else {  
             $folderurl = "uploaded/$coursedom/$coursenum/$folder";  
             if ((split(/\:/,$pathitems[-1]))[4]) {  
                 $folderurl .= '.page';  
             } else {  
                 $folderurl .= '.sequence';  
             }  
             unless (ref($navmap)) {  
                 $navmap = Apache::lonnavmaps::navmap->new();  
             }  
             if (ref($navmap)) {  
                 if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {  
                     my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);  
                     unless (@resources) {  
                         undef($env{'form.folderpath'});  
                     }  
                 }  
             }  
         }  
     }  
   
   
 # If after all of this, we still don't have any paths, make them  # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {      unless ($env{'form.folderpath'}) {
        if ($supplementalflag) {         if ($supplementalflag) {
           $env{'form.folderpath'}=&supplemental_base();            $env{'form.folderpath'}=&supplemental_base();
        } elsif ($allowed) {         } else {
           ($env{'form.folderpath'},$hiddentop) = &default_folderpath($coursenum,$coursedom,\$navmap);            $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Documents')).
                                     ':::::';
        }         }
     }      }
   
 # Store this  # Store this
     unless ($toolsflag) {      unless ($toolsflag) {
         if (($allowed) && ($env{'form.folderpath'} ne '')) {          if ($allowed) {
             &Apache::loncommon::store_course_settings($stored_folderpath,              &Apache::loncommon::store_course_settings($stored_folderpath,
                                                       {'folderpath' => 'scalar'});                                                        {'folderpath' => 'scalar'});
         }          }
Line 4974  sub handler { Line 3285  sub handler {
         } else {          } else {
             if ($env{'form.folder'} eq '' ||              if ($env{'form.folder'} eq '' ||
                 $env{'form.folder'} eq 'supplemental') {                  $env{'form.folder'} eq 'supplemental') {
                 if ($env{'form.folder'} eq 'supplemental') {                  $folderpath='default&'.
                     $folderpath=&supplemental_base();                              &escape(&mt('Main '.$crstype.' Documents')).
                 } elsif (!$hiddentop) {                              ':::::';
                     $folderpath='default&'.  
                                  &escape(&mt('Main Content').':::::');  
                 }  
             }              }
         }          }
         $containertag = '<input type="hidden" name="folderpath" value="" />';          $containertag = '<input type="hidden" name="folderpath" value="" />';
Line 4990  sub handler { Line 3298  sub handler {
         if ($showdoc) { # got called in sequence from course          if ($showdoc) { # got called in sequence from course
     $allowed=0;       $allowed=0; 
         } else {          } else {
             if ($canedit) {              if ($allowed) {
                 &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);                  &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                 $script=&Apache::lonratedt::editscript('simple');                  $script=&Apache::lonratedt::editscript('simple');
             }              }
Line 5016  sub handler { Line 3324  sub handler {
                 $script .= &dump_switchserver_js(@hosts);                   $script .= &dump_switchserver_js(@hosts); 
             }              }
         } else {          } else {
             my $tid = 1;  
             my @tabids;              my @tabids;
             if ($supplementalflag) {              if ($supplementalflag) {
                 @tabids = ('002','ee2','ff2');                  @tabids = ('002','ee2','ff2');
                 $tid = 2;  
             } else {              } else {
                 @tabids = ('aa1','bb1','cc1','ff1');                  @tabids = ('aa1','bb1','cc1','ff1');
                 unless ($env{'form.folderpath'} =~ /\:1$/) {                  unless ($env{'form.folderpath'} =~ /\:1$/) {
Line 5029  sub handler { Line 3335  sub handler {
                 }                  }
             }              }
             my $tabidstr = join("','",@tabids);              my $tabidstr = join("','",@tabids);
     $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,      $script .= &editing_js($udom,$uname,$supplementalflag).
                                    $canedit,\$navmap).  
                        &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 5058  sub handler { Line 3365  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) {  
         my ($breadtext,$breadtitle);  
         $breadtext = "$crstype Editor";  
         if ($canedit) {  
             $breadtitle = 'Editing '.$crstype.' Contents';  
         } else {  
             $breadtext .= ' (View-only mode)';  
             $breadtitle = 'Viewing '.$crstype.' Contents';  
         }  
         &Apache::lonhtmlcommon::add_breadcrumb({  
             href=>"/adm/coursedocs",text=>$breadtext});  
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script)  
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')  
                  .&Apache::lonhtmlcommon::breadcrumbs(  
                      $breadtitle)  
                  );  
     } 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,
                                                 {'bread_crumbs' => $brcrum,}));                                                  {'bread_crumbs' => $brcrum,}));
     } else {      } else {
         my ($breadtext,$breadtitle,$helpitem);  
         $breadtext = "$crstype Editor";  
         if ($canedit) {  
             $breadtitle = 'Editing '.$crstype.' Contents';  
             $helpitem = 'Docs_Adding_Course_Doc';  
         } else {  
             $breadtext .= ' (View-only mode)';  
             $breadtitle = 'Viewing '.$crstype.' Contents';  
             $helpitem = 'Docs_Viewing_Course_Doc';  
         }  
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             href=>"/adm/coursedocs",text=>$breadtext});              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}
                                                 )                                                  )
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')                   .&Apache::loncommon::help_open_menu('','',273,'RAT')
                  .&Apache::lonhtmlcommon::breadcrumbs(                   .&Apache::lonhtmlcommon::breadcrumbs(
                      $breadtitle,                       'Editing '.$crstype.' Contents',
                      $helpitem)                       'Docs_Adding_Course_Doc')
         );          );
     }      }
   
   my %allfiles = ();    my %allfiles = ();
   my %codebase = ();    my %codebase = ();
   my ($upload_result,$upload_output,$uploadphase);    my ($upload_result,$upload_output,$uploadphase);
   if ($canedit) {    if ($allowed) {
       if (($env{'form.uploaddoc.filename'}) &&        if (($env{'form.uploaddoc.filename'}) &&
   ($env{'form.cmd'}=~/^upload_(\w+)/)) {    ($env{'form.cmd'}=~/^upload_(\w+)/)) {
           my $context = $1;             my $context = $1; 
           # 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 5156  sub handler { Line 3438  sub handler {
   
   if ($allowed && $toolsflag) {    if ($allowed && $toolsflag) {
       $r->print(&startContentScreen('tools'));        $r->print(&startContentScreen('tools'));
       $r->print(&generate_admin_menu($crstype,$canedit));        $r->print(&generate_admin_menu($crstype));
       $r->print(&endContentScreen());        $r->print(&endContentScreen());
   } 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',  
                 'er' => 'Editing rights unavailable for your current role.',  
         );  
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
     # Calculate free quota space for a user or course.  
     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';  
     }  
     my $disk_quota = &Apache::loncommon::get_user_quota($coursenum,$coursedom,  
                      'course',$quotatype); # expressed in MB  
     my $current_disk_usage = 0;  
     foreach my $subdir ('docs','supplemental') {  
         $current_disk_usage += &Apache::lonnet::diskusage($coursedom,$coursenum,  
                                "userfiles/$subdir",1); # expressed in kB  
     }  
     my $free_space = 1024 * ((1024 * $disk_quota) - $current_disk_usage);  
     my $usage = $current_disk_usage/1024; # in MB  
     my $quota = $disk_quota;  
     my $percent;  
     if ($disk_quota == 0) {  
         $percent = 100.0;  
     } else {  
         $percent = 100*($usage/$disk_quota);  
     }  
     $usage = sprintf("%.2f",$usage);  
     $quota = sprintf("%.2f",$quota);  
     $percent = sprintf("%.0f",$percent);  
     my $quotainfo = '<p>'.&mt('Currently using [_1] of the [_2] available.',  
                               $percent.'%',$quota.' MB').'</p>';  
   
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
         $quotainfo  
  $lt{'file'}:<br />   $lt{'file'}:<br />
  <input type="file" name="uploaddoc" size="40" $disabled />   <input type="file" name="uploaddoc" size="40" />
 FIUP  FIUP
   
  my $checkbox=(<<CHBO);   my $checkbox=(<<CHBO);
Line 5241  FIUP Line 3493  FIUP
  <input type="checkbox" name="parserflag" />   <input type="checkbox" name="parserflag" />
  </label> -->   </label> -->
  <label>   <label>
  <input type="checkbox" name="parserflag" checked="checked" $disabled /> $lt{'parse'}   <input type="checkbox" name="parserflag" checked="checked" /> $lt{'parse'}
  </label>   </label>
 CHBO  CHBO
         my $imsfolder = $env{'form.folder'};          my $imsfolder = $env{'form.folder'};
Line 5258  CHBO Line 3510  CHBO
         <br />          <br />
         <p>          <p>
         $lt{'cms'}:&nbsp;           $lt{'cms'}:&nbsp; 
         <select name="source" $disabled>          <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>
         <input type="hidden" name="phase" value="one" />          <input type="hidden" name="phase" value="one" />
         <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" $disabled />          <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" />
         </fieldset>          </fieldset>
         </form>          </form>
 IMSFORM  IMSFORM
Line 5283  IMSFORM Line 3535  IMSFORM
  $fileupload   $fileupload
  <br />   <br />
  $lt{'title'}:<br />   $lt{'title'}:<br />
  <input type="text" size="60" name="comment" $disabled />   <input type="text" size="60" name="comment" />
  $pathitem   $pathitem
  <input type="hidden" name="cmd" value="upload_default" />   <input type="hidden" name="cmd" value="upload_default" />
  <br />   <br />
Line 5291  IMSFORM Line 3543  IMSFORM
  $checkbox   $checkbox
  </span>   </span>
         <br clear="all" />          <br clear="all" />
         <input type="submit" value="$lt{'upld'}" $disabled />          <input type="submit" value="$lt{'upld'}" />
         </fieldset>          </fieldset>
         </form>          </form>
 FUFORM  FUFORM
   
         my $mapimportjs;  
         if ($canedit) {  
             $mapimportjs = "javascript:openbrowser('mapimportform','importmap','sequence,page','');";  
         } else {  
             $mapimportjs = "javascript:alert('".&js_escape($lt{'er'})."');";  
         }  
  my $importpubform=(<<SEDFFORM);   my $importpubform=(<<SEDFFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleMap('map');">          <a class="LC_menubuttons_link" href="javascript:toggleMap('map');">
         $lt{'impm'}</a>$help{'Load_Map'}          $lt{'impm'}</a>$help{'Load_Map'}
Line 5312  FUFORM Line 3558  FUFORM
         $lt{'copm'}<br />          $lt{'copm'}<br />
         <span class="LC_nobreak">          <span class="LC_nobreak">
         <input type="text" name="importmap" size="40" value=""           <input type="text" name="importmap" size="40" value="" 
         onfocus="this.blur();$mapimportjs" $disabled />          onfocus="this.blur();openbrowser('mapimportform','importmap','sequence,page','');" />
         &nbsp;<a href="$mapimportjs">$lt{'selm'}</a></span><br />          &nbsp;<a href="javascript:openbrowser('mapimportform','importmap','sequence,page','');">$lt{'selm'}</a></span><br />
         <input type="submit" name="loadmap" value="$lt{'load'}" $disabled />          <input type="submit" name="loadmap" value="$lt{'load'}" />
         </fieldset>          </fieldset>
         </form>          </form>
   
 SEDFFORM  SEDFFORM
   
         my $fromstoredjs;  
         if ($canedit) {  
             $fromstoredjs = 'open_StoredLinks_Import()';  
         } else {  
             $fromstoredjs = "alert('".&js_escape($lt{'er'})."')";  
         }  
   
  my @importpubforma = (   my @importpubforma = (
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>' },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:open_StoredLinks_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_StoredLinks_Import();'>$lt{'lnks'}</a>" },
         { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform }          { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform }
  );   );
  $importpubform = &create_form_ul(&create_list_elements(@importpubforma));   $importpubform = &create_form_ul(&create_list_elements(@importpubforma));
         my $extresourcesform =          my $extresourcesform =
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,              &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Resource'},                                                   $help{'Adding_External_Resource'});
                                                  undef,undef,$disabled);  
     if ($allowed) {      if ($allowed) {
         my $folder = $env{'form.folder'};          my $folder = $env{'form.folder'};
         if ($folder eq '') {          if ($folder eq '') {
             $folder='default';              $folder='default';
         }          }
         if ($canedit) {   &update_paste_buffer($coursenum,$coursedom,$folder);
     my $output = &update_paste_buffer($coursenum,$coursedom,$folder);  
             if ($output) {  
                 $r->print($output);  
             }  
         }  
  $r->print(<<HIDDENFORM);   $r->print(<<HIDDENFORM);
  <form name="renameform" method="post" action="/adm/coursedocs">   <form name="renameform" method="post" action="/adm/coursedocs">
    <input type="hidden" name="title" />     <input type="hidden" name="title" />
Line 5384  HIDDENFORM Line 3616  HIDDENFORM
   
     if ($allowed) {      if ($allowed) {
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        if ((($folder eq '') && (!$hiddentop)) || ($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 5408  HIDDENFORM Line 3640  HIDDENFORM
   
  my $newnavform=(<<NNFORM);   my $newnavform=(<<NNFORM);
  <form action="/adm/coursedocs" method="post" name="newnav">   <form action="/adm/coursedocs" method="post" name="newnav">
  <input type="hidden" name="active" value="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" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newnav);">$lt{'navc'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newnav.submit()">$lt{'navc'}</a>
  $help{'Navigate_Content'}   $help{'Navigate_Content'}
  </form>   </form>
 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 5432  NSPFORM Line 3664  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 5443  NSPROBFORM Line 3675  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 5459  NEXUFORM Line 3690  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 5469  NBFORM Line 3700  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" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newaboutme);">$lt{'mypi'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newaboutme.submit()">$lt{'mypi'}</a>
  $help{'My Personal Information Page'}   $help{'My Personal Information Page'}
  </form>   </form>
 NAMFORM  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:makenew(document.newroster);">$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 5534  my $newfolderb; Line 3745  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 5545  NPFORM Line 3756  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" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newsyl);">$lt{'syll'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newsyl.submit()">$lt{'syll'}</a>
  $help{'Syllabus'}   $help{'Syllabus'}
   
  </form>   </form>
Line 5564  NSYLFORM Line 3775  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" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newgroupfiles);">$lt{'grpo'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newgroupfiles.submit()">$lt{'grpo'}</a>
  $help{'Group Portfolio'}   $help{'Group Portfolio'}
  </form>   </form>
 NGFFORM  NGFFORM
  @specialdocumentsforma=(   @specialdocumentsforma=(
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},  
         );          );
         $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));          $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma));
   
Line 5591  NGFFORM Line 3801  NGFFORM
             );              );
         }          }
         push(@importdoc,          push(@importdoc,
             {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}              {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}
         );          );
         $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));
   
Line 5607  NGFFORM Line 3817  NGFFORM
        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="javascript:makenew(document.newroster);" />'=>$newrosterform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="javascript:makenew(document.newgroupfiles);" />'=>$newgroupfileform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform},
         );          );
         $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 ($container eq 'page') {
     $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;
        unless (($supplementalflag || $toolsflag)) {         unless (($supplementalflag || $toolsflag)) {
           my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                               $supplementalflag,\%orderhash,$iconpath,$pathitem,                                $supplementalflag,\%orderhash,$iconpath,$pathitem);
                               $canedit,\$navmap,$hiddentop);  
           undef($navmap);  
           if ($error) {            if ($error) {
              $r->print('<p><span class="LC_error">'.$error.'</span></p>');               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
           }            }
Line 5683  SUPDOCFORM Line 3891  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 5693  SNFFORM Line 3901  SNFFORM
   
         my $supextform =          my $supextform =
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,              &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Resource'},                                                   $help{'Adding_External_Resource'});
                                                  undef,undef,$disabled);  
   
  my $supnewsylform=(<<SNSFORM);   my $supnewsylform=(<<SNSFORM);
  <form action="/adm/coursedocs" method="post" name="supnewsyl">   <form action="/adm/coursedocs" method="post" name="supnewsyl">
Line 5702  SNFFORM Line 3909  SNFFORM
         $pathitem          $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="Syllabus=/public/$coursedom/$coursenum/syllabus" />   value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.supnewsyl);">$lt{'syll'}</a>   <a class="LC_menubuttons_link" href="javascript:document.supnewsyl.submit()">$lt{'syll'}</a>
  $help{'Syllabus'}   $help{'Syllabus'}
  </form>   </form>
 SNSFORM  SNSFORM
Line 5713  SNSFORM Line 3920  SNSFORM
         $pathitem          $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.supnewaboutme);">$lt{'mypi'}</a>   <a class="LC_menubuttons_link" href="javascript:document.supnewaboutme.submit()">$lt{'mypi'}</a>
  $help{'My Personal Information Page'}   $help{'My Personal Information Page'}
  </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="javascript:makenew(document.supnewsyl);" />'   {'<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="javascript:makenew(document.supnewaboutme);" />'   {'<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 5757  my @supimportdoc = ( Line 3942  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);
                                $canedit);  
            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 5857  sub decompression_info { Line 4028  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','folderpath');
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.folderpath'} =~ /\:1$/) {
         $container='page';          $container='page';
     }      }
Line 5865  sub decompression_info { Line 4036  sub decompression_info {
     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 5922  sub remove_archive { Line 4093  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 5968  sub remove_archive { Line 4130  sub remove_archive {
 }  }
   
 sub generate_admin_menu {  sub generate_admin_menu {
     my ($crstype,$canedit) = @_;      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 5988  sub generate_admin_menu { Line 4150  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 6007  sub generate_admin_menu { Line 4169  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 6026  sub generate_admin_menu { Line 4188  sub generate_admin_menu {
                     linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"                      linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"
                 },                  },
                 ]                  ]
         });          },
     if ($canedit) {  
         push(@menu,  
         {   categorytitle=>'Export',          {   categorytitle=>'Export',
             items =>[              items =>[
                 {   linktext   => $lt{'imse'},                  {   linktext   => $lt{'imse'},
Line 6041  sub generate_admin_menu { Line 4201  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'},
                 },                  },
                 ]                  ]
         });          });
     }  
     return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".      return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".
            '<input type="hidden" id="dummy" />'."\n".             '<input type="hidden" id="dummy" />'."\n".
            &Apache::lonhtmlcommon::generate_menu(@menu)."\n".             &Apache::lonhtmlcommon::generate_menu(@menu)."\n".
Line 6055  sub generate_admin_menu { Line 4214  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,$canedit) = @_;  
     return unless(ref($orderhash_ref) eq 'HASH');      return unless(ref($orderhash_ref) eq 'HASH');
     my %orderhash = %{$orderhash_ref};      my %orderhash = %{$orderhash_ref};
     my ($form, $activetab, $active, $disabled);      my $form;
     if (($env{'form.active'} ne '') && ($env{'form.active'} ne '00')) {      my $activetab;
       my $active;
       if($env{'form.active'} ne ''){
         $activetab = $env{'form.active'};          $activetab = $env{'form.active'};
     }      }
     unless ($canedit) {  
         $disabled = ' disabled="disabled"';  
     }  
     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 6098  sub generate_edit_table { Line 4255  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 6106  sub generate_edit_table { Line 4263  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" $disabled />  
 </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 6155  END Line 4284  END
 }  }
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag,$coursedom,$coursenum,$canedit,$navmapref) = @_;      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 6166  sub editing_js { Line 4296  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',
                                           p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',                                            p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',
                                           p_chn => 'New Title',                                            p_chn => 'New Title',
                                           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',                                            p_rmr2a => 'Remove[_99]',
                                           p_rmr2b => '?',                                            p_rmr2b => '?[_99]',
                                           p_rmr3a => 'Remove those',  
                                           p_rmr3b => 'items?',  
                                           p_rmr4  => 'WARNING: Removing a resource uploaded to a course cannot be undone via "Undo Delete".',  
                                           p_rmr5  => 'Push "Cancel" and then use "Cut" instead if you might need to undo this change.',  
                                           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',                                            p_ctr2a => 'Cut[_98]',
                                           p_ctr2b => '?',                                            p_ctr2b => '?[_98]',
                                           p_ctr3a => 'Cut those',  
                                           p_ctr3b => 'items?',  
                                           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.',  
                                           edri    => 'Editing rights unavailable for your current role.',  
                                         );                                          );
   
     &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 $main_container_page;      my $main_container_page;
     if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {      if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {
         $main_container_page = 1;          $main_container_page = 1;
     }      }
     my $backtourl;      my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents%3A%3A%3A%3A%3A';
     my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref));  
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {      my $backtourl = '/adm/navmaps';
         my $caller = $1;      if ($supplementalflag) {
         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)) {  
                 my ($url,$anchor);  
                 if ($res =~ /^([^#]+)#([^#]+)$/) {  
                     $url = $1;  
                     $anchor = $2;  
                     if (($caller =~ m{^([^#]+)\Q#$anchor\E$})) {  
                         $caller = $1.&escape('#').$anchor;  
                     }  
                 } else {  
                     $url = $res;  
                 }  
                 $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($url),'<>&"').'?symb='.  
                              &HTML::Entities::encode($caller,'<>&"');  
                 if ($anchor ne '') {  
                     $backtourl .= '#'.&HTML::Entities::encode($anchor,'<>&"');  
                 }  
                 $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'";
Line 6253  sub editing_js { Line 4337  sub editing_js {
         $fieldsets = "'suppext','suppdoc'";          $fieldsets = "'suppext','suppdoc'";
     }      }
   
     my $jsmakefunctions;      return <<ENDNEWSCRIPT;
     if ($canedit) {  
         $jsmakefunctions = <<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 6265  function makenewfolder(targetform,folder Line 4347  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 6273  function makenewpage(targetform,folderse Line 4355  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 6282  function makeexamupload() { Line 4364  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 6315  function makesmpproblem() { Line 4382  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 6324  function makedropbox() { Line 4391  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'}");
        }  
     }  
 }  
   
 function makenew(targetform) {  
     targetform.submit();  
 }  
   
 function changename(folderpath,index,oldtitle) {  
     var title=prompt('$js_lt{"p_chn"}',oldtitle);  
     if (title) {  
         this.document.forms.renameform.markcopy.value='';  
         this.document.forms.renameform.title.value=title;  
         this.document.forms.renameform.cmd.value='rename_'+index;  
         this.document.forms.renameform.folderpath.value=folderpath;  
         this.document.forms.renameform.submit();  
     }  
 }  
   
 ENDNEWSCRIPT  
     } else {  
         $jsmakefunctions = <<ENDNEWSCRIPT;  
   
 function makenewfolder() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makenewpage() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makeexamupload() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makesmppage() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makewebpage(type) {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makesmpproblem() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makedropbox() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makebulboard() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makeabout() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function changename() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makenew() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function groupimport() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function groupsearch() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function groupopen(url,recover) {  
    var options="scrollbars=1,resizable=1,menubar=0";  
    idxflag=1;  
    idx=open("/adm/groupsort?inhibitmenu=yes&mode=simple&recover="+recover+"&readfile="+url,"idxout",options);  
    idx.focus();  
 }  }
   
 ENDNEWSCRIPT  
   
     }  
     return <<ENDSCRIPT;  
   
 $jsmakefunctions  
   
 function toggleUpload(caller) {  function toggleUpload(caller) {
     var blocks = Array($fieldsets);      var blocks = Array($fieldsets);
     for (var i=0; i<blocks.length; i++) {      for (var i=0; i<blocks.length; i++) {
Line 6469  function toggleMap(caller) { Line 4451  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) {
   var title=prompt('$lt{"p_chn"}',oldtitle);
   if (title) {
   this.document.forms.renameform.markcopy.value=-1;
   this.document.forms.renameform.title.value=title;
   this.document.forms.renameform.cmd.value='rename_'+index;
   this.document.forms.renameform.folderpath.value=folderpath;
   this.document.forms.renameform.submit();
   }
   }
   
   function removeres(folderpath,index,oldtitle,skip_confirm) {
   if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
   this.document.forms.renameform.markcopy.value=-1;
   this.document.forms.renameform.cmd.value='del_'+index;
   this.document.forms.renameform.folderpath.value=folderpath;
   this.document.forms.renameform.submit();
   }
   }
   
   function cutres(folderpath,index,oldtitle,container,folder,skip_confirm) {
   if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
   this.document.forms.renameform.cmd.value='cut_'+index;
   this.document.forms.renameform.markcopy.value=index;
   this.document.forms.renameform.copyfolder.value=folder+'.'+container;
   this.document.forms.renameform.folderpath.value=folderpath;
   this.document.forms.renameform.submit();
   }
   }
   
   function markcopy(folderpath,index,oldtitle,container,folder) {
   this.document.forms.renameform.markcopy.value=index;
   this.document.forms.renameform.copyfolder.value=folder+'.'+container;
   this.document.forms.renameform.folderpath.value=folderpath;
   this.document.forms.renameform.submit();
   }
   
 function updatePick(targetform,index,caller) {  function updatePick(targetform,index,caller) {
     var pickitem;      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,confirm_removal) {  
     var canedit = '$canedit';  
     if (canedit == '') {  
         alert("$js_lt{'edri'}");  
         return;  
     }  
     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') {  
                 var doremove = 0;  
                 if (skip_confirm) {  
                     if (confirm_removal) {  
                         if (confirm('$js_lt{"p_rmr4"}\\n$js_lt{"p_rmr5"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'"$js_lt{"p_rmr2b"}')) {  
                             doremove = 1;  
                         }  
                     } else {  
                         doremove = 1;  
                     }  
                 } else {  
                     if (confirm('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'" $js_lt{"p_rmr2b"}')) {  
                         doremove = 1;  
                     }  
                 }  
                 if (doremove) {  
                     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 6773  for (i = 0; i < currentLis.length; i++) Line 4548  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 6809  function openTabs(pageId) { Line 4582  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 6869  function showPage(current, pageId, nav, Line 4628  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) {  ENDNEWSCRIPT
     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;  
     var removalinfo = 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 ++;  
                             }  
                         }  
                         if (document.getElementById('confirm_removal_'+remidxs[i])) {  
                             if (document.getElementById('confirm_removal_'+remidxs[i]).value == 1) {  
                                 removalinfo ++;  
                             }  
                         }  
                     }  
                 }  
             }  
         }  
         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) || (removalinfo > 0)) {  
                 if (remwarnings > 0) {  
                     if (!confirm('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr3a"} '+remwarnings+' $js_lt{"p_rmr3b"}')) {  
                         return false;  
                     }  
                 }  
                 if (removalinfo > 0) {  
                     if (!confirm('$js_lt{"p_rmr4"}\\n$js_lt{"p_rmr5"}\\n\\n$js_lt{"p_rmr3a"} '+removalinfo+' $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;  
 }  
   
 ENDSCRIPT  
 }  }
   
 sub history_tab_js {  sub history_tab_js {
Line 7224  ENDINJECT Line 4664  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 7277  ENDSWJS Line 4711  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 7288  function choose_switchserver_window() { Line 4722  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 7380  Return hash with valid author names Line 4814  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 7392  Return hash with valid author names Line 4822  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.70  
changed lines
  Added in v.1.523


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.