Diff for /loncom/interface/londocs.pm between versions 1.484.2.72.2.2 and 1.491

version 1.484.2.72.2.2, 2017/09/15 23:15:55 version 1.491, 2012/07/13 13:36:24
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::lonextresedit();  use Apache::lonuserstate();
 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 56  my $hashtied;
 my %alreadyseen=();  my %alreadyseen=();
   
 my $hadchanges;  my $hadchanges;
 my $suppchanges;  
   
   
 my %help=();  my %help=();
Line 73  sub mapread { Line 69  sub mapread {
 }  }
   
 sub storemap {  sub storemap {
     my ($coursenum,$coursedom,$map,$contentchg)=@_;      my ($coursenum,$coursedom,$map)=@_;
     my $report;  
     if (($contentchg) && ($map =~ /^default/)) {  
        $report = 1;  
     }  
     my ($outtext,$errtext)=      my ($outtext,$errtext)=
       &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.        &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
       $map,1,$report);        $map,1);
     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 127  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 148  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, $ltitoolsref, @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 283  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 292  sub group_import {
             }              }
         }          }
  if ($url) {   if ($url) {
             if ($url =~ m{^(/adm/$coursedom/$coursenum/(\d+)/ext\.tool)\:?(.*)$}) {  
                 $url = $1;  
                 my $marker = $2;  
                 my $info = $3;  
                 my ($toolid,%toolhash,%toolsettings);  
                 my @extras = ('linktext','explanation','crslabel','crstitle');   
                 my @toolinfo = split(/:/,$info);  
                 if ($residx) {  
                     %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$coursedom,$coursenum);  
                     $toolid = $toolsettings{'id'};  
                 } else {  
                     $toolid = shift(@toolinfo);  
                 }  
                 $toolid =~ s/\D//g;  
                 ($toolhash{'target'},$toolhash{'width'},$toolhash{'height'},  
                  $toolhash{'linktext'},$toolhash{'explanation'},  
                  $toolhash{'crslabel'},$toolhash{'crstitle'}) = @toolinfo;  
                 foreach my $item (@extras) {  
                     $toolhash{$item} = &unescape($toolhash{$item});  
                 }  
                 if (ref($ltitoolsref) eq 'HASH') {  
                     my @deleted;  
                     if (ref($ltitoolsref->{$toolid}) eq 'HASH') {  
                         $toolhash{'id'} = $toolid;  
                         if (($toolhash{'target'} eq 'iframe') || ($toolhash{'target'} eq 'tab') ||  
                             ($toolhash{'target'} eq 'window')) {  
                             if ($toolhash{'target'} eq 'window') {  
                                 foreach my $item ('width','height') {  
                                     $toolhash{$item} =~ s/^\s+//;  
                                     $toolhash{$item} =~ s/\s+$//;  
                                     if ($toolhash{$item} =~ /\D/) {  
                                         delete($toolhash{$item});  
                                         if ($residx) {  
                                             if ($toolsettings{$item}) {  
                                                 push(@deleted,$item);  
                                             }  
                                         }  
                                     }  
                                 }  
                             }  
                         } elsif ($residx) {  
                             $toolhash{'target'} = $toolsettings{'target'};  
                             if ($toolhash{'target'} eq 'window') {  
                                 foreach my $item ('width','height') {  
                                     $toolhash{$item} = $toolsettings{$item};  
                                 }  
                             }  
                         } elsif (ref($ltitoolsref->{$toolid}->{'display'}) eq 'HASH') {  
                             $toolhash{'target'} = $ltitoolsref->{$toolid}->{'display'}->{'target'};  
                             if ($toolhash{'target'} eq 'window') {  
                                 $toolhash{'width'} = $ltitoolsref->{$toolid}->{'display'}->{'width'};  
                                 $toolhash{'height'} = $ltitoolsref->{$toolid}->{'display'}->{'height'};  
                             }  
                         }  
                         if ($toolhash{'target'} eq 'iframe') {  
                             foreach my $item ('width','height','linktext','explanation') {  
                                 delete($toolhash{$item});  
                                 if ($residx) {  
                                     if ($toolsettings{$item}) {  
                                         push(@deleted,$item);  
                                     }  
                                 }  
                             }  
                         } elsif ($toolhash{'target'} eq 'tab') {  
                             foreach my $item ('width','height') {  
                                 delete($toolhash{$item});  
                                 if ($residx) {  
                                     if ($toolsettings{$item}) {  
                                         push(@deleted,$item);  
                                     }  
                                 }  
                             }  
                         }  
                         if (ref($ltitoolsref->{$toolid}->{'crsconf'}) eq 'HASH') {  
                             foreach my $item ('label','title','linktext','explanation') {  
                                 my $crsitem;  
                                 if (($item eq 'label') || ($item eq 'title')) {  
                                     $crsitem = 'crs'.$item;  
                                 } else {  
                                     $crsitem = $item;  
                                 }  
                                 if ($ltitoolsref->{$toolid}->{'crsconf'}->{$item}) {  
                                     $toolhash{$crsitem} =~ s/^\s+//;  
                                     $toolhash{$crsitem} =~ s/\s+$//;  
                                     if ($toolhash{$crsitem} eq '') {  
                                         delete($toolhash{$crsitem});  
                                     }  
                                 } else {  
                                     delete($toolhash{$crsitem});  
                                 }  
                                 if (($residx) && (exists($toolsettings{$crsitem}))) {  
                                     unless (exists($toolhash{$crsitem})) {  
                                         push(@deleted,$crsitem);  
                                     }  
                                 }  
                             }  
                         }  
                         my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum);  
                         if ($putres eq 'ok') {  
                             if (@deleted) {  
                                 &Apache::lonnet::del('exttool_'.$marker,\@deleted,$coursedom,$coursenum);  
                             }  
                         }  
                     }  
                 }  
             }  
             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,$coursenum,$coursedom,\%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 782  sub group_import { Line 299  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);
         my %import_errors;  }
         my %updated = (  
                           removefrommap => \%removefrommap,  sub breadcrumbs {
                           removeparam   => \%removeparam,      my ($allowed,$crstype)=@_;
                       );      &Apache::lonhtmlcommon::clear_breadcrumbs();
         my ($result,$msgsarray,$lockerror) =      my (@folders);
             &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);      if ($env{'form.pagepath'}) {
         if (keys(%import_errors) > 0) {          @folders = split('&',$env{'form.pagepath'});
             $fixuperrors =      } else {
                 '<p span class="LC_warning">'."\n".          @folders=split('&',$env{'form.folderpath'});
                 &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);      my $folderpath;
       my $cpinfo='';
       my $plain='';
       my $randompick=-1;
       my $isencrypted=0;
       my $ishidden=0;
       my $is_random_order=0;
       while (@folders) {
    my $folder=shift(@folders);
       my $foldername=shift(@folders);
    if ($folderpath) {$folderpath.='&';}
    $folderpath.=$folder.'&'.$foldername;
           my $url;
           if ($allowed) {
               $url = '/adm/coursedocs?folderpath=';
           } else {
               $url = '/adm/supplemental?folderpath=';
           }
    $url .= &escape($folderpath);
    my $name=&unescape($foldername);
   # randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername
     $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//;
    if ($1 ne '') {
              $randompick=$1;
           } else {
              $randompick=-1;
           }
           if ($2) { $ishidden=1; }
           if ($3) { $isencrypted=1; }
    if ($4 ne '') { $is_random_order = 1; }
           if ($folder eq 'supplemental') {
               $name = &mt('Supplemental '.$crstype.' Content');
           }
    &Apache::lonhtmlcommon::add_breadcrumb(
         {'href'=>$url.$cpinfo,
          'title'=>$name,
          'text'=>$name,
          'no_mt'=>1,
          });
    $plain.=$name.' &gt; ';
       }
       $plain=~s/\&gt\;\s*$//;
       return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
          undef, undef, 1 ),$randompick,$ishidden,
                                                  $isencrypted,$plain,$is_random_order);
 }  }
   
 sub log_docs {  sub log_docs {
     return &Apache::lonnet::write_log('course','docslog',@_);      return &Apache::lonnet::instructor_log('docslog',@_);
 }  }
   
 {  {
Line 933  sub log_docs { Line 426  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 951  sub docs_change_log { Line 442  sub docs_change_log {
     my %orderhash;      my %orderhash;
     my $container='sequence';      my $container='sequence';
     my $pathitem;      my $pathitem;
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.pagepath'}) {
         $container='page';          $container='page';
           $pathitem = '<input type="hidden" name="pagepath" value="'.
                       &HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />';
       } else {
           my $folderpath=$env{'form.folderpath'};
           if ($folderpath eq '') {
               $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents'));
           }
           $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
     }      }
     my $folderpath=$env{'form.folderpath'};  
     if ($folderpath eq '') {  
         $folderpath = &default_folderpath($coursenum,$coursedom,\$navmap);  
     }  
     undef($navmap);  
     $pathitem = '<input type="hidden" name="folderpath" value="'.  
                 &HTML::Entities::encode($folderpath,'<>&"').'" />';  
     my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";      my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
     my $jumpto = $readfile;      my $jumpto = $readfile;
     $jumpto =~ s{^/}{};      $jumpto =~ s{^/}{};
Line 968  sub docs_change_log { Line 460  sub docs_change_log {
     if ($supplementalflag) {      if ($supplementalflag) {
         $tid = 2;          $tid = 2;
     }      }
     my ($breadcrumbtrail) =       my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype);
         &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1);  
     $r->print($breadcrumbtrail.      $r->print($breadcrumbtrail.
               &generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto,                &generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto,
               $readfile));                $readfile));
Line 1121  sub docs_change_log { Line 612  sub docs_change_log {
 }  }
   
 sub update_paste_buffer {  sub update_paste_buffer {
     my ($coursenum,$coursedom,$folder) = @_;      my ($coursenum,$coursedom) = @_;
     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();      return if ($fatal);
   
 # Retrieve current paste buffer suffixes.  # Mark for copying
     my @currpaste = split(/,/,$env{'docs.markedcopies'});      my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
     my (%pasteurls,@newpaste);      if (&is_supplemental_title($title)) {
           &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title});
 # Construct identifiers for current contents of user's paste buffer   ($title) = &Apache::loncommon::parse_supplemental_title($title);
     if (@currpaste) {      } elsif ($env{'docs.markedcopy_supplemental'}) {
         foreach my $suffix (@currpaste) {          &Apache::lonnet::delenv('docs.markedcopy_supplemental');
              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;  
              }  
         }  
     }      }
       $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
   
 # Mark items for copying (skip any items already in user's paste buffer)      &Apache::lonnet::appenv({'docs.markedcopy_title' => $title,
     my %addtoenv;      'docs.markedcopy_url'   => $url});
                     
     foreach my $item (@possibles) {  
         my ($orderidx,$cmd) = split(/:/,$item);  
         next if ($orderidx =~ /\D/);  
         next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove'));  
         my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]);  
         my %denied = &action_restrictions($coursenum,$coursedom,  
                                           &LONCAPA::map::qtescape($url),  
                                           $env{'form.folderpath'},\%curr_groups);  
         next if ($denied{'copy'});  
         $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};  
         next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));  
         my ($suffix,$errortxt,$locknotfreed) =  
             &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');  
         if ($suffix ne '') {  
             push(@newpaste,$suffix);  
         } else {  
             if ($locknotfreed) {  
                 return $locknotfreed;  
             }  
         }  
         if (&is_supplemental_title($title)) {  
             &Apache::lonnet::appenv({'docs.markedcopy_supplemental_'.$suffix => $title});  
     ($title) = &Apache::loncommon::parse_supplemental_title($title);  
         }  
   
         $addtoenv{'docs.markedcopy_title_'.$suffix} = $title,  
         $addtoenv{'docs.markedcopy_url_'.$suffix}   = $url,  
         $addtoenv{'docs.markedcopy_cmd_'.$suffix}   = $cmd,  
         $addtoenv{'docs.markedcopy_crs_'.$suffix}   = $env{'request.course.id'};  
    
         if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {  
             my $prefix = $1;  
             my $subdir =$2;  
             if ($subdir eq '') {  
                 $subdir = $prefix;  
             }  
             my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);  
             &contained_map_check($url,$folder,$coursenum,$coursedom,\%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);  
     delete($env{'form.markcopy'});      delete($env{'form.markcopy'});
     return $output;  
 }  
   
 sub recurse_uploaded_maps {  
     my ($url,$dir,$hierarchy,$titlesref,$nestref,$namesref) = @_;  
     if (ref($hierarchy->{$url}) eq 'HASH') {  
         my @maps = map { $hierarchy->{$url}{$_}; } sort { $a <=> $b } (keys(%{$hierarchy->{$url}}));  
         my @titles = map { $titlesref->{$url}{$_}; } sort { $a <=> $b } (keys(%{$titlesref->{$url}}));  
         my (@uploaded,@names,%shorter);  
         for (my $i=0; $i<@maps; $i++) {  
             my ($inner) = ($maps[$i] =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_(\d+)\.(?:page|sequence)$});  
             if ($inner ne '') {  
                 push(@uploaded,$inner);  
                 push(@names,&escape($titles[$i]));  
                 $shorter{$maps[$i]} = $inner;  
             }  
         }  
         $$nestref .= "$dir:".join(',',@uploaded).'&';  
         $$namesref .= "$dir:".(join(',',@names)).'___&&&___';  
         foreach my $map (@maps) {  
             if ($shorter{$map} ne '') {  
                 &recurse_uploaded_maps($map,$shorter{$map},$hierarchy,$titlesref,$nestref,$namesref);  
             }  
         }  
     }  
     return;  
 }  }
   
 sub print_paste_buffer {  sub print_paste_buffer {
     my ($r,$container,$folder,$coursedom,$coursenum) = @_;      my ($r,$container,$folder) = @_;
     return if (!defined($env{'docs.markedcopies'}));      return if (!defined($env{'docs.markedcopy_url'}));
   
     unless (($env{'form.pastemarked'}) || ($env{'form.clearmarked'})) {      my $is_external;
         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;
     my ($pasteitems,@pasteable);      if ($folder =~ /^supplemental/) {
     my $clipboardcount = 0;          $canpaste = &supp_pasteable($env{'docs.markedcopy_url'}); 
   
 # Construct identifiers for current contents of user's paste buffer  
     foreach my $suffix (@currpaste) {  
         next if ($suffix =~ /\D/);  
         my $cid = $env{'docs.markedcopy_crs_'.$suffix};  
         my $url = $env{'docs.markedcopy_url_'.$suffix};  
         if (($cid =~ /^$match_domain\_$match_courseid$/) &&  
             ($url ne '')) {  
             $clipboardcount ++;  
             my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,  
                 $canpaste,$nopaste,$othercrs,$areachange,$is_exttool);  
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];  
             if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {  
                 $is_external = 1;  
             } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {  
                 $is_exttool = 1;  
             }  
             if ($folder =~ /^supplemental/) {  
                 $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});  
                 unless ($canpaste) {  
                     $nopaste = &mt('Paste into Supplemental Content unavailable.');  
                 }  
             } else {  
                 $canpaste = 1;  
             }  
             if ($canpaste) {  
                 if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {  
                     my $srcdom = $1;  
                     my $srcnum = $2;  
                     my $rem = $3;  
                     if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {  
                         $othercourse = 1;  
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {  
                             $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;  
                     }  
                 } elsif (($url =~ m{^/res/lib/templates/\w+\.problem$}) ||  
                          ($url =~ m{^/adm/($match_domain)/($match_username)/\d+/(bulletinboard|smppg|ext\.tool)$})) {  
                     if ($cid ne $env{'request.course.id'}) {  
                         my ($srcdom,$srcnum) = split(/_/,$cid);  
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {  
                             if (($is_exttool) && ($srcdom ne $coursedom)) {  
                                 $canpaste = 0;  
                                 $nopaste = &mt('Paste from another domain unavailable.');  
                             } else {  
                                 $othercrs = '<br />'.&mt('(from another course)');  
                             }  
                         } else {  
                             $canpaste = 0;  
                             $nopaste = &mt('Paste from another course unavailable.');  
                         }  
                     }  
                 }  
             }  
             if ($canpaste) {  
                push(@pasteable,$suffix);  
             }  
             my $buffer;  
             if ($is_external) {   
                 $buffer = &mt('External Resource').': '.  
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.  
                     &LONCAPA::map::qtescape($url).')';  
             } elsif ($is_exttool) {  
                 $buffer = &mt('External Tool').': '.  
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});  
             } else {  
                 my $icon = &Apache::loncommon::icon($extension);  
                 if ($extension eq 'sequence' &&  
                     $url =~ m{/default_\d+\.sequence$}x) {  
                     $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));  
                     $icon .= '/navmap.folder.closed.gif';  
                 }  
                 my $title = $env{'docs.markedcopy_title_'.$suffix};  
                 if ($title eq '') {  
                     ($title) = ($url =~ m{/([^/]+)$});  
                 }  
                 $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'.  
                           ': '.  
                           &Apache::loncommon::parse_supplemental_title(  
                              &LONCAPA::map::qtescape($title));  
             }  
             $pasteitems .= '<div class="LC_left_float">';  
             my ($options,$onclick);  
             if (($canpaste) && (!$areachange) && (!$othercourse) &&  
                 ($env{'docs.markedcopy_cmd_'.$suffix} eq 'cut')) {  
                 if (($is_uploaded_map) ||  
                     ($url =~ /(bulletinboard|smppg)$/) ||  
                     ($url =~ m{^/uploaded/$coursedom/$coursenum/(?:docs|supplemental)/(.+)$})) {  
                     $options = &paste_options($suffix,$is_uploaded_map,$parent);  
                     $onclick= 'onclick="showOptions(this,'."'$suffix'".');" ';  
                 }  
             }  
             $pasteitems .= '<label><input type="checkbox" name="pasting" id="pasting_'.$suffix.'" value="'.$suffix.'" '.$onclick.'/>'.$buffer.'</label>';  
             if ($nopaste) {  
                  $pasteitems .= $nopaste;     
             } else {  
                 if ($othercrs) {  
                     $pasteitems .= $othercrs;  
                 }  
                 if ($options) {  
                     $pasteitems .= $options;  
                 }  
             }  
             $pasteitems .= '</div>';  
         }  
     }  
     if ($pasteitems eq '') {  
         &Apache::lonnet::delenv('docs.markedcopies');  
     }  
     my ($pasteform,$form_start,$buttons,$form_end);  
     if ($pasteitems) {  
         $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>';  
         $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post" onsubmit="return validateClipboard();">';  
         if (@pasteable) {  
             my $value = &mt('Paste to current folder');  
             if ($container eq 'page') {  
                 $value = &mt('Paste to current page');  
             }  
             $buttons = '<input type="submit" name="pastemarked" value="'.$value.'" />'.('&nbsp;'x2);  
         }  
         $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Remove from clipboard').'" />'.('&nbsp;'x2);  
         if ($clipboardcount > 1) {  
             $buttons .=  
                 '<span style="text-decoration:line-through">'.('&nbsp;'x20).'</span>'.('&nbsp;'x2).  
                 '<input type="button" name="checkallclip" value="'.&mt('Check all').'" style="height:20px;" onclick="checkClipboard();" />'.  
                 ('&nbsp;'x2).  
                 '<input type="button" name="uncheckallclip" value="'.&mt('Uncheck all').'" style="height:20px;" onclick="uncheckClipboard();" />'.  
                 ('&nbsp;'x2);  
         }  
         $form_end = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'.  
                     '</form>';  
     } else {      } else {
         $pasteitems = &mt('Clipboard is empty');          $canpaste = 1;
     }      }
     $r->print($form_start  
              .'<fieldset>'      my $pasteinfo;
              .'<legend>'.&mt('Clipboard').('&nbsp;' x2).$buttons.'</legend>'      if ($canpaste) {
              .$pasteitems          $pasteinfo = '<form name="pasteform" action="/adm/coursedocs" method="post">'
              .'</fieldset>'                      .'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> ';
              .$form_end);  
 }  
   
 sub paste_options {  
     my ($suffix,$is_uploaded_map,$parent) = @_;  
     my ($copytext,$movetext);  
     if ($is_uploaded_map) {  
         $copytext = &mt('Copy to new folder');  
         $movetext = &mt('Move old');  
     } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /bulletinboard$/) {  
         $copytext = &mt('Copy to new board');  
         $movetext = &mt('Move (not posts)');  
     } elsif ($env{'docs.markedcopy_url_'.$suffix} =~ /smppg$/) {  
         $copytext = &mt('Copy to new page');  
         $movetext = &mt('Move');  
     } else {      } else {
         $copytext = &mt('Copy to new file');          $pasteinfo = &mt('Paste buffer contains:').' ';
         $movetext = &mt('Move');  
     }  
     my $output = '<br />'.  
                  '<span id="pasteoptionstext_'.$suffix.'" class="LC_fontsize_small LC_nobreak"></span>'.  
                  '<div id="pasteoptions_'.$suffix.'" class="LC_dccid" style="display:none;"><span class="LC_nobreak">'.('&nbsp;'x 4).  
                  '<label>'.  
                  '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="new" checked="checked" />'.  
                  $copytext.'</label></span>'.('&nbsp;'x2).' '.  
                  '<span class="LC_nobreak"><label>'.  
                  '<input type="radio" name="docs.markedcopy_options_'.$suffix.'" value="move" />'.  
                  $movetext.'</label></span>';  
     if (($is_uploaded_map) && ($env{'docs.markedcopy_nested_'.$suffix})) {  
         $output .= '<br /><fieldset><legend>'.&mt('Folder to paste contains sub-folders').  
                    '</legend><table border="0">';  
         my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});  
         my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames_'.$suffix});  
         my $lastdir = $parent;  
         my %depths = (  
                        $lastdir => 0,  
                      );  
         my (%display,%deps);  
         for (my $i=0; $i<@pastemaps; $i++) {  
             ($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]);  
             my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]);  
             my @subfolders = split(/,/,$subfolderstr);  
             $deps{$lastdir} = \@subfolders;  
             my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr);  
             my $depth = $depths{$lastdir} + 1;  
             my $offset = int($depth * 4);  
             my $indent = ('&nbsp;' x $offset);  
             for (my $j=0; $j<@subfolders; $j++) {  
                 $depths{$subfolders[$j]} = $depth;  
                 $display{$subfolders[$j]} =  
                     '<tr><td>'.$indent.$subfoldertitles[$j].'&nbsp;</td>'.  
                     '<td><label>'.  
                     '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.('&nbsp;' x2).  
                     '<label>'.  
                     '<input type="radio" name="docs.markedcopy_'.$suffix.'_'.$subfolders[$j].'" value="move" />'.  
                     &mt('Move old').'</label>'.  
                     '</td></tr>';  
              }  
         }  
         &recurse_print(\$output,$parent,\%deps,\%display);  
         $output .= '</table></fieldset>';  
     }      }
     $output .= '</div>';  
     return $output;  
 }  
   
 sub recurse_print {      $r->print('<fieldset>'
     my ($outputref,$dir,$deps,$display) = @_;               .'<legend>'.&mt('Clipboard').'</legend>'
     $$outputref .= $display->{$dir}."\n";               .$pasteinfo
     if (ref($deps->{$dir}) eq 'ARRAY') {               );
         foreach my $subdir (@{$deps->{$dir}}) {  
             &recurse_print($outputref,$subdir,$deps,$display);      my $type;
       if ($is_external) {
    $type = &mt('External Resource');
    $r->print($type.': '.
     &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
     &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')');
       }  else {
    my $icon = &Apache::loncommon::icon($extension);
    if ($extension eq 'sequence' &&
       $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
       $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
       $icon .= '/navmap.folder.closed.gif';
    }
    $icon = '<img src="'.$icon.'" alt="" class="LC_icon" />';
    $r->print($icon.$type.': '.  &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})));
       }
       if ($canpaste) {
           if ($container eq 'page') {
       $r->print('
    <input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />
    <input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />
   ');
           } else {
       $r->print('
           <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />
   ');
         }          }
           $r->print('</form>');
       } else {
           $r->print('<br /><p class="LC_info">'.&mt('Paste into Supplemental Content unavailable for this type of content.').'</p>');
     }      }
       $r->print('</fieldset>');
 }  }
   
 sub supp_pasteable {  sub supp_pasteable {
Line 1510  sub supp_pasteable { Line 708  sub supp_pasteable {
         (($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) ||          (($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) ||
         ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) ||          ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) ||
         ($url =~ m{^/adm/$match_domain/$match_username/aboutme}) ||          ($url =~ m{^/adm/$match_domain/$match_username/aboutme}) ||
         ($url =~ m{^/public/$match_domain/$match_courseid/syllabus}) ||          ($url =~ m{^/public/$match_domain/$match_courseid/syllabus})) {
         ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$})) {  
         return 1;          return 1;
     }      }
     return;      return;
 }  }
   
 sub paste_popup_js {  sub do_paste_from_buffer {
     my %html_js_lt = &Apache::lonlocal::texthash(      my ($coursenum,$coursedom,$folder,$errors) = @_;
                                           show => 'Show Options',  
                                           hide => 'Hide 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";  
   
 function showPasteOptions(suffix) {  
     document.getElementById('pasteoptions_'+suffix).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>';  
     return;  
 }  
   
 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;  
 }  
   
 function validateClipboard() {      if (!$env{'form.pastemarked'}) {
     var numchk = 0;          return;
     if (document.pasteform.pasting.length > 1) {  
         for (var i=0; i<document.pasteform.pasting.length; i++) {  
             if (document.pasteform.pasting[i].checked) {  
                 numchk ++;  
             }  
         }  
     } else {  
         if (document.pasteform.pasting.type == 'checkbox') {  
             if (document.pasteform.pasting.checked) {  
                 numchk ++;   
             }   
         }  
     }  
     if (numchk > 0) {   
         return true;  
     } else {  
         alert("$js_lt{'none'}");  
         return false;  
     }      }
 }  
   
 function checkClipboard() {  # Preparing to paste resource at end of list
     if (document.pasteform.pasting.length > 1) {      my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'});
         for (var i=0; i<document.pasteform.pasting.length; i++) {      my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'});
             document.pasteform.pasting[i].checked = true;  
       my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges);
       if ($url=~/\.(page|sequence)$/) {
           $is_map = 1; 
       }
       if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/([^/]+)}) {
           $srcdom = $1;
           $srcnum = $2;
           my $oldprefix = $3;
           if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
               unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                   return &mt('Paste failed: Item is from a different course which you do not have rights to edit.');
               }
           }
           if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
               $prefixchg = 1;
               %before = ( map => 'default',
                           doc => 'docs');
               %after =  ( map => 'supplemental',
                           doc => 'supplemental' );
           } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
               $prefixchg = 1;
               %before = ( map => 'supplemental',
                           doc => 'supplemental');
               %after  = ( map => 'default',
                           doc => 'docs');
         }          }
     }      }
     return;  
 }  
   
 function uncheckClipboard() {  # Supplemental content may only include certain types of content
     if (document.pasteform.pasting.length >1) {      if ($folder =~ /^supplemental/) {
         for (var i=0; i<document.pasteform.pasting.length; i++) {          unless (&supp_pasteable($env{'docs.markedcopy_url'})) {
             document.pasteform.pasting[i].checked = false;              return &mt('Paste failed: content type is not supported within Supplemental Content'); 
         }          }
     }      }
     return;  
 }  
   
 END  # Maps need to be copied first
       my ($oldurl,%removefrommap,%addedmaps,%rewrites,%retitles,%copies,%dbcopies,%zombies,
 }          %params,%docmoves,%mapmoves);
       $oldurl = $url;
 sub do_paste_from_buffer {      if ($is_map) {
     my ($coursenum,$coursedom,$folder,$container,$errors) = @_;  # If pasting a map, check if map contains other maps
           my %allmaps;
 # Array of items in paste buffer          &contained_map_check($url,$folder,\%removefrommap,\%addedmaps);
     my (@currpaste,%pastebuffer,%allerrors);          if ($folder =~ /^default/) {
     @currpaste = split(/,/,$env{'docs.markedcopies'});              if (keys(%addedmaps) > 0) {
                   &reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"});
 # Early out if paste buffer is empty  
     if (@currpaste == 0) {  
         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,%notindom,%duplicate,  
         %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult);  
   
     foreach my $suffix (@topaste) {  
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});  
         my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});  
 # Supplemental content may only include certain types of content  
 # Early out if pasted content is not supported in Supplemental area  
         if ($folder =~ /^supplemental/) {  
             unless (&supp_pasteable($url)) {  
                 $notinsupp{$suffix} = 1;  
                 next;  
             }  
         }  
         if ($url =~ m{^/uploaded/($match_domain)/($match_courseid)/}) {  
             my $srcd = $1;  
             my $srcn = $2;  
 # When paste buffer was populated using an active role in a different course  
 # check for mdc privilege in the course from which the resource was pasted  
             if (($srcd ne $coursedom) || ($srcn ne $coursenum)) {  
                 unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {  
                     $notincrs{$suffix} = 1;  
                     next;  
                 }  
             }  
             $srcdom{$suffix} = $srcd;  
             $srcnum{$suffix} = $srcn;  
         } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {  
             my ($srcd,$srcn) = split(/_/,$cid);  
 # 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  
             if (($srcd ne $coursedom) || ($srcn ne $coursenum)) {  
                 unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {  
                     $notincrs{$suffix} = 1;  
                     next;  
                 }  
             }  
 # When buffer was populated using an active role in a different course  
 # disallow pasting of External Tool if course is in a different domain.  
             if ($srcd ne $coursedom) {  
                 $notindom{$suffix} = 1;  
                 next;  
             }              }
             $srcdom{$suffix} = $srcd;              my $navmap = Apache::lonnavmaps::navmap->new();
             $srcnum{$suffix} = $srcn;              if (defined($navmap)) {
         }                  foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) {
         push(@dopaste,$suffix);                      $allmaps{$res->src()} = 1;
         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   
 # URLs will contain different paths (which depend on whether pasted item is  
 # a folder/page or a document).     
             if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {  
                 $prefixchg{$suffix} = 'docstosupp';  
             } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {  
                 $prefixchg{$suffix} = 'supptodocs';  
             }  
   
 # If pasting an uploaded map, get list of contained uploaded maps.  
             if ($env{'docs.markedcopy_nested_'.$suffix}) {  
                 my @nested;  
                 my ($type) = ($oldprefix =~ /^(default|supplemental)/);  
                 my @items = split(/\&/,$env{'docs.markedcopy_nested_'.$suffix});  
                 my @deps = map { /\d+:([\d,]+$)/ } @items;  
                 foreach my $dep (@deps) {  
                     if ($dep =~ /,/) {  
                         push(@nested,split(/,/,$dep));  
                     } else {  
                         push(@nested,$dep);  
                     }  
                 }  
                 foreach my $item (@nested) {  
                     if ($env{'form.docs.markedcopy_'.$suffix.'_'.$item} eq 'move') {  
                         push(@{$marktomove{$suffix}},$type.'_'.$item);  
                     }  
                 }                  }
             }              }
         }          }
     }          if ($url=~ m{^/uploaded/}) {
       $title=&mt('Copy of').' '.$title;
 # Early out if nothing available to paste          }
     if (@dopaste == 0) {          my $now = time;
         return ();   my $suffix=$$.int(rand(100)).$now;
     }   my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);
           if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) {
 # Populate message hash and hashes used for main content <=> supplemental content              my $path = $1;
 # changes                  my $prefix = $2;
               my $ancestor = $3;
     %msgs = &Apache::lonlocal::texthash (              if (length($ancestor) > 10) {
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',                  $ancestor = substr($ancestor,-10,10);
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',              }
                 notindom  => 'Paste failed: Item is an external tool from a course in a different donain.',               my ($newurl,$newid);
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',              if ($prefixchg) {
             );                  if ($folder =~ /^supplemental/) {
                       $prefix =~ s/^default/supplemental/;                   
     %before = (                  } else {
                  docstosupp => {                      $prefix =~ s/^supplemental/default/;
                                    map => 'default',  
                                    doc => 'docs',  
                                },  
                  supptodocs => {  
                                    map => 'supplemental',  
                                    doc => 'supplemental',  
                                },  
               );  
   
     %after = (  
                  docstosupp => {  
                                    map => 'supplemental',  
                                    doc => 'supplemental'  
                                },  
                  supptodocs => {  
                                    map => 'default',  
                                    doc => 'docs',  
                                },  
              );  
   
 # Retrieve information about all course maps in main content area   
   
     my $allmaps = {};  
     if ($folder =~ /^default/) {  
         $allmaps =  
             &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,  
                                                  $env{"course.$env{'request.course.id'}.home"},  
                                                  $env{'request.course.id'});  
     }  
   
     my (@toclear,%mapurls,%lockerrs,%msgerrs,%results);  
   
 # Loop over the items to paste  
     foreach my $suffix (@dopaste) {  
 # Maps need to be copied first  
         my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,  
             %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir,  
             %newurls,%tomove);  
         if (ref($marktomove{$suffix}) eq 'ARRAY') {  
             map { $tomove{$_} = 1; } @{$marktomove{$suffix}};  
         }  
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});  
         my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});  
         my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});  
         my $oldurl = $url;  
         if ($is_map{$suffix}) {  
 # If pasting a map, check if map contains other maps  
             my (%hierarchy,%titles);  
             &contained_map_check($url,$folder,$coursenum,$coursedom,  
                                  \%removefrommap,\%removeparam,\%addedmaps,  
                                  \%hierarchy,\%titles,$allmaps);  
             if ($url=~ m{^/uploaded/}) {  
                 my $newurl;  
                 unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {  
                     ($newurl,my $error) =   
                         &get_newmap_url($url,$folder,$prefixchg{$suffix},$coursedom,  
                                         $coursenum,$srcdom{$suffix},$srcnum{$suffix},  
                                         \$title,$allmaps,\%newurls);  
                     if ($error) {  
                         $allerrors{$suffix} = $error;  
                         next;  
                     }  
                     if ($newurl ne '') {  
                         if ($newurl ne $url) {  
                             if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) {  
                                 $newsubdir{$url} = $1;  
                             }  
                             $mapchanges{$url} = 1;  
                         }  
                     }  
                 }                  }
                 if (($srcdom{$suffix} ne $coursedom) ||              }
                     ($srcnum{$suffix} ne $coursenum) ||              if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {
                     ($prefixchg{$suffix}) || (($newurl ne '') && ($newurl ne $url))) {                  $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;
                     unless (&url_paste_fixups($url,$folder,$prefixchg{$suffix},              } else {
                                               $coursedom,$coursenum,$srcdom{$suffix},                  $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext;
                                               $srcnum{$suffix},$allmaps,\%rewrites,              }
                                               \%retitles,\%copies,\%dbcopies,              my $counter = 0;
                                               \%zombies,\%params,\%mapmoves,              my $is_unique = &uniqueness_check($newurl);
                                               \%mapchanges,\%tomove,\%newsubdir,              if ($folder =~ /^default/) {
                                               \%newurls)) {                  if ($allmaps{$newurl}) {
                         $mapmoves{$url} = 1;                      $is_unique = 0;
                     }  
                     $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 exist 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;  
                     }  
                 }                  }
             }              }
         }              while (!$is_unique && $allmaps{$newurl} && $counter < 100) {
         if ($url=~ m{/(ext\.tool)$}) {                  $counter ++;
             my $prefix = $1;                  $suffix ++;
             my $fromothercrs;                  if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {
             #need to copy the db contents to a new one, unless this is a move.                      $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;
             my %info = (                  } else {
                          src  => $url,                      $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext;
                          cdom => $coursedom,  
                          cnum => $coursenum,  
             );  
             if (($srcdom{$suffix} =~ /^$match_domain$/) && ($srcnum{$suffix} =~ /^$match_courseid$/)) {  
                 unless (($srcdom{$suffix} eq $coursedom) && ($srcnum{$suffix} eq $coursenum)) {  
                     $fromothercrs = 1;  
                     $info{'cdom'} = $srcdom{$suffix};  
                     $info{'cnum'} = $srcnum{$suffix};  
                 }                  }
                   $is_unique = &uniqueness_check($newurl);
             }              }
             unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) {              if ($is_unique) {
                 my (%lockerr,$msg);                   if ($newurl ne $oldurl) {
                 my ($newurl,$result,$errtext) =                      $mapchanges{$oldurl} = 1;
                     &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);                  }
                 if ($result eq 'ok') {                  if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg)) {
                     $url = $newurl;                      &url_paste_fixups($url,$prefixchg,$coursedom,$coursenum,\%allmaps,
                     $title=&mt('Copy of').' '.$title;                                        \%rewrites,\%retitles,\%copies,\%dbcopies,\%zombies,
                                         \%params,\%mapmoves,\%mapchanges);
                   }
               } else {
                   if ($url=~/\.page$/) {
                       return &mt('Paste failed: an error occurred creating a unique URL for the composite page');
                 } else {                  } else {
                     if ($prefix eq 'ext.tool') {                      return &mt('Paste failed: an error occurred creating a unique URL for the folder');
                         $msg = &mt('Paste failed: An error occurred when copying the external tool.').' '.$errtext;  
                     }  
                     $results{$suffix} = $result;  
                     $msgerrs{$suffix} = $msg;  
                     $lockerrs{$suffix} = $lockerr{$prefix};   
                     next;  
         }  
                 if ($lockerr{$prefix}) {  
                     $lockerrs{$suffix} = $lockerr{$prefix};  
                 }                  }
             }              }
         }      my $storefn=$newurl;
         $title = &LONCAPA::map::qtunescape($title);      $storefn=~s{^/\w+/$match_domain/$match_username/}{};
         my $ext='false';      my $paste_map_result =
         if ($url=~m{^http(|s)://}) { $ext='true'; }                  &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
         if ($env{'docs.markedcopy_supplemental_'.$suffix}) {             &Apache::lonnet::getfile($url));
             if ($folder !~ /^supplemental/) {              if ($paste_map_result eq '/adm/notfound.html') {
                 (undef,undef,$title) =                  if ($url=~/\.page$/) {
                     &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental_'.$suffix});                      return &mt('Paste failed: an error occurred saving the composite page.');
                   } else {
                       return &mt('Paste failed: an error occurred saving the folder.');
                   }
             }              }
         } else {      $url = $newurl;
             if ($folder=~/^supplemental/) {          } elsif ($url=~m {^/res/}) {
                 $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.  # published maps can only exists once, so remove it from paste buffer when done
                        $env{'user.domain'}.'___&&&___'.$title;              &Apache::lonnet::delenv('docs.markedcopy');
               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);
   # Now insert the URL at the bottom
       my $newidx = &LONCAPA::map::getresidx($url);
   
 # For uploaded files (excluding pages/sequences) path in copied file is changed  # 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  # if paste is from Main to Supplemental (or vice versa), or if pasting between
 # courses.  # courses.
   
         unless ($is_map{$suffix}) {      unless ($is_map) {
             my $newidx;          if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {
 # Now insert the URL at the bottom              my $relpath = $1;
             $newidx = &LONCAPA::map::getresidx(&LONCAPA::map::qtunescape($url));              if ($relpath ne '') {
             if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) {                  my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});
                 my $relpath = $1;                  my ($newloc,$newsubdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);
                 if ($relpath ne '') {                  my $newprefix = $newloc;
                     my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$});                  if ($newloc eq 'default') {
                     my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/);                      $newprefix = 'docs';
                     my $newprefix = $newloc;                  }
                     if ($newloc eq 'default') {                  if ($newsubdir eq '') {
                         $newprefix = 'docs';                      $newsubdir = 'default';
                     }                  }
                     if ($newdocsdir eq '') {                  if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                         $newdocsdir = 'default';                      my $newpath = "$newprefix/$newsubdir/$newidx/$rem";
                     }                      $url =
                     if (($prefixchg{$suffix}) ||                          &Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath,
                         ($srcdom{$suffix} ne $coursedom) ||                                                              &Apache::lonnet::getfile($oldurl));
                         ($srcnum{$suffix} ne $coursenum) ||                      if ($url eq '/adm/notfound.html') {
                         ($env{'form.docs.markedcopy_options_'.$suffix} ne 'move')) {                          return &mt('Paste failed: an error occurred saving the file.');
                         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 {                      } else {
                         if ($#LONCAPA::map::order<1) {                          my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$});
                             my $idx=&LONCAPA::map::getresidx();                          $newsubpath =~ s{/+$}{/};
                             if ($idx<=0) { $idx=1; }                          $docmoves{$oldurl} = $newsubpath;
                             $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  
                         my ($errtext,$fatal) =   
                             &storemap($coursenum,$coursedom,$folder.'.'.$container,1);  
                         if ($fatal) {  
                             $save_err .= $errtext;  
                             $allresult = 'failstore';  
                         }  
                     }   
                 }  
                 if ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {  
                      push(@toclear,$suffix);  
                 }                  }
             }              }
         }          }
     }      }
     &clear_from_buffer(\@toclear,\@currpaste);      my $result =
     my $msgsarray;          &apply_fixups($is_map,$prefixchg,$coursedom,$coursenum,$oldurl,$url,
     foreach my $suffix (keys(%msgs)) {                        \%removefrommap,\%rewrites,\%retitles,\%copies,\%dbcopies,
          if (ref($msgs{$suffix}) eq 'ARRAY') {                        \%zombies,\%params,\%docmoves,\%mapmoves,$errors,\%before,\%after);
              $msgsarray .= join(',',@{$msgs{$suffix}});      if ($result eq 'ok') {
          }          if ($env{'docs.markedcopy_supplemental'}) {
     }  
     return ($allresult,$save_err,$msgsarray,$lockerrors);  
 }  
   
 sub do_buffer_empty {  
     my @currpaste = split(/,/,$env{'docs.markedcopies'});  
     if (@currpaste == 0) {  
         return &mt('Clipboard is already empty');  
     }  
     my @toclear = &Apache::loncommon::get_env_multiple('form.pasting');  
     if (@toclear == 0) {  
         return &mt('Nothing selected to clear from clipboard');  
     }  
     my $numdel = &clear_from_buffer(\@toclear,\@currpaste);  
     if ($numdel) {  
         return &mt('[quant,_1,item] cleared from clipboard',$numdel);  
     } else {  
         return &mt('Clipboard unchanged');  
     }  
     return;  
 }  
   
 sub clear_from_buffer {  
     my ($toclear,$currpaste) = @_;  
     return unless ((ref($toclear) eq 'ARRAY') && (ref($currpaste) eq 'ARRAY'));  
     my %pastebuffer;  
     map { $pastebuffer{$_} = 1; } @{$currpaste};  
     my $numdel = 0;  
     foreach my $suffix (@{$toclear}) {  
         next if ($suffix =~ /\D/);  
         next unless (exists($pastebuffer{$suffix}));  
         my $regexp = 'docs.markedcopy_[a-z]+_'.$suffix;  
         if (&Apache::lonnet::delenv($regexp,1) eq 'ok') {  
             delete($pastebuffer{$suffix});  
             $numdel ++;  
         }  
     }  
     my $newbuffer = join(',',sort(keys(%pastebuffer)));  
     &Apache::lonnet::appenv({'docs.markedcopies' => $newbuffer});  
     return $numdel;  
 }  
   
 sub get_newmap_url {  
     my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum,  
         $titleref,$allmaps,$newurls) = @_;  
     my $newurl;  
     if ($url=~ m{^/uploaded/}) {  
         $$titleref=&mt('Copy of').' '.$$titleref;  
     }  
     my $now = time;  
     my $suffix=$$.int(rand(100)).$now;  
     my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/);  
     if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) {  
         my $path = $1;  
         my $prefix = $2;  
         my $ancestor = $3;  
         if (length($ancestor) > 10) {  
             $ancestor = substr($ancestor,-10,10);  
         }  
         my $newid;  
         if ($prefixchg) {  
             if ($folder =~ /^supplemental/) {              if ($folder =~ /^supplemental/) {
                 $prefix =~ s/^default/supplemental/;                  $title = $env{'docs.markedcopy_supplemental'};
             } else {  
                 $prefix =~ s/^supplemental/default/;  
             }  
         }  
         if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {  
             $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;  
         } else {  
             $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext;  
         }  
         my $counter = 0;  
         my $is_unique = &uniqueness_check($newurl);  
         if ($folder =~ /^default/) {  
             if ($allmaps->{$newurl}) {  
                 $is_unique = 0;  
             }  
         }  
         while ((!$is_unique || $allmaps->{$newurl} || $newurls->{$newurl}) && ($counter < 100)) {  
             $counter ++;  
             $suffix ++;  
             if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) {  
                 $newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext;  
             } else {              } else {
                 $newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext;                  (undef,undef,$title) =
                       &Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'});
             }              }
             $is_unique = &uniqueness_check($newurl);  
         }  
         if ($is_unique) {  
             $newurls->{$newurl} = 1;  
         } else {          } else {
             if ($url=~/\.page$/) {              if ($folder=~/^supplemental/) {
                 return (undef,&mt('Paste failed: an error occurred creating a unique URL for the composite page'));                  $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
             } else {                         $env{'user.domain'}.'___&&&___'.$title;
                 return (undef,&mt('Paste failed: an error occurred creating a unique URL for the folder'));  
             }              }
         }          }
           $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res';
           push(@LONCAPA::map::order, $newidx);
     }      }
     return ($newurl);      return $result;
 }  }
   
 sub dbcopy {  sub dbcopy {
     my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;      my ($url,$coursedom,$coursenum) = @_;
     my ($url,$result,$errtext);      if ($url=~ m{/smppg$}) {
     if (ref($dbref) eq 'HASH') {          my $db_name = &Apache::lonsimplepage::get_db_name($url);
         $url = $dbref->{'src'};          if ($db_name =~ /^smppage_/) {
         if ($url =~ m{/(smppg|bulletinboard|ext\.tool)$}) {              #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 ($prefix eq 'ext.tool') {              my $now = time();
                 $prefix = 'exttool';              $db_name =~ s{_\d*$ }{_$now}x;
             }              my $result=&Apache::lonnet::put($db_name,\%contents,
             if (($dbref->{'cdom'} =~ /^$match_domain$/) &&                                              $coursedom,$coursenum);
                 ($dbref->{'cnum'} =~ /^$match_courseid$/)) {              $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x;
                 my $db_name;  
                 my $marker = (split(m{/},$url))[4];  
                 $marker=~s/\D//g;  
                 if ($dbref->{'src'} =~ m{/smppg$}) {  
                     $db_name =  
                         &Apache::lonsimplepage::get_db_name($url,$marker,  
                                                             $dbref->{'cdom'},  
                                                             $dbref->{'cnum'});  
                 } elsif ($dbref->{'src'} =~ m{/ext\.tool$}) {  
                     $db_name = 'exttool_'.$marker;  
                 } 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);  
                     } elsif ($prefix eq 'exttool') {  
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying an external tool [_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|ext\.tool)$}{/$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.');  
                     } elsif ($prefix eq 'exttool') {  
                         $lockerrorsref->{$prefix} .=  
                             ' '.&mt('This will prevent addition of more external tools to 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 2229  sub uniqueness_check { Line 974  sub uniqueness_check {
 }  }
   
 sub contained_map_check {  sub contained_map_check {
     my ($url,$folder,$coursenum,$coursedom,$removefrommap,$removeparam,$addedmaps,      my ($url,$folder,$removefrommap,$addedmaps) = @_;
         $hierarchy,$titles,$allmaps) = @_;  
     my $content = &Apache::lonnet::getfile($url);      my $content = &Apache::lonnet::getfile($url);
     unless ($content eq '-1') {      unless ($content eq '-1') {
         my $parser = HTML::TokeParser->new(\$content);          my $parser = HTML::TokeParser->new(\$content);
Line 2242  sub contained_map_check { Line 986  sub contained_map_check {
                 my $ressrc = $token->[2]->{'src'};                  my $ressrc = $token->[2]->{'src'};
                 if ($folder =~ /^supplemental/) {                  if ($folder =~ /^supplemental/) {
                     unless (&supp_pasteable($ressrc)) {                      unless (&supp_pasteable($ressrc)) {
                         $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;                          $removefrommap->{$url}{$token->[2]->{'id'}};
                         next;                          next;
                     }                      }
                 }                  }
                 if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) {                  if ($ressrc =~ /\.(sequence|page)$/) {
                     if ($1 eq 'uploaded') {                      if (ref($addedmaps->{$ressrc}) eq 'ARRAY') {
                         $hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc;                          push(@{$addedmaps->{$ressrc}},$url);
                         $titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'};  
                     } else {                      } else {
                         if ($allmaps->{$ressrc}) {                          $addedmaps->{$ressrc} = [$url];
                             $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;  
                         } elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') {  
                             $removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc;  
                         } else {  
                             $addedmaps->{$ressrc} = [$url];  
                         }  
                     }                      }
                     &contained_map_check($ressrc,$folder,$coursenum,$coursedom,                      &contained_map_check($ressrc,$folder,$removefrommap,$addedmaps);
                                          $removefrommap,$removeparam,  
                                          $addedmaps,$hierarchy,$titles,$allmaps);  
                 }                  }
             } elsif ($token->[1] eq 'param') {              } elsif ($token->[1] !~ /^resource|map|link$/) {
                 if ($folder =~ /^supplemental/) {                  if ($folder =~ /^supplemental/) {
                     if (ref($removeparam->{$url}{$token->[2]->{'to'}}) eq 'ARRAY') {                      $removefrommap->{$url}{$token->[1]};
                         push(@{$removeparam->{$url}{$token->[2]->{'to'}}},$token->[2]->{'name'});  
                     } else {  
                         $removeparam->{$url}{$token->[2]->{'to'}} = [$token->[2]->{'name'}];   
                     }  
                 }                  }
             }              }
         }          }
Line 2277  sub contained_map_check { Line 1008  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,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies,
         $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,          $dbcopies,$zombies,$params,$mapmoves,$mapchanges) = @_;
         $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})) {
         $checktitle = 1;          $checktitle = 1;
     }      }
     my $skip;  
     if ($oldurl =~ m{^\Q/uploaded/$cdom/$cnum/\E(default|supplemental)(_?\d*)\.(?:page|sequence)$}) {  
         my $mapid = $1.$2;  
         if ($tomove->{$mapid}) {  
             $skip = 1;  
         }  
     }  
     my $file = &Apache::lonnet::getfile($oldurl);      my $file = &Apache::lonnet::getfile($oldurl);
     return if ($file eq '-1');      return if ($file eq '-1');
     my $parser = HTML::TokeParser->new(\$file);      my $parser = HTML::TokeParser->new(\$file);
Line 2304  sub url_paste_fixups { Line 1036  sub url_paste_fixups {
             my $ressrc = $token->[2]->{'src'};              my $ressrc = $token->[2]->{'src'};
             next if ($ressrc eq '');              next if ($ressrc eq '');
             my $id = $token->[2]->{'id'};              my $id = $token->[2]->{'id'};
             my $title = $token->[2]->{'title'};  
             if ($checktitle) {              if ($checktitle) {
                   my $title = $token->[2]->{'title'};
                 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);                  $zombies->{$oldurl}{$ressrc} = $id;
                 $zombies->{$oldurl}{$id} = $ressrc;  
                 $changed = 1;                  $changed = 1;
             } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
                 my $srcdom = $1;                  my $srccdom = $1;
                 my $srcnum = $2;                  my $srccnum = $2;
                 my $rem = $3;                  my $rem = $3;
                 my $newurl;                  if (($srccdom ne $cdom) || ($srccnum ne $cnum) || ($prefixchg) ||
                 my $mapname;                      ($mapchanges->{$oldurl})) {
                 if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) {  
                     my $prefix = $1;  
                     $mapname = $prefix.$2;  
                     if ($tomove->{$mapname}) {  
                         &url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,  
                                           $srcdom,$srcnum,$allmaps,$rewrites,  
                                           $retitles,$copies,$dbcopies,$zombies,  
                                           $params,$mapmoves,$mapchanges,$tomove,  
                                           $newsubdir,$newurls);  
                         next;  
                     } else {  
                         ($newurl,my $error) =  
                             &get_newmap_url($ressrc,$folder,$prefixchg,$cdom,$cnum,  
                                             $srcdom,$srcnum,\$title,$allmaps,$newurls);  
                         if ($newurl =~ /(?:default|supplemental)_(\d+)\.(?:sequence|page)$/) {  
                             $newsubdir->{$ressrc} = $1;  
                         }  
                         if ($error) {  
                             next;  
                         }  
                     }  
                 }  
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum) || ($prefixchg) ||  
                     ($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,$prefixchg,$cdom,$cnum,$allmaps,
                                                   $cnum,$srcdom,$srcnum,$allmaps,                                                    $rewrites,$retitles,$copies,$dbcopies,$zombies,
                                                   $rewrites,$retitles,$copies,$dbcopies,                                                    $params,$mapmoves,$mapchanges)) {
                                                   $zombies,$params,$mapmoves,$mapchanges,  
                                                   $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);                  my $srccdom = $1;
                 my $srcdom = $1;                  my $srccnum = $2;
                 my $srcnum = $2;                  if (($srccdom ne $cdom) || ($srccnum ne $cnum)) {
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                      $rewrites->{$oldurl}{$ressrc} = $id;
                     $rewrites->{$oldurl}{$id} = $ressrc;                      $dbcopies->{$oldurl}{$ressrc} = $id;
                     $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;  
                     $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;  
                     $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;  
                     $changed = 1;  
                 }  
             } elsif ($ressrc =~ m{^/adm/$match_domain/$match_username/\d+/(smppg|bulletinboard)$}) {  
                 if (($fromcdom ne $cdom) || ($fromcnum ne $cnum) ||  
                     ($env{'form.docs.markedcopy_options'} ne 'move')) {  
                     $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;  
                     $dbcopies->{$oldurl}{$id}{'cdom'} = $fromcdom;  
                     $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum;  
                     $changed = 1;                      $changed = 1;
                 }                  }
             } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {
                 next if ($skip);                  my $srccdom = $1;
                 my $srcdom = $1;                  my $srccnum = $2;
                 my $srcnum = $2;                  if (($srccdom ne $cdom) || ($srccnum ne $cnum)) {
                 if (($srcdom ne $cdom) || ($srcnum ne $cnum)) {                      $rewrites->{$oldurl}{$ressrc} = $id;
                     $dbcopies->{$oldurl}{$id}{'src'} = $ressrc;                      $dbcopies->{$oldurl}{$ressrc} = $id;
                     $dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom;  
                     $dbcopies->{$oldurl}{$id}{'cnum'} = $srcnum;  
                     $changed = 1;                      $changed = 1;
                 }                  }
             }              }
         } elsif ($token->[1] eq 'param') {          } elsif ($token->[1] eq 'param') {
             next if ($skip);  
             my $to = $token->[2]->{'to'};               my $to = $token->[2]->{'to'}; 
             if ($to ne '') {              if ($to ne '') {
                 if (ref($params->{$oldurl}{$to}) eq 'ARRAY') {                  if (ref($params->{$oldurl}{$to}) eq 'ARRAY') {
                     push(@{$params->{$oldurl}{$to}},$token->[2]->{'name'});                      push (@{$params->{$oldurl}{$to}},$token->[2]->{'name'});
                 } else {                  } else {
                     @{$params->{$oldurl}{$to}} = ($token->[2]->{'name'});                      @{$params->{$oldurl}{$to}} = ($token->[2]->{'name'});
                 }                  }
Line 2409  sub url_paste_fixups { Line 1100  sub url_paste_fixups {
 }  }
   
 sub apply_fixups {  sub apply_fixups {
     my ($folder,$is_map,$cdom,$cnum,$errors,$updated,$info,$moves,$prefixchg,      my ($is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap,$rewrites,
         $oldurl,$url,$caller) = @_;          $retitles,$copies,$dbcopies,$zombies,$params,$docmoves,$mapmoves,$errors,
     my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,          $before,$after) = @_;
         %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,      my ($oldsubdir,$newsubdir,$subdirchg);
         %lockerrors,$lockmsg);      if ($is_map) {
     if (ref($updated) eq 'HASH') {          ($oldsubdir) =
         if (ref($updated->{'rewrites'}) eq 'HASH') {              ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_?(\d*)});
             %rewrites = %{$updated->{'rewrites'}};          if ($oldsubdir eq '') {
         }              $oldsubdir = 'default';
         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') {          ($newsubdir) =
             %docmoves = %{$moves->{'docmoves'}};              ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_?(\d*)});
           if ($newsubdir eq '') {
               $newsubdir = 'default';
         }          }
         if (ref($moves->{'mapmoves'}) eq 'HASH') {          if ($oldsubdir ne $newsubdir) {
             %mapmoves = %{$moves->{'mapmoves'}};              $subdirchg = 1;
         }          }
     }      }
     foreach my $key (keys(%copies),keys(%docmoves)) {      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);
                 }                  }
             }              }
         }          }
         if (@allcopies > 0) {          if (@allcopies > 0) {
             foreach my $item (@allcopies) {              foreach my $item (@allcopies) {
                 my ($relpath,$oldsubdir,$fname) =                   my ($relpath,$fname) = 
                     ($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(default|\d+)/.*/)([^/]+)$});                      ($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(?:default|\d+)/.*/)([^/]+)$});
                 if ($fname ne '') {                  if ($fname ne '') {
                     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 (($key eq $oldurl) && ($subdirchg)) {
                                 $storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir{$key}/#;                                  $storefn =~ s{^(docs|supplemental)/\Q$oldsubdir\E/}{$1/$newsubdir/};
                             }                              }
                         }                          }
                         &copy_dependencies($item,$storefn,$relpath,$errors,\$content);                          &copy_dependencies($item,$storefn,$relpath,$errors,\$content);
Line 2505  sub apply_fixups { Line 1163  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 2516  sub apply_fixups { Line 1174  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}) {  
             $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 2543  sub apply_fixups { Line 1198  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(%{$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,%zombie,%newdb);
             if (ref($rewrites{$key}) eq 'HASH') {              if (ref($rewrites->{$key}) eq 'HASH') {
                 %torewrite = %{$rewrites{$key}};                  %torewrite = %{$rewrites->{$key}};
             }  
             if (ref($retitles{$key}) eq 'HASH') {  
                 %toretitle = %{$retitles{$key}};  
             }  
             if (ref($removefrommap{$key}) eq 'HASH') {  
                 %toremove = %{$removefrommap{$key}};  
             }  
             if (ref($removeparam{$key}) eq 'HASH') {  
                 %remparam = %{$removeparam{$key}};  
             }  
             if (ref($zombies{$key}) eq 'HASH') {  
                 %zombie = %{$zombies{$key}};  
             }  
             if (ref($dbcopies{$key}) eq 'HASH') {  
                 foreach my $idx (keys(%{$dbcopies{$key}})) {  
                     if (ref($dbcopies{$key}{$idx}) eq 'HASH') {  
                         my ($newurl,$result,$errtext) =  
                             &dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors);  
                         if ($result eq 'ok') {  
                             $newdb{$idx} = $newurl;  
                         } elsif (ref($errors) eq 'HASH') {  
                             $errors->{$key} = 1;  
                         }  
                         push(@msgs,$errtext);  
                     }  
                 }  
             }              }
             if (ref($params{$key}) eq 'HASH') {              if (ref($retitles->{$key}) eq 'HASH') {
                 %currparam = %{$params{$key}};                  %toretitle = %{$retitles->{$key}};
             }              }
             my ($errtext,$fatal) = &LONCAPA::map::mapread($key);              if (ref($removefrommap->{$key}) eq 'HASH') {
             if ($fatal) {                  %toremove = %{$removefrommap->{$key}};
                 return ($errtext);  
             }              }
             for (my $i=0; $i<@LONCAPA::map::zombies; $i++) {              if (ref($zombies->{$key}) eq 'HASH') {
                 if (defined($LONCAPA::map::zombies[$i])) {                  %zombie = %{$zombies->{$key}};
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]);              }
                     if ($zombie{$i} eq $src) {              if (ref($dbcopies->{$key}) eq 'HASH') {
                         undef($LONCAPA::map::zombies[$i]);                  foreach my $item (keys(%{$dbcopies->{$key}})) {
                     }                      $newdb{$item} = &dbcopy($item);
                 }                  }
             }              }
             for (my $i=0; $i<@LONCAPA::map::order; $i++) {              my $map = &Apache::lonnet::getfile($key);
                 my $idx = $LONCAPA::map::order[$i];              my $newcontent;
                 if (defined($LONCAPA::map::resources[$idx])) {              if ($map eq '-1') {
                     my $changed;                  return &mt('Paste failed: an error occurred reading a folder or page: [_1].',$key);
                     my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$idx]);              } else {
                     if ((exists($toremove{$idx})) &&                   my $parser = HTML::TokeParser->new(\$map);
                         ($toremove{$idx} eq &LONCAPA::map::qtescape($src))) {                  $parser->attr_encoded(1);
                         splice(@LONCAPA::map::order,$i,1);                  while (my $token = $parser->get_token) {
                         if (ref($currparam{$idx}) eq 'ARRAY') {                      if ($token->[0] eq 'S') {
                             foreach my $name (@{$currparam{$idx}}) {                          if ($token->[2]->{'type'} eq 'zombie') {
                                 &LONCAPA::map::delparameter($idx,'parameter_'.$name);                              next if (($token->[2]->{'src'} ne '') &&
                                        ($zombie{$token->[2]->{'src'}} eq $token->[2]->{'id'}));
                           }
                           if ($token->[1] eq 'resource') {
                               my $src = $token->[2]->{'src'};
                               my $id = $token->[2]->{'id'};
                               my $title = $token->[2]->{'title'};
                               my $changed;
                               if ((exists($toretitle{$src})) && ($toretitle{$src} eq $id)) {
                                   if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {
                                       $token->[2]->{'title'} = $1;
                                       $changed = 1;
                                   }
                             }                              }
                         }                              if ((exists($torewrite{$src})) && ($torewrite{$src} eq $id)) {
                         next;                                  $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};
                     }                                  if ($src =~ m{^/uploaded/}) {
                     my $origsrc = $src;                                      if ($prefixchg) {
                     if ((exists($toretitle{$idx})) && ($toretitle{$idx} eq $src)) {                                          if ($src =~ /\.(page|sequence)$/) {
                         if ($title =~ m{^\d+\Q___&amp;&amp;&amp;___\E$match_username\Q___&amp;&amp;&amp;___\E$match_domain\Q___&amp;&amp;&amp;___\E(.+)$}) {                                              $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'map'}\E#$1$after->{'map'}#;
                             $changed = 1;                                          } else {
                         }                                              $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'doc'}\E#$1$after->{'doc'}#;
                     }                                          }
                     if ((exists($torewrite{$idx})) && ($torewrite{$idx} eq $src)) {                                      }
                         $src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/};                                      if (($key eq $oldurl) && ($src !~ /\.(page|sequence)$/) && ($subdirchg)) {
                         if ($origsrc =~ m{^/uploaded/}) {                                          $src =~ s{^(/uploaded/$match_domain/$match_courseid/\w+/)\Q$oldsubdir\E}{$1$newsubdir};
                             if ($prefixchg && $before{'map'} && $after{'map'}) {                                      }
                                 if ($src =~ /\.(page|sequence)$/) {  
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'map'}\E#$1$after{'map'}#;  
                                 } else {  
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before{'doc'}\E#$1$after{'doc'}#;  
                                 }                                  }
                                   $token->[2]->{'src'} = $src;
                                   $changed = 1;
                               } elsif ($newdb{$src} ne '') {
                                   $token->[2]->{'src'} = $newdb{$src};
                                   $changed = 1;
                             }                              }
                             if ($origsrc =~ /\.(page|sequence)$/) {                              if ($changed) {
                                 if ($newsubdir{$origsrc}) {                                  $newcontent .= "<$token->[1]";
                                     $src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir{$origsrc}#;                                  foreach my $attr (@{$token->[3]}) {
                                       if ($attr =~ /^\w+$/) {
                                           $newcontent .=  ' '.$attr.'="'.$token->[2]->{$attr}.'"';
                                       }
                                 }                                  }
                             } elsif ($newsubdir{$key}) {                                  $newcontent .= ' />'."\n";
                                 $src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir{$key}#;                              } else {
                                   $newcontent .= $token->[4]."\n";
                             }                              }
                           } elsif (($token->[2]->{'id'} ne '') &&
                                    (exists($toremove{$token->[2]->{'id'}}))) {
                               next;
                           } else {
                               $newcontent .= $token->[4]."\n";
                         }                          }
                         $changed = 1;                      } elsif ($token->[0] eq 'E') {
                     } elsif ($newdb{$idx} ne '') {                          $newcontent .= $token->[2]."\n";
                         $src = $newdb{$idx};  
                         $changed = 1;  
                     }  
                     if ($changed) {  
                         $LONCAPA::map::resources[$idx] = join(':',($title,&LONCAPA::map::qtunescape($src),$ext,$type));  
                     }                      }
                 }                  }
             }              }
             foreach my $idx (keys(%remparam)) {  
                 if (ref($remparam{$idx}) eq 'ARRAY') {  
                     foreach my $name (@{$remparam{$idx}}) {     
                         &LONCAPA::map::delparameter($idx,'parameter_'.$name);  
                     }  
                 }  
             }  
             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 2664  sub apply_fixups { Line 1305  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}) {  
                     $storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;  
                 }                  }
             }              }
             my $report;              my $newmapurl =
             if ($folder !~ /^supplemental/) {                  &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn,
                 $report = 1;                                                     $newcontent);
             }              if ($newmapurl eq '/adm/notfound.html') {
             (my $outtext,$errtext) =                  return &mt('Paste failed: an error occurred saving the folder or page.');
                 &LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report);  
             if ($errtext) {  
                 if ($caller eq 'paste') {  
                     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 2749  my %parameter_type = ( 'randompick' Line 1382  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 2892  sub handle_edit_cmd { Line 1431  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 2900  sub handle_edit_cmd { Line 1440  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 2909  sub handle_edit_cmd { Line 1448  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,$ltitoolsref,          $supplementalflag,$orderhash,$iconpath)=@_;
         $canedit,$navmapref,$hiddentop)=@_;      my $container= ($env{'form.pagepath'}) ? 'page'
     my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container);                             : 'sequence';
     if ($allowed) {  
         (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,      my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) =
          $is_random_order,$container) =          &breadcrumbs($allowed,$crstype);
             &Apache::lonhtmlcommon::docs_breadcrumbs($allowed,$crstype,1);      $r->print($breadcrumbtrail);
         $r->print($breadcrumbtrail);  
     } elsif ($env{'form.folderpath'} =~ /\:1$/) {  
         $container = 'page';   
     } else {  
         $container = 'sequence';  
     }  
   
     my $jumpto;  
   
     unless ($supplementalflag) {      my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
         $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 2959  sub editor { Line 1476  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 2979  sub editor { Line 1496  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 =
                 &do_paste_from_buffer($coursenum,$coursedom,$folder,$container,                  &do_paste_from_buffer($coursenum,$coursedom,$folder,\%paste_errors);
                                       \%paste_errors);              if ($paste_res eq 'ok') {
             if (ref($pastemsgarray) eq 'ARRAY') {  # Store the result
                 if (@{$pastemsgarray} > 0) {                  ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container);
                     $r->print('<p class="LC_info">'.                  return $errtext if ($fatal);
                               join('<br />',@{$pastemsgarray}).              } elsif ($paste_res ne '') {
                               '</p>');                  $r->print('<p><span class="LC_error">'.$paste_res.'</span></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 (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 3016  sub editor { Line 1514  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)) {      ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
             my $contentchg;  
             if ($env{'form.cmd'} =~ m{^(remove|cut)_}) {  
                 $contentchg = 1;  
             }  
     ($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)$}) {  
                         my ($suffix,$errortxt,$locknotfreed) =  
                             &new_timebased_suffix($coursedom,$coursenum,'map',$1,$2);  
                         if ($locknotfreed) {  
                             $r->print($locknotfreed);  
                         }  
                         if ($suffix) {  
                             $url =~ s/_new\./_$suffix./;   
                         } else {  
                             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{^/adm/$coursedom/$coursenum/new/ext\.tool}) {  
                         my ($suffix,$errortxt,$locknotfreed) =  
                             &new_timebased_suffix($coursedom,$coursenum,'exttool');  
                         if ($locknotfreed) {  
                             $r->print($locknotfreed);  
                         }  
                         if ($suffix) {  
                             $url =~ s{^(/adm/$coursedom/$coursenum)/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',$ltitoolsref,@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 3170  sub editor { Line 1546  sub editor {
     $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;      $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
  }   }
  ($errtext,$fatal)=&storemap($coursenum,$coursedom,   ($errtext,$fatal)=&storemap($coursenum,$coursedom,
     $folder.'.'.$container,1);      $folder.'.'.$container);
  return $errtext if ($fatal);   return $errtext if ($fatal);
     } else {      } else {
  $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');   $r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>');
Line 3214  sub editor { Line 1590  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 3232  sub editor { Line 1599  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,$crstype);
                               $pathitem,$supplementalflag,$container,  
                               \%filters,\%curr_groups,$ltitoolsref,$canedit,  
                               $isencrypted,$navmapref);  
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
     &Apache::loncommon::end_data_table_count();      &Apache::loncommon::end_data_table_count();
       
     my $need_save;      if ($shown) {
     if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {          $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
         my $toolslink;                    .&Apache::loncommon::start_data_table(undef,'contentlist');
         if ($allowed) {          if ($allowed) {
             $toolslink = '<table><tr><td>'              $to_show .= &Apache::loncommon::start_data_table_header_row()
                        .&Apache::loncommon::help_open_menu('Navigation Screen',                       .'<th colspan="2">'.&mt('Move').'</th>'
                                                            'Navigation_Screen',undef,'RAT')                       .'<th>'.&mt('Actions').'</th>'
                        .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'                       .'<th colspan="2">'.&mt('Document').'</th>';
                        .'<td align="left"><ul id="LC_toolbar">'              if ($folder !~ /^supplemental/) {
                        .'<li><a href="/adm/coursedocs?forcesupplement=1&amp;command=editsupp" '                  $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';
                        .'id="LC_content_toolbar_edittoplevel" '  
                        .'class="LC_toolbarItem" '  
                        .'title="'.&mt('Supplemental Content Editor').'">'  
                        .'</a></li></ul></td></tr></table><br />';  
         }  
         if ($shown) {  
             if ($allowed) {  
                 $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')  
                           .&Apache::loncommon::start_data_table(undef,'contentlist')  
                           .&Apache::loncommon::start_data_table_header_row()  
                           .'<th colspan="2">'.&mt('Move').'</th>'  
                           .'<th colspan="2">'.&mt('Actions').'</th>'  
                           .'<th>'.&mt('Document').'</th>';  
                 if ($folder !~ /^supplemental/) {  
                     $to_show .= '<th colspan="4">'.&mt('Settings').'</th>';  
                 }  
                 $to_show .= &Apache::loncommon::end_data_table_header_row();  
                 if ($folder !~ /^supplemental/) {  
                     $lists{'canhide'} = join(',',@allidx);  
                     $lists{'canrandomlyorder'} = join(',',@allmapidx);  
                     my @possfilters = ('canremove','cancut','cancopy','hiddenresource','encrypturl',  
                                        'randomorder','randompick');  
                     foreach my $item (@possfilters) {  
                         if (ref($filters{$item}) eq 'ARRAY') {  
                             if (@{$filters{$item}} > 0) {  
                                 $lists{$item} = join(',',@{$filters{$item}});  
                             }  
                         }  
                     }  
                     if (@allidx > 0) {  
                         my $path;  
                         if ($env{'form.folderpath'}) {  
                             $path =  
                                 &HTML::Entities::encode($env{'form.folderpath'},'<>&"');  
                         }  
                         if (@allidx > 1) {  
                             $to_show .=  
                                 &Apache::loncommon::continue_data_table_row().  
                                 '<td colspan="2">&nbsp;</td>'.  
                                 '<td>'.  
                                 &multiple_check_form('actions',\%lists,$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()  
                            .'<br style="line-height:2px;" />'  
                            .&Apache::loncommon::end_scrollbox();  
             } else {  
                 $to_show .= $toolslink  
                            .&Apache::loncommon::start_data_table('LC_tableOfContent')  
                            .$output.' '  
                            .&Apache::loncommon::end_data_table();  
             }  
         } else {  
             if (!$allowed) {  
                 $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::end_data_table_header_row();
                        .'<div class="LC_info" id="contentlist">'  
                        .$noresmsg  
                        .'</div>'  
                        .&Apache::loncommon::end_scrollbox();  
         }          }
           $to_show .= $output.' '
                    .&Apache::loncommon::end_data_table()
                    .'<br style="line-height:2px;" />'
                    .&Apache::loncommon::end_scrollbox();
     } else {      } else {
         if ($shown) {          $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
             $to_show = '<div>'                   .'<div class="LC_info" id="contentlist">'
                       .&Apache::loncommon::start_data_table('LC_tableOfContent')                   .&mt('Currently no documents.')
                       .$output                   .'</div>'
                       .&Apache::loncommon::end_data_table()                   .&Apache::loncommon::end_scrollbox();
                       .'</div>';  
         } else {  
             $to_show = '<div class="LC_info" id="contentlist">'  
                       .&mt('Currently empty')  
                       .'</div>'  
         }  
     }      }
     my $tid = 1;      my $tid = 1;
     if ($supplementalflag) {      if ($supplementalflag) {
Line 3354  sub editor { Line 1636  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);
             &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);  
         }  
     } else {      } else {
           if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
               #Function Box for Supplemental Content for users with mdc priv.
               my $funcname = &mt('Folder Editor');
               $r->print(
                   &Apache::loncommon::head_subbox(
                       &Apache::lonhtmlcommon::start_funclist().
                       &Apache::lonhtmlcommon::add_item_funclist(
                           '<a href="/adm/coursedocs?command=direct&forcesupplement=1&'.
                           'supppath='.&HTML::Entities::encode($env{'form.folderpath'}).'">'.
                           '<img src="/res/adm/pages/docs.png" alt="'.$funcname.'" class="LC_icon" />'.
                           '<span class="LC_menubuttons_inline_text">'.$funcname.'</span></a>').
                             &Apache::lonhtmlcommon::end_funclist()));
           }
         $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 3474  sub process_file_upload { Line 1673  sub process_file_upload {
         my $errtext='';          my $errtext='';
         my $fatal=0;          my $fatal=0;
         my $container='sequence';          my $container='sequence';
         if ($env{'form.folderpath'} =~ /:1$/) {          if ($env{'form.pagepath'}) {
             $container='page';              $container='page';
         }          }
         ($errtext,$fatal)=          ($errtext,$fatal)=
             &mapread($coursenum,$coursedom,$folder.'.'.$container);                &mapread($coursenum,$coursedom,$folder.'.'.$container);
         if ($#LONCAPA::map::order<1) {          if ($#LONCAPA::map::order<1) {
             $LONCAPA::map::order[0]=1;              $LONCAPA::map::order[0]=1;
             $LONCAPA::map::resources[1]='';              $LONCAPA::map::resources[1]='';
         }          }
           if ($fatal) {
               $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>';
               return;
           }
         my $destination = 'docs/';          my $destination = 'docs/';
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
             $destination = 'supplemental/';              $destination = 'supplemental/';
Line 3492  sub process_file_upload { Line 1695  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 3527  sub process_file_upload { Line 1726  sub process_file_upload {
     $comment.':'.$url.':'.$ext.':normal:res';      $comment.':'.$url.':'.$ext.':normal:res';
         $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;          $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
         ($errtext,$fatal)=&storemap($coursenum,$coursedom,          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
     $folder.'.'.$container,1);      $folder.'.'.$container);
         if ($fatal) {          if ($fatal) {
             $$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>';              $$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>';
             return;              return;
Line 3557  sub process_file_upload { Line 1756  sub process_file_upload {
                     $$upload_output .= &mt('No embedded items identified').'<br />';                      $$upload_output .= &mt('No embedded items identified').'<br />';
                 }                  }
                 $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';                  $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';
             } elsif ((&Apache::loncommon::is_archive_file($mimetype)) &&              } elsif (&Apache::loncommon::is_archive_file($mimetype)) {
                      ($env{'form.uploaddoc.filename'} =~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/i)) {  
                 $nextphase = 'decompress_uploaded';                  $nextphase = 'decompress_uploaded';
                 my $position = scalar(@LONCAPA::map::order)-1;                  my $position = scalar(@LONCAPA::map::order)-1;
                 my $noextract = &return_to_editor();                  my $noextract = &return_to_editor();
                 my $archiveurl = &HTML::Entities::encode($url,'<>&"');                  my $archiveurl = &HTML::Entities::encode($url,'<>&"');
                 my %archiveitems = (                  my %archiveitems = (
                     folderpath => $env{'form.folderpath'},                      folderpath => $env{'form.folderpath'},
                       pagepath   => $env{'form.pagepath'},
                     cmd        => $nextphase,                      cmd        => $nextphase,
                     newidx     => $newidx,                      newidx     => $newidx,
                     position   => $position,                      position   => $position,
Line 3618  sub is_supplemental_title { Line 1817  sub is_supplemental_title {
 # --------------------------------------------------------------- An entry line  # --------------------------------------------------------------- An entry line
   
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$crstype)=@_;
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,      my ($foldertitle,$pagetitle,$renametitle);
         $ltitoolsref,$canedit,$isencrypted,$navmapref)=@_;  
     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);
    $pagetitle = $foldertitle;
     } else {      } else {
  $title=&HTML::Entities::encode($title,'"<>&\'');   $title=&HTML::Entities::encode($title,'"<>&\'');
  $renametitle=$title;   $renametitle=$title;
  $foldertitle=$title;   $foldertitle=$title;
     }   $pagetitle=$title;
   
     my ($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 ($container, $type, $esc_path, $path, $symb);
     if ($env{'form.folderpath'}) {      if ($env{'form.folderpath'}) {
    $type = 'folder';
           $container = 'sequence';
  $esc_path=&escape($env{'form.folderpath'});   $esc_path=&escape($env{'form.folderpath'});
  $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');   $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
  # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');   # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
     }      }
     my $isexternal;      if ($env{'form.pagepath'}) {
     if ($residx) {          $type = $container = 'page';
         my $currurl = $url;          $esc_path=&escape($env{'form.pagepath'});
         $currurl =~ s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};   $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"');
         if ($currurl =~ m{^/adm/wrapper/ext/}) {          $symb=&escape($env{'form.pagesymb'});
             $isexternal = 1;  
         }  
         if (!$supplementalflag) {  
             my $path = 'uploaded/'.  
                        $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.  
                        $env{'course.'.$env{'request.course.id'}.'.num'}.'/';  
             $symb = &Apache::lonnet::encode_symb($path.$folder.".$container",  
                                                  $residx,  
                                                  &Apache::lonnet::declutter($currurl));  
         }  
     }  
     my ($renamelink,%lt,$ishash);  
     if (ref($filtersref) eq 'HASH') {  
         $ishash = 1;  
     }      }
       my $cpinfo='';
     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 3699  END Line 1865  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 3709  END Line 1875  END
     }      }
     $selectbox.='</select>';      $selectbox.='</select>';
  }   }
  %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                 'up' => 'Move Up',                  'up' => 'Move Up',
  'dw' => 'Move Down',   'dw' => 'Move Down',
  'rm' => 'Remove',   'rm' => 'Remove',
                 'ct' => 'Cut',                  'ct' => 'Cut',
  'rn' => 'Rename',   'rn' => 'Rename',
  'cp' => 'Copy',   'cp' => 'Copy');
                 'ex' => 'External Resource',   my $nocopy=0;
                 'et' => 'External Tool',          my $nocut=0;
                 'ed' => 'Edit',          if ($url=~/\.(page|sequence)$/) {
                 'pr' => 'Preview',      if ($url =~ m{/res/}) {
                 'sv' => 'Save',   # no copy for published maps
                 'ul' => 'URL',   $nocopy = 1;
                 'ti' => 'Title',      } else {
                 'er' => 'Editing rights unavailable for your current role.',     foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) {
                 );      my ($title,$url,$ext,$type)=split(/\:/,$item);
  my %denied = &action_restrictions($coursenum,$coursedom,$url,      if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
                                           $env{'form.folderpath'},   $nocopy=1;
                                           $currgroups);   last;
         my ($copylink,$cutlink,$removelink);      }
    }
       }
    }
           if ($url=~/^\/res\/lib\/templates\//) {
              $nocopy=1;
              $nocut=1;
           }
           my $copylink='&nbsp;';
           my $cutlink='&nbsp;';
   
  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$
     |/aboutme$      |/aboutme$
     |/navmaps$      |/navmaps$
     |/bulletinboard$      |/bulletinboard$
                             |/ext\.tool$      |\.html$
     |\.html$)}x)      |^/adm/wrapper/ext)}x)) {
              || $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)  
 <span style="visibility: hidden;">$lt{'cp'}</span>  
 ENDCOPY  
         } else {  
             my $formname = 'edit_copy_'.$orderidx;  
             my $js = "javascript:checkForSubmit(document.forms.renameform,'copy','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');";  
     $copylink=(<<ENDCOPY);      $copylink=(<<ENDCOPY);
 <form name="$formname" method="post" action="/adm/coursedocs">  <a href="javascript:markcopy('$esc_path','$index','$renametitle','$container','$symb','$folder');" class="LC_docs_copy">$lt{'cp'}</a>
 $form_common  
 <input type="checkbox" name="copy" id="copy_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','copy');" class="LC_hidden" $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);  
 <span style="visibility: hidden;">$lt{'ct'}</span>  
 ENDCUT  
         } else {  
             my $formname = 'edit_cut_'.$orderidx;  
             my $js = "javascript:checkForSubmit(document.forms.renameform,'cut','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder');";  
     $cutlink=(<<ENDCUT);      $cutlink=(<<ENDCUT);
 <form name="$formname" method="post" action="/adm/coursedocs">  <a href="javascript:cutres('$esc_path','$index','$renametitle','$container','$symb','$folder',$skip_confirm);" class="LC_docs_cut">$lt{'ct'}</a>
 $form_common  
 <input type="hidden" name="skip_$orderidx" id="skip_cut_$orderidx" value="$skip_confirm" />  
 <input type="checkbox" name="cut" id="cut_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','cut');" class="LC_hidden" $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'}) {  
             $removelink=(<<ENDREM);  
 <span style="visibility: hidden;">$lt{'rm'}</a>  
 ENDREM  
         } 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);  
 <form name="$formname" method="post" action="/adm/coursedocs">  
 $form_common  
 <input type="hidden" name="skip_$orderidx" id="skip_remove_$orderidx" value="$skip_confirm" />  
 <input type="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  
             if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) {  
                 push(@{$filtersref->{'canremove'}},$orderidx);  
             }  
         }  
         $renamelink=(<<ENDREN);  
 <a href='javascript:changename("$esc_path","$index","$oldtitle");' class="LC_docs_rename">$lt{'rn'}</a>  
 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$cpinfo'>
     <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$cpinfo'>
     <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">
 $removelink     <a href='javascript:removeres("$esc_path","$index","$renametitle","$container","$symb",$skip_confirm);' class="LC_docs_remove">$lt{'rm'}</a>
 $cutlink  $cutlink
      <a href='javascript:changename("$esc_path","$index","$renametitle","$container","$symb");' class="LC_docs_rename">$lt{'rn'}</a>
 $copylink  $copylink
 </td>  </td>
 END  END
   
     }      }
 # Figure out what kind of a resource this is  # Figure out what kind of a resource this is
     my ($extension)=($url=~/\.(\w+)$/);      my ($extension)=($url=~/\.(\w+)$/);
     my $uploaded=($url=~/^\/*uploaded\//);      my $uploaded=($url=~/^\/*uploaded\//);
     my $icon=&Apache::loncommon::icon($url);      my $icon=&Apache::loncommon::icon($url);
     my $isfolder;      my $isfolder=0;
     my $ispage;      my $ispage=0;
     my $containerarg;      my $folderarg;
     my $folderurl;      my $pagearg;
       my $pagefile;
     if ($uploaded) {      if ($uploaded) {
         if (($extension eq 'sequence') || ($extension eq 'page')) {          if (($extension eq 'sequence') || ($extension eq 'page')) {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;              $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
             $containerarg = $1;              my $containerarg = $1;
     if ($extension eq 'sequence') {      if ($extension eq 'sequence') {
         $icon=$iconpath.'navmap.folder.closed.gif';          $icon=$iconpath.'navmap.folder.closed.gif';
                   $folderarg=$containerarg;
                 $isfolder=1;                  $isfolder=1;
             } else {              } else {
                 $icon=$iconpath.'page.gif';                  $icon=$iconpath.'page.gif';
                   $pagearg=$containerarg;
                 $ispage=1;                  $ispage=1;
             }              }
             $folderurl = &Apache::lonnet::declutter($url);  
             if ($allowed) {              if ($allowed) {
                 $url='/adm/coursedocs?';                  $url='/adm/coursedocs?';
             } else {              } else {
Line 3869  END Line 1997  END
  }   }
     }      }
   
     my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);  
     my $orig_url = $url;      my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
     $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};      my $external = ($url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/});
     if (!$supplementalflag && $residx && $symb) {      if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
         if ((!$isfolder) && (!$ispage)) {   my $symb=&Apache::lonnet::symbclean(
     (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);            &Apache::lonnet::declutter('uploaded/'.
     $url=&Apache::lonnet::clutter($url);             $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
     if ($url=~/^\/*uploaded\//) {             $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
         $url=~/\.(\w+)$/;             '.sequence').
         my $embstyle=&Apache::loncommon::fileembstyle($1);             '___'.$residx.'___'.
         if (($embstyle eq 'img') || ($embstyle eq 'emb')) {     &Apache::lonnet::declutter($url));
     $url='/adm/wrapper'.$url;   (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
         } elsif ($embstyle eq 'ssi') {   $url=&Apache::lonnet::clutter($url);
     #do nothing with these   if ($url=~/^\/*uploaded\//) {
         } elsif ($url!~/\.(sequence|page)$/) {      $url=~/\.(\w+)$/;
     $url='/adm/coursedocs/showdoc'.$url;      my $embstyle=&Apache::loncommon::fileembstyle($1);
         }      if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
             } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {   $url='/adm/wrapper'.$url;
                 my $wrapped = $1;      } elsif ($embstyle eq 'ssi') {
                 my $exturl = $2;   #do nothing with these
                 if ($wrapped eq '') {      } elsif ($url!~/\.(sequence|page)$/) {
                     $url='/adm/wrapper'.$url;   $url='/adm/coursedocs/showdoc'.$url;
                 }  
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {  
                     $nomodal = 1;  
                 }  
             } elsif ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {  
                 $url='/adm/wrapper'.$url;  
             } 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)) {   } elsif ($url=~m|^/ext/|) {
                 my $shownsymb = $symb;      $url='/adm/wrapper'.$url;
                 if ($isexternal) {      $external = 1;
                     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 {  
                 $url='';  
             }  
  }   }
     } elsif ($supplementalflag) {          if (&Apache::lonnet::symbverify($symb,$url)) {
         if ($isexternal) {      $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
             if ($url =~ /^([^#]+)#([^#]+)$/) {          } else {
                 $url = $1;              $url='';
                 $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;  
             }  
         }          }
    if ($container eq 'page') {
       my $symb=$env{'form.pagesymb'};
   
       $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
       $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
    }
     }      }
     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 || $extension eq 'sequence') {
     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'};
  if ($folderpath) { $folderpath.='&' };   if ($folderpath) { $folderpath.='&' };
         if (!$allowed && $supplementalflag) {  
             $folderpath.=$containerarg.'&'.$foldername;  
             $url.='folderpath='.&escape($folderpath);  
         } 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.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
                          ':'.$rpicknum.':'.$hiddenmap.':'.$encryptmap.':'.$randorder.':'.$ispage;                                                'parameter_randompick'))[0]
             unless ($url eq '') {                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                 $url.='folderpath='.&escape($folderpath);                                                'parameter_hiddenresource'))[0]=~/^yes$/i)
             }                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
             my $rpckchk;                                                'parameter_encrypturl'))[0]=~/^yes$/i)
             if ($rpicknum) {                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
                 $rpckchk = ' checked="checked"';                                                'parameter_randomorder'))[0]=~/^yes$/i);
                 if (($ishash) && (ref($filtersref->{'randompick'}) eq 'ARRAY')) {   $url.='folderpath='.&escape($folderpath).$cpinfo;
                     push(@{$filtersref->{'randompick'}},$orderidx.':'.$rpicknum);          my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
                 }                                                     'parameter_randompick'))[0];
             }          my $rpckchk;
             my $formname = 'edit_randompick_'.$orderidx;          if ($rpicknum) {
     $rand_pick_text =               $rpckchk = ' checked="checked"';
 '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".          }
 $form_param."\n".          my $formname = 'edit_rpick_'.$orderidx;
 $form_common."\n".   $rand_pick_text = 
 '<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.'">';  
             if ($rpicknum ne '') {  
                 $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';  
             }  
             $rand_pick_text .= '</span></span>'.  
                                $form_end;  
             my $ro_set;  
             if ($randorder) {  
                 $ro_set = 'checked="checked"';  
                 if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {  
                     push(@{$filtersref->{'randomorder'}},$orderidx);  
                 }  
             }  
             $formname = 'edit_rorder_'.$orderidx;  
     $rand_order_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="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'.  '<span class="LC_nobreak"><label><input type="checkbox" name="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.'" />';
 $form_end;          if ($rpicknum ne '') {
         }              $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';
     } elsif ($supplementalflag && !$allowed) {          }
         my $isexttool;          $rand_pick_text .= '</span></form>';
         if ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {      my $ro_set=
             $url='/adm/wrapper'.$url;      ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');
             $isexttool = 1;   $rand_order_text = 
         }  $form_start.
         $url .= ($url =~ /\?/) ? '&amp;':'?';  $form_common.'
         $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');  <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>';
         if ($title) {      }
             $url .= '&amp;title='.&HTML::Entities::encode($renametitle,'<>&"');      if ($ispage) {
         }          my $pagename=&escape($pagetitle);
         if ((($isexternal) || ($isexttool)) && $orderidx) {          my $pagepath;
             $url .= '&amp;idx='.$orderidx;          my $folderpath=$env{'form.folderpath'};
         }          if ($folderpath) { $pagepath = $folderpath.'&' };
         if ($anchor ne '') {          $pagepath.=$pagearg.'&'.$pagename;
             $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');   my $symb=$env{'form.pagesymb'};
         }   if (!$symb) {
       my $path='uploaded/'.
    $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
    $env{'course.'.$env{'request.course.id'}.'.num'}.'/';
       $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
          $residx,
          $path.$pagearg.'.page');
    }
    $url.='pagepath='.&escape($pagepath).
       '&amp;pagesymb='.&escape($symb).$cpinfo;
     }      }
     my ($tdalign,$tdwidth);      if (($external) && ($allowed)) {
     if ($allowed) {   my $form = ($folder =~ /^default/)? 'newext' : 'supnewext';
         my $fileloc =    $external = '&nbsp;<a class="LC_docs_ext_edit" href="javascript:edittext(\''.$form.'\',\''.$residx.'\',\''.&escape($title).'\',\''.&escape($orig_url).'\');" >'.&mt('Edit').'</a>';
             &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));      } else {
         if ($isexternal) {   undef($external);
             ($editlink,$extresform) =   
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,  
                                                      undef,undef,undef,$disabled);  
         } elsif ($orig_url =~ m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {  
             ($editlink,$extresform) =  
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,  
                                                      undef,undef,undef,'tool',$coursedom,  
                                                      $coursenum,$ltitoolsref,$disabled);  
         } elsif (!$isfolder && !$ispage) {  
             my ($cfile,$home,$switchserver,$forceedit,$forceview) =   
                 &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);  
             if (($cfile ne '') && ($symb ne '' || $supplementalflag)) {  
                 my $suppanchor;  
                 if ($supplementalflag) {  
                     $suppanchor = $anchor;  
                 }  
                 my $jscall =   
                     &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,  
                                                             $switchserver,  
                                                             $forceedit,  
                                                             undef,$symb,  
                                                             &escape($env{'form.folderpath'}),  
                                                             $renametitle,'','',1,$suppanchor);  
                 if ($jscall) {  
                     $editlink = '<a class="LC_docs_ext_edit" href="javascript:'.  
                                 $jscall.'" >'.&mt('Edit').'</a>&nbsp;'."\n";  
                 }  
             }  
         }  
         $tdalign = ' align="right" valign="top"';  
         $tdwidth = ' width="80%"';  
     }      }
     my $reinit;      my $reinit;
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $reinit = &mt('(re-initialize community to access)');          $reinit = &mt('(re-initialize community to access)');
     } else {      } else {
         $reinit = &mt('(re-initialize course to access)');          $reinit = &mt('(re-initialize course to access)');
     }      }  
     $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;      $line.='<td>';
     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.='</span></td><td'.$tdwidth.'>';      $line.='</td><td>';
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'">'.$title.'</a>';         $line.='<a href="'.$url.'">'.$title.'</a>';
     } elsif ($url) {      } elsif ($url) {
        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.="$extresform</td>";      $line.=$external."</td>";
     $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');      $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');
     $rand_order_text = '&nbsp;' if ($rand_order_text eq '');      $rand_order_text = '&nbsp;' if ($rand_order_text eq '');
     if (($allowed) && ($folder!~/^supplemental/)) {      if (($allowed) && ($folder!~/^supplemental/)) {
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
        'ec' => 'URL hidden');         'ec' => 'URL hidden');
         my ($enctext,$hidtext);   my $enctext=
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {      ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');
             $enctext = ' checked="checked"';   my $hidtext=
             if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {      ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');
                 push(@{$filtersref->{'encrypturl'}},$orderidx);  
             }  
         }  
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {  
             $hidtext = ' checked="checked"';  
             if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {  
                 push(@{$filtersref->{'hiddenresource'}},$orderidx);  
             }  
         }  
         my $formhidden = 'edit_hiddenresource_'.$orderidx;  
         my $formurlhidden = 'edit_encrypturl_'.$orderidx;  
  $line.=(<<ENDPARMS);   $line.=(<<ENDPARMS);
   <td class="LC_docs_entry_parameter">    <td class="LC_docs_entry_parameter">
     <form action="/adm/coursedocs" method="post" name="$formhidden">      $form_start
     $form_param  
     $form_common      $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $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 4205  ENDPARMS Line 2153  ENDPARMS
     return $line;      return $line;
 }  }
   
 sub action_restrictions {  
     my ($cnum,$cdom,$url,$folderpath,$currgroups) = @_;  
     my %denied = (  
                    cut    => 0,  
                    copy   => 0,  
                    remove => 0,  
                  );  
     if ($url=~ m{^/res/.+\.(page|sequence)$}) {  
         # no copy for published maps  
         $denied{'copy'} = 1;  
     } elsif ($url=~m{^/res/lib/templates/}) {  
        $denied{'copy'} = 1;  
        $denied{'cut'} = 1;  
     } elsif ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {  
         if ($folderpath =~ /^default&[^\&]+$/) {  
             if ((ref($currgroups) eq 'HASH') && (keys(%{$currgroups}) > 0)) {  
                 $denied{'remove'} = 1;  
             }  
             $denied{'cut'} = 1;  
             $denied{'copy'} = 1;  
         }  
     } elsif ($url =~ m{^\Q/uploaded/$cdom/$cnum/group_folder_\E(\w+)\.sequence$}) {  
         my $group = $1;  
         if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+$/) {  
             if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) {  
                 $denied{'remove'} = 1;  
             }  
         }  
         $denied{'cut'} = 1;  
         $denied{'copy'} = 1;  
     } elsif ($url =~ m{^\Q/adm/$cdom/$cnum/\E(\w+)/smppg$}) {  
         my $group = $1;  
         if ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&\Qgroup_folder_$group\E\&[^\&]+$/) {  
             if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) {  
                 my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group});  
                 if (keys(%groupsettings) > 0) {  
                     $denied{'remove'} = 1;  
                 }  
                 $denied{'cut'} = 1;  
                 $denied{'copy'} = 1;  
             }  
         }  
     } elsif ($folderpath =~ /^default&[^\&]+\&group_allfolders\&[^\&]+\&group_folder_(\w+)\&/) {  
         my $group = $1;  
         if ($url =~ /group_boards_\Q$group\E/) {  
             if ((ref($currgroups) eq 'HASH') && (exists($currgroups->{$group}))) {  
                 my %groupsettings = &Apache::longroup::get_group_settings($currgroups->{$group});  
                 if (keys(%groupsettings) > 0) {  
                     if (ref($groupsettings{'functions'}) eq 'HASH') {  
                         if ($groupsettings{'functions'}{'discussion'} eq 'on') {  
                             $denied{'remove'} = 1;  
                         }  
                     }  
                 }  
                 $denied{'cut'} = 1;  
                 $denied{'copy'} = 1;  
             }  
         }  
     }  
     return %denied;  
 }  
   
 sub new_timebased_suffix {  
     my ($dom,$num,$type,$area,$container) = @_;  
     my ($prefix,$namespace,$idtype,$errtext,$locknotfreed);  
     if ($type eq 'paste') {  
         $prefix = $type;  
         $namespace = 'courseeditor';  
         $idtype = 'addcode';  
     } elsif ($type eq 'map') {  
         $prefix = 'docs';  
         if ($area eq 'supplemental') {  
             $prefix = 'supp';  
         }  
         $prefix .= $container;  
         $namespace = 'uploadedmaps';  
     } else {  
         $prefix = $type;  
         $namespace = 'templated';  
     }  
     my ($suffix,$freedlock,$error) =  
         &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num,$idtype);  
     if (!$suffix) {  
         if ($type eq 'paste') {  
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.');  
         } elsif ($type eq 'map') {  
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');  
         } elsif ($type eq 'smppg') {  
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');  
         } elsif ($type eq 'exttool') {  
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new external tool.');  
         } else {  
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new discussion board.');  
         }  
         if ($error) {  
             $errtext .= '<br />'.$error;  
         }  
     }  
     if ($freedlock ne 'ok') {  
         $locknotfreed =  
             '<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.');  
         } elsif ($type eq 'exttool') {  
             $locknotfreed .=  
                 &mt('This will prevent creation of additional external tools 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);  
 }  
   
 =pod  =pod
   
 =item tiehash()  =item tiehash()
Line 4436  sub checkonthis { Line 2248  sub checkonthis {
              $r->print('<span class="LC_error">'.&mt('connection down').'</span>');               $r->print('<span class="LC_error">'.&mt('connection down').'</span>');
           } elsif ($result eq 'not_found') {            } elsif ($result eq 'not_found') {
       unless ($url=~/\$/) {        unless ($url=~/\$/) {
   $r->print('<span class="LC_error">'.&mt('not found').'</span>');    $r->print('<span class="LC_error">'.&mt('not found').'</b></span>');
       } else {        } else {
   $r->print('<span class="LC_error">'.&mt('unable to verify variable URL').'</span>');    $r->print('<span class="LC_error">'.&mt('unable to verify variable URL').'</span>');
       }        }
Line 4482  sub list_symbs { Line 2294  sub list_symbs {
             $r->print(&Apache::loncommon::start_data_table_row().              $r->print(&Apache::loncommon::start_data_table_row().
                       '<td>'.$res->compTitle().'</td>'.                        '<td>'.$res->compTitle().'</td>'.
                       '<td>'.$res->symb().'</td>'.                        '<td>'.$res->symb().'</td>'.
                       &Apache::loncommon::end_data_table_row());                        &Apache::loncommon::start_data_table_row());
             $count ++;              $count ++;
         }          }
         if (!$count) {          if (!$count) {
Line 4492  sub list_symbs { Line 2304  sub list_symbs {
         }          }
         $r->print(&Apache::loncommon::end_data_table());          $r->print(&Apache::loncommon::end_data_table());
     }      }
     $r->print(&endContentScreen());  
 }  }
   
   
 sub verifycontent {  sub verifycontent {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content'));      $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>');       $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); 
    $hashtied=0;     $hashtied=0;
Line 4523  sub verifycontent { Line 2334  sub verifycontent {
    }     }
    &untiehash();     &untiehash();
    $r->print('<p class="LC_success">'.&mt('Done').'</p>');     $r->print('<p class="LC_success">'.&mt('Done').'</p>');
     $r->print(&endContentScreen());  
 }  }
   
   
Line 4534  sub devalidateversioncache { Line 2344  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 4555  sub checkversions { Line 2365  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=1;
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^ids\_(\/res\/.+)$/) {      if ($key=~/^ids\_(\/res\/.+)$/) {
  my $src=$1;   my $src=$1;
Line 4626  sub checkversions { Line 2434  sub checkversions {
  .&mt('seconds');   .&mt('seconds');
     if ($env{'form.timerange'}==-1) {      if ($env{'form.timerange'}==-1) {
  $seltext='since start of course';   $seltext='since start of course';
  $startsel=' selected="selected"';   $startsel='selected';
  $env{'form.timerange'}=time;   $env{'form.timerange'}=time;
     }      }
     $starttime=time-$env{'form.timerange'};      $starttime=time-$env{'form.timerange'};
     if ($env{'form.timerange'}==2592000) {      if ($env{'form.timerange'}==2592000) {
  $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $monthsel=' selected="selected"';   $monthsel='selected';
     } elsif ($env{'form.timerange'}==604800) {      } elsif ($env{'form.timerange'}==604800) {
  $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $weeksel=' selected="selected"';   $weeksel='selected';
     } elsif ($env{'form.timerange'}==86400) {      } elsif ($env{'form.timerange'}==86400) {
  $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';   $seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
  $daysel=' selected="selected"';   $daysel='selected';
     }      }
     $header=&mt('Content changed').' '.$seltext;      $header=&mt('Content changed').' '.$seltext;
  } else {   } else {
Line 4668  sub checkversions { Line 2476  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 4681  sub checkversions { Line 2484  sub checkversions {
 <fieldset>  <fieldset>
 <legend>$lt{'cd'}</legend>  <legend>$lt{'cd'}</legend>
 <select name="timerange">  <select name="timerange">
 <option value='all'$allsel>$lt{'al'}</option>  <option value='all' $allsel>$lt{'al'}</option>
 <option value="-1"$startsel>$lt{'st'}</option>  <option value="-1" $startsel>$lt{'st'}</option>
 <option value="2592000"$monthsel>$lt{'lm'}</option>  <option value="2592000" $monthsel>$lt{'lm'}</option>
 <option value="604800"$weeksel>$lt{'lw'}</option>  <option value="604800" $weeksel>$lt{'lw'}</option>
 <option value="86400"$daysel>$lt{'sy'}</option>  <option value="86400" $daysel>$lt{'sy'}</option>
 </select>  </select>
 <input type="submit" name="display" value="$lt{'sd'}" />  <input type="submit" name="display" value="$lt{'sd'}" />
 </fieldset>  </fieldset>
Line 4693  sub checkversions { Line 2496  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'}" />
   <table border="0">
 ENDHEADERS  ENDHEADERS
     #number of columns for version history      #number of columns for version history
     my %changedbytime;      my $num_ver_col = 1;
     foreach my $key (keys(%changes)) {  
         #excludes not versionable problems from resource version history:  
         next if ($key =~ /^\/res\/lib\/templates/);  
         my $chg;  
         if ($env{'form.timerange'} eq 'all') {  
             my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);  
             $chg = &Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate');  
         } else {  
             $chg = $changes{$key};  
             next if ($chg < $starttime);  
         }  
         push(@{$changedbytime{$chg}},$key);  
     }  
     if (keys(%changedbytime) == 0) {  
         &untiehash();  
         $r->print(&mt('No content changes in imported content in specified time frame').  
                   &endContentScreen());  
         return;  
     }  
     $r->print(      $r->print(
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$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>'.      "<th>$lt{'mr'}</th>".
         "<th>$lt{'mr'}</th>".      "<th>$lt{'ve'}</th>".
         "<th>$lt{'ve'}</th>".      "<th>$lt{'vu'}</th>".
         "<th>$lt{'vu'}</th>".      '<th colspan="'.$num_ver_col.'">'.&mt('History').'</th>'.
         '<th>'.&mt('History').'</th>'.      '</b>');
         &Apache::loncommon::end_data_table_header_row()      foreach my $key (sort(keys(%changes))) {
     );   if ($changes{$key}>$starttime) {
     foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) {      my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
         foreach my $key (sort(@{$changedbytime{$chg}})) {      my $currentversion=&Apache::lonnet::getversion($key);
             my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);      if ($currentversion<0) {
             my $currentversion=&Apache::lonnet::getversion($key);  
             if ($currentversion<0) {  
                 $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';                  $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';
             }      }
             my $linkurl=&Apache::lonnet::clutter($key);      my $linkurl=&Apache::lonnet::clutter($key);
             $r->print(          $r->print(
                 &Apache::loncommon::start_data_table_row().              &Apache::loncommon::end_data_table_header_row().
                 '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.              &Apache::loncommon::start_data_table_row().
                 '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.              '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br>'.
                 '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.              '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.
                 &Apache::lonlocal::locallocaltime($chg).')</span></td>'.              '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br>('.
                 '<td align="right">'              &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'.
             );              '<td align="right">');
             # Used in course  # Used in course
             my $usedversion=$hash{'version_'.$linkurl};      my $usedversion=$hash{'version_'.$linkurl};
             if (($usedversion) && ($usedversion ne 'mostrecent')) {      if (($usedversion) && ($usedversion ne 'mostrecent')) {
                 if ($usedversion != $currentversion) {                  if($usedversion != $currentversion){
                     $r->print('<span class="LC_warning">'.$usedversion.'</span>');                      $r->print('<span class="LC_warning">'.$usedversion.'</span>');
                 } else {                  }else{
                     $r->print($usedversion);                      $r->print($usedversion);
                 }                  }
       } else {
    $r->print($currentversion);
       }
       $r->print('</td><td title="'.$lt{'vu'}.'">');
   # Set version
       $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
         'set_version_'.$linkurl,
         {'select_form_order' =>
          ['',1..$currentversion,'mostrecent'],
          '' => '',
          'mostrecent' => &mt('most recent'),
          map {$_,$_} (1..$currentversion)}));
       my $lastold=1;
       for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
    my $url=$root.'.'.$prevvers.'.'.$extension;
    if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
       $starttime) {
       $lastold=$prevvers;
    }
       }
               #
               # Code to figure out how many version entries should go in
               # each of the four columns
               my $entries_per_col = 0;
               my $num_entries = ($currentversion-$lastold);
               if ($num_entries % $num_ver_col == 0) {
                   $entries_per_col = $num_entries/$num_ver_col;
             } else {              } else {
                 $r->print($currentversion);                  $entries_per_col = $num_entries/$num_ver_col + 1;
             }              }
             $r->print('</td><td title="'.$lt{'vu'}.'">');              my $entries_count = 0;
             # Set version  
             $r->print(&Apache::loncommon::select_form(  
                       $setversions{$linkurl},  
                       'set_version_'.$linkurl,  
                       {'select_form_order' => ['',1..$currentversion,'mostrecent'],  
                        '' => '',  
                        'mostrecent' => &mt('most recent'),  
                        map {$_,$_} (1..$currentversion)},'',$readonly));  
             my $lastold=1;  
             for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {  
                 my $url=$root.'.'.$prevvers.'.'.$extension;  
                 if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {  
                     $lastold=$prevvers;  
                 }  
             }  
             $r->print('</td>');  
             # List all available versions  
             $r->print('<td valign="top"><span class="LC_fontsize_medium">');              $r->print('<td valign="top"><span class="LC_fontsize_medium">');
               my $cols_output = 1;
             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {              for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
                 my $url=$root.'.'.$prevvers.'.'.$extension;   my $url=$root.'.'.$prevvers.'.'.$extension;
                 $r->print(   $r->print('<span class="LC_nobreak"><a href="'.&Apache::lonnet::clutter($url).
                     '<span class="LC_nobreak">'    '">'.&mt('Version').' '.$prevvers.'</a> ('.
                    .'<a href="'.&Apache::lonnet::clutter($url).'">'    &Apache::lonlocal::locallocaltime(
                    .&mt('Version [_1]',$prevvers).'</a>'                                  &Apache::lonnet::metadata($url,
                    .' ('.&Apache::lonlocal::locallocaltime(                                                            'lastrevisiondate')
                          &Apache::lonnet::metadata($url,'lastrevisiondate'))                                                              ).
                    .')');    ')');
                 if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {   if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
                     $r->print(                      $r->print(' <a href="/adm/diff?filename='.
                         ' <a href="/adm/diff?filename='.        &Apache::lonnet::clutter($root.'.'.$extension).
                         &Apache::lonnet::clutter($root.'.'.$extension).        '&versionone='.$prevvers.
                         &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').        '" target="diffs">'.&mt('Diffs').'</a>');
                         '" target="diffs">'.&mt('Diffs').'</a>');   }
    $r->print('</span><br />');
                   if (++$entries_count % $entries_per_col == 0) {
                       $r->print('</span></td>');
                       if ($cols_output != $num_ver_col) {
                           $r->print('<td valign="top"><span class="LC_fontsize_medium">');
                           $cols_output++;
                       }
                 }                  }
                 $r->print('</span><br />');      }
               while($cols_output++ < $num_ver_col) {
                   $r->print('</span></td><td>');
             }              }
             $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());   }
         }  
     }      }
     $r->print(      $r->print('</td>'.&Apache::loncommon::end_data_table_row().
         &Apache::loncommon::end_data_table().              &Apache::loncommon::end_data_table().
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$disabled.' />'.              '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />');
         '</form>'  
     );  
   
     &untiehash();      &untiehash();
     $r->print(&endContentScreen());  
     return;  
 }  }
   
 sub mark_hash_old {  sub mark_hash_old {
Line 4840  sub changewarning { Line 2639  sub changewarning {
     my $pathvar='folderpath';      my $pathvar='folderpath';
     my $path=&escape($env{'form.folderpath'});      my $path=&escape($env{'form.folderpath'});
     if (!defined($url)) {      if (!defined($url)) {
    if (defined($env{'form.pagepath'})) {
       $pathvar='pagepath';
       $path=&escape($env{'form.pagepath'});
       $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
    }
  $url='/adm/coursedocs?'.$pathvar.'='.$path;   $url='/adm/coursedocs?'.$pathvar.'='.$path;
     }      }
     my $course_type = &Apache::loncommon::course_type();      my $course_type = &Apache::loncommon::course_type();
Line 4863  $help{'Caching'}.'</p></form>'."\n\n"); Line 2667  $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 4880  sub init_breadcrumbs { Line 2684  sub init_breadcrumbs {
 sub create_list_elements {  sub create_list_elements {
    my @formarr = @_;     my @formarr = @_;
    my $list = '';     my $list = '';
    foreach my $button (@formarr){     for my $button (@formarr){
         foreach my $picture (keys(%{$button})) {          for my $picture(keys %$button) {
             $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text', id => ''});              $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'});
         }          }
    }     }
    return $list;     return $list;
Line 4905  sub startContentScreen { Line 2709  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 4928  sub endContentScreen { Line 2733  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 4948  sub handler { Line 2753  sub handler {
 #  #
 # --------------------------------------------- Initialize help topics for this  # --------------------------------------------- Initialize help topics for this
     foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',      foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
                'Adding_External_Resource','Adding_External_Tool',                 'Adding_External_Resource','Navigate_Content',
                        'Navigate_Content','Adding_Folders','Docs_Overview',                 'Adding_Folders','Docs_Overview', 'Load_Map',
                'Load_Map','Supplemental','Score_Upload_Form',                 'Supplemental','Score_Upload_Form','Adding_Pages',
                        'Adding_Pages','Importing_LON-CAPA_Resource',                 'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
                        'Importing_IMS_Course','Uploading_From_Harddrive',                 'Check_Resource_Versions','Verify_Content') {
                        'Course_Roster','Web_Page','Dropbox','Simple_Problem') {  
  $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);   $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }      }
     # Composite help files      # Composite help files
Line 4961  sub handler { Line 2765  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 4997  sub handler { Line 2799  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 5014  sub handler { Line 2816  sub handler {
 # Get the parameters that may be needed  # Get the parameters that may be needed
 #  #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['folderpath',                                              ['folderpath','pagepath',
                                              'forcesupplement','forcestandard',                                               'pagesymb','forcesupplement','forcestandard',
                                              'tools','symb','command','supppath']);                                               'tools','symb','command']);
   
 # standard=1: this is a "new-style" course with an uploaded map as top level  # standard=1: this is a "new-style" course with an uploaded map as top level
 # standard=2: this is a "old-style" course, and there is nothing we can do  # standard=2: this is a "old-style" course, and there is nothing we can do
Line 5028  sub handler { Line 2830  sub handler {
 # supplementalflag=0: show standard documents  # supplementalflag=0: show standard documents
 # toolsflag=1: show utilities  # toolsflag=1: show utilities
   
     my $unesc_folderpath = &unescape($env{'form.folderpath'});  
     my $supplementalflag=($unesc_folderpath=~/^supplemental/);      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
     if (($unesc_folderpath=~/^default/) || ($unesc_folderpath eq "")) {      if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) {
        $supplementalflag=0;         $supplementalflag=0;
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
Line 5045  sub handler { Line 2847  sub handler {
     my $addentries = {};      my $addentries = {};
     my $container;      my $container;
     my $containertag;      my $containertag;
     my $pathitem;      my $uploadtag;
     my %ltitools;  
     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'}=             ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'});
                &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap);             if ($resurl=~/\.(sequence|page)$/) {
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>                 $mapurl=$resurl;
                $env{'form.command'}.'_'.$env{'form.symb'}});             } elsif ($resurl eq 'adm/navmaps') {
                  $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'};
              }
              my $mapresobj;
              my $navmap = Apache::lonnavmaps::navmap->new();
              if (ref($navmap)) {
                  $mapresobj = $navmap->getResourceByUrl($mapurl);
              }
              $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1};
              my $type=$2;
              my $path;
              if (ref($mapresobj)) {
                  my $pcslist = $mapresobj->map_hierarchy();
                  if ($pcslist ne '') {
                      foreach my $pc (split(/,/,$pcslist)) {
                          next if ($pc <= 1);
                          my $res = $navmap->getByMapPc($pc);
                          if (ref($res)) {
                              my $thisurl = $res->src();
                              $thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; 
                              my $thistitle = $res->title();
                              $path .= '&'.
                                       &Apache::lonhtmlcommon::entity_encode($thisurl).'&'.
                                       &Apache::lonhtmlcommon::entity_encode($thistitle).
                                       ':'.$res->randompick().
                                       ':'.$res->randomout().
                                       ':'.$res->encrypted().
                                       ':'.$res->randomorder();
                          }
                      }
                  }
                  $path .= '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
                       &Apache::lonhtmlcommon::entity_encode($mapresobj->title()).
                       ':'.$mapresobj->randompick().
                       ':'.$mapresobj->randomout().
                       ':'.$mapresobj->encrypted().
                       ':'.$mapresobj->randomorder();
              } else {
                  my $maptitle = &Apache::lonnet::gettitle($mapurl);
                  $path = '&default&...::::'.
                      '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
                      &Apache::lonhtmlcommon::entity_encode($maptitle).'::::';
              }
              $path = 'default&'.
                      &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
                      $path;
              if ($type eq 'sequence') {
                  $env{'form.folderpath'}=$path;
                  $env{'form.pagepath'}='';
              } else {
                  $env{'form.pagepath'}=$path;
                  $env{'form.folderpath'}='';
              }
        } elsif ($env{'form.supppath'} ne '') {         } elsif ($env{'form.supppath'} ne '') {
            $env{'form.folderpath'}=$env{'form.supppath'};             $env{'form.folderpath'}=$env{'form.supppath'};
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>  
                $env{'form.command'}.'_'.$env{'form.supppath'}});  
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
        $env{'form.folderpath'} = &default_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');
           $env{'form.pagepath'}='';
    } 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') {          $env{'form.pagepath'}='';
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'});  
    } elsif ($env{'form.command'} eq 'home') {  
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/menu'});  
    }     }
   
   
 # Where do we store these for when we come back?  # Where do we store these for when we come back?
     my $stored_folderpath='docs_folderpath';      my $stored_folderpath='docs_folderpath';
     if ($supplementalflag) {      if ($supplementalflag) {
        $stored_folderpath='docs_sup_folderpath';         $stored_folderpath='docs_sup_folderpath';
     }      }
   
 # No folderpath, and in edit mode, see if we have something stored  # No folderpath, no pagepath, see if we have something stored
     if ((!$env{'form.folderpath'}) && $allowed) {      if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) {
         &Apache::loncommon::restore_course_settings($stored_folderpath,          &Apache::loncommon::restore_course_settings($stored_folderpath,
                                           {'folderpath' => 'scalar'});                                                {'folderpath' => 'scalar'});
   
         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'});  
         }  
     }      }
         
 # If we are not allowed to make changes, all we can see are supplemental docs  # If we are not allowed to make changes, all we can see are supplemental docs
     if (!$allowed) {      if (!$allowed) {
           $env{'form.pagepath'}='';
         unless ($env{'form.folderpath'} =~ /^supplemental/) {          unless ($env{'form.folderpath'} =~ /^supplemental/) {
             $env{'form.folderpath'} = &supplemental_base();              $env{'form.folderpath'} = &supplemental_base();
         }          }
     }      }
   # If we still not have a folderpath, see if we can resurrect at pagepath
       if (!$env{'form.folderpath'} && $allowed) {
           &Apache::loncommon::restore_course_settings($stored_folderpath,
                                                 {'pagepath' => 'scalar'});
       }
 # Make the zeroth entry in supplemental docs page paths, so we can get to top level  # Make the zeroth entry in supplemental docs page paths, so we can get to top level
     if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {      if ($env{'form.folderpath'} =~ /^supplemental_\d+/) {
         $env{'form.folderpath'} = &supplemental_base()          $env{'form.folderpath'} = &supplemental_base()
                                   .'&'.                                    .'&'.
                                   $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.pagepath'}) || ($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';
        }         }
     }      }
   
 # Store this  # Store this
     unless ($toolsflag) {      unless ($toolsflag) {
         if (($allowed) && ($env{'form.folderpath'} ne '')) {          &Apache::loncommon::store_course_settings($stored_folderpath,
             &Apache::loncommon::store_course_settings($stored_folderpath,                                                    {'pagepath' => 'scalar',
                                                       {'folderpath' => 'scalar'});                                                     'folderpath' => 'scalar'});
         }  
         my $folderpath;  
         if ($env{'form.folderpath'}) {          if ($env{'form.folderpath'}) {
             $folderpath = $env{'form.folderpath'};      my (@folderpath)=split('&',$env{'form.folderpath'});
     my (@folders)=split('&',$env{'form.folderpath'});      $env{'form.foldername'}=&unescape(pop(@folderpath));
     $env{'form.foldername'}=&unescape(pop(@folders));      $env{'form.folder'}=pop(@folderpath);
             if ($env{'form.foldername'} =~ /\:1$/) {              $container='sequence';
                 $container = 'page';          }
             } else {          if ($env{'form.pagepath'}) {
                 $container = 'sequence';              my (@pagepath)=split('&',$env{'form.pagepath'});
             }              $env{'form.pagename'}=&unescape(pop(@pagepath));
     $env{'form.folder'}=pop(@folders);              $env{'form.folder'}=pop(@pagepath);
         } else {              $container='page';
             if ($env{'form.folder'} eq '' ||              $containertag = '<input type="hidden" name="pagepath" value="" />'.
                 $env{'form.folder'} eq 'supplemental') {                      '<input type="hidden" name="pagesymb" value="" />';
                 if ($env{'form.folder'} eq 'supplemental') {              $uploadtag = 
                     $folderpath=&supplemental_base();                  '<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" />'.
                 } elsif (!$hiddentop) {          '<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" />'.
                   '<input type="hidden" name="folderpath" value="" />';
           } else {
               my $folderpath=$env{'form.folderpath'};
               if (!$folderpath) {
                   if ($env{'form.folder'} eq '' ||
                       $env{'form.folder'} eq 'supplemental') {
                     $folderpath='default&'.                      $folderpath='default&'.
                                  &escape(&mt('Main Content').':::::');                          &escape(&mt('Main '.$crstype.' Documents'));
                 }                  }
             }              }
               $containertag = '<input type="hidden" name="folderpath" value="" />';
               $uploadtag = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';
         }          }
         $containertag = '<input type="hidden" name="folderpath" value="" />';  
         $pathitem = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($folderpath,'<>&"').'" />';  
         if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {          if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
            $showdoc='/'.$1;             $showdoc='/'.$1;
         }          }
         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 5211  sub handler { Line 3028  sub handler {
                 $script .= &dump_switchserver_js(@hosts);                   $script .= &dump_switchserver_js(@hosts); 
             }              }
         } else {          } else {
             my $tid = 1;  
             my @tabids;              my @tabids;
             if ($supplementalflag) {              if ($supplementalflag) {
                 @tabids = ('002','ee2','ff2');                  @tabids = ('002','ee2','ff2');
                 $tid = 2;  
             } else {              } else {
                 @tabids = ('aa1','bb1','cc1','ff1');                  @tabids = ('aa1','bb1','cc1','ff1');
                 unless ($env{'form.folderpath'} =~ /\:1$/) {                  unless ($env{'form.pagepath'}) {
                     unshift(@tabids,'001');                      unshift(@tabids,'001');
                     push(@tabids,('dd1','ee1'));                      push(@tabids,('dd1','ee1'));
                 }                  }
             }              }
             my $tabidstr = join("','",@tabids);              my $tabidstr = join("','",@tabids);
             %ltitools = &Apache::lonnet::get_domain_ltitools($coursedom);      $script .= &editing_js($udom,$uname,$supplementalflag).
             my $posslti = keys(%ltitools);  
     $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,  
                                    $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(\%ltitools);  
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
                           };                            };
         }          }
         $script .= &paste_popup_js();   
         my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.  
                              &mt('Switch server?');  
           
   
     }      }
 # -------------------------------------------------------------------- Body tag  # -------------------------------------------------------------------- Body tag
     $script = '<script type="text/javascript">'."\n"      $script = '<script type="text/javascript">'."\n"
Line 5251  sub handler { Line 3057  sub handler {
   
     # Breadcrumbs      # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
       unless ($showdoc) {
     if ($showdoc) {  
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,  
                                                 {'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({          &Apache::lonhtmlcommon::add_breadcrumb({
             href=>"/adm/coursedocs",text=>$breadtext});              href=>"/adm/coursedocs",text=>"$crstype Contents"});
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script)  
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')  
                  .&Apache::lonhtmlcommon::breadcrumbs(  
                      $breadtitle)  
                  );  
     } elsif ($r->uri eq '/adm/supplemental') {  
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);  
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,  
                                                 {'bread_crumbs' => $brcrum,}));  
     } 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({  
             href=>"/adm/coursedocs",text=>$breadtext});  
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,          $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
                                                  {'add_entries'    => $addentries}                                                   {'force_register' => $showdoc,
                                                 )                                                    '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')
         );          );
       } else {
           $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
                                                   {'force_register' => $showdoc,}));
     }      }
   
   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);
           undef($navmap);  
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
Line 5354  sub handler { Line 3130  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',                  'upld' => 'Import Document',
                 'upld' => 'Upload Content',  
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
  'lnks' => 'Import from Stored Links',   'lnks' => 'Import from Stored Links',
                 'impm' => 'Import from Assembled Map',  
                 'extr' => 'External Resource',  
                 'extt' => 'External Tool',  
                 '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',  
                 'se'   => 'Select',  
                 'file' =>  'File',                  'file' =>  'File',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment',                  'comment' => 'Comment',
                 'parse' => 'Upload embedded images/multimedia files if HTML file',                  'parse' => 'Upload embedded images/multimedia files if HTML file',
                 'bb5'      => 'Blackboard 5',   'nd' => 'Upload Document',
                 'bb6'      => 'Blackboard 6',   'pm' => 'Published Map',
                 'angel5'   => 'ANGEL 5.5',   'sd' => 'Special Document',
                 'webctce4' => 'WebCT 4 Campus Edition',   'mo' => 'More Options',
                 '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 5441  FIUP Line 3182  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'};  
         if ($imsfolder eq '') {  
             $imsfolder = 'default';    
         }  
         my $imspform=(<<IMSFORM);  
         <a class="LC_menubuttons_link" href="javascript:toggleUpload('ims');">  
         $lt{'imsf'}</a> $help{'Importing_IMS_Course'}  
         <form name="uploadims" action="/adm/imsimportdocs" method="post" enctype="multipart/form-data" target="IMSimport">  
         <fieldset id="uploadimsform" style="display: none;">  
         <legend>$lt{'imsf'}</legend>  
         $fileupload  
         <br />  
         <p>  
         $lt{'cms'}:&nbsp;   
         <select name="source" $disabled>  
         <option value="-1" selected="selected">$lt{'se'}</option>  
         <option value="bb5">$lt{'bb5'}</option>  
         <option value="bb6">$lt{'bb6'}</option>  
         <option value="angel5">$lt{'angel5'}</option>  
         <option value="webctce4">$lt{'webctce4'}</option>  
         </select>  
         <input type="hidden" name="folder" value="$imsfolder" />  
         </p>  
         <input type="hidden" name="phase" value="one" />  
         <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" $disabled />  
         </fieldset>  
         </form>  
 IMSFORM  
   
       my $fileuploada = "<br clear='all' /><input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}";
  my $fileuploadform=(<<FUFORM);   my $fileuploadform=(<<FUFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleUpload('doc');">   <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
         $lt{'upfi'}</a> $help{'Uploading_From_Harddrive'}  
         <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">  
         <fieldset id="uploaddocform" style="display: none;">  
         <legend>$lt{'upfi'}</legend>  
  <input type="hidden" name="active" value="aa" />   <input type="hidden" name="active" value="aa" />
  $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   $uploadtag
  <input type="hidden" name="cmd" value="upload_default" />   <input type="hidden" name="cmd" value="upload_default" />
  <br />   <br />
  <span class="LC_nobreak" style="float:left">   <span class="LC_nobreak" style="float:left">
  $checkbox   $checkbox
  </span>   </span>
         <br clear="all" />  
         <input type="submit" value="$lt{'upld'}" $disabled />  
         </fieldset>  
         </form>  
 FUFORM  FUFORM
       $fileuploadform .= $fileuploada.'</form>';
   
         my $mapimportjs;   my $simpleeditdefaultform=(<<SEDFFORM);
         if ($canedit) {   <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
             $mapimportjs = "javascript:openbrowser('mapimportform','importmap','sequence,page','');";  
         } else {  
             $mapimportjs = "javascript:alert('".&js_escape($lt{'er'})."');";  
         }  
  my $importpubform=(<<SEDFFORM);  
         <a class="LC_menubuttons_link" href="javascript:toggleMap('map');">  
         $lt{'impm'}</a>$help{'Load_Map'}  
  <form action="/adm/coursedocs" method="post" name="mapimportform">  
         <fieldset id="importmapform" style="display: none;">  
         <legend>$lt{'impm'}</legend>  
  <input type="hidden" name="active" value="bb" />   <input type="hidden" name="active" value="bb" />
         $lt{'copm'}<br />  
         <span class="LC_nobreak">  
         <input type="text" name="importmap" size="40" value=""   
         onfocus="this.blur();$mapimportjs" $disabled />  
         &nbsp;<a href="$mapimportjs">$lt{'selm'}</a></span><br />  
         <input type="submit" name="loadmap" value="$lt{'load'}" $disabled />  
         </fieldset>  
         </form>  
   
 SEDFFORM  SEDFFORM
    my @simpleeditdefaultforma = ( 
         my $fromstoredjs;   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },
         if ($canedit) {  
             $fromstoredjs = 'open_StoredLinks_Import()';  
         } else {  
             $fromstoredjs = "alert('".&js_escape($lt{'er'})."')";  
         }  
   
  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/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 }  
  );   );
  $importpubform = &create_form_ul(&create_list_elements(@importpubforma));   $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma));
         my $extresourcesform =   $simpleeditdefaultform .=(<<SEDFFORM);
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,   <hr id="bb_hrule" style="width:0px;text-align:left;margin-left:0" />
                                                  $help{'Adding_External_Resource'},   $lt{'copm'}<br />
                                                  undef,undef,$disabled);   <input type="text" size="40" name="importmap" /><br />
         my $exttoolform =   <span class="LC_nobreak" style="float:left"><input type="button"
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,   onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
                                                  $help{'Adding_External_Tool'},undef,   value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" />
                                                  undef,'tool',$coursedom,$coursenum,   $help{'Load_Map'}</span>
                                                  \%ltitools,$disabled);   </form>
   SEDFFORM
   
         my $extresourcesform=(<<ERFORM);
         <form action="/adm/coursedocs" method="post" name="newext">
         $uploadtag
         <input type="hidden" name="importdetail" value="" />
         <a class="LC_menubuttons_link" href="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'}
         </form>
   ERFORM
   
   
     if ($allowed) {      if ($allowed) {
         my $folder = $env{'form.folder'};   &update_paste_buffer($coursenum,$coursedom);
         if ($folder eq '') {  
             $folder='default';  
         }  
         if ($canedit) {  
     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 5564  SEDFFORM Line 3245  SEDFFORM
  </form>   </form>
   
 HIDDENFORM  HIDDENFORM
         $r->print(&makesimpleeditform($pathitem)."\n".          $r->print(&makesimpleeditform($uploadtag)."\n".
                   &makedocslogform($pathitem."\n".                    &makedocslogform($uploadtag."\n".
                                    '<input type="hidden" name="folder" value="'.                                     '<input type="hidden" name="folder" value="'.
                                    $env{'form.folder'}.'" />'."\n"));                                     $env{'form.folder'}.'" />'."\n"));
     }      }
   
 # Generate the tabs  # Generate the tabs
     my ($mode,$needs_end);      my $mode;
     if (($supplementalflag) && (!$allowed)) {      if (($supplementalflag) && (!$allowed)) {
         my @folders = split('&',$env{'form.folderpath'});          &Apache::lonnavdisplay::startContentScreen($r,'supplemental');
         unless (@folders > 2) {  
             &Apache::lonnavdisplay::startContentScreen($r,'supplemental');  
             $needs_end = 1;  
         }  
     } else {      } else {
         $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs')));          $r->print(&startContentScreen(($supplementalflag?'suppdocs':'docs')));
         $needs_end = 1;  
     }      }
   
 #  #
Line 5589  HIDDENFORM Line 3265  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="'.             $uploadtag = '<input type="hidden" name="folderpath" value="'.
        &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';         &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }         }
        my $postexec='';         my $postexec='';
Line 5607  HIDDENFORM Line 3283  HIDDENFORM
        } else {         } else {
            #$postexec='self.close();';             #$postexec='self.close();';
        }         }
        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.sequence';         my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_new.page';                       '.sequence';
          my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                        '.page';
    my $container='sequence';
    if ($env{'form.pagepath'}) {
       $container='page';
    }
  my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;   my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
   
    my $imspform=(<<IMSPFORM);
    <form action="/adm/imsimportdocs" method="post" name="ims">
    <input type="hidden" name="folder" value="$folder" />
    <a class="LC_menubuttons_link" href="javascript:makeims();">$lt{'imsf'}</a>
    </form>
   IMSPFORM
   
  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   $uploadtag
  <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   $uploadtag
  <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>
  $help{'Simple Page'}   $help{'Simple Page'}
Line 5634  NSPFORM Line 3323  NSPFORM
  my $newsmpproblemform=(<<NSPROBFORM);   my $newsmpproblemform=(<<NSPROBFORM);
  <form action="/adm/coursedocs" method="post" name="newsmpproblem">   <form action="/adm/coursedocs" method="post" name="newsmpproblem">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $uploadtag
  <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 5645  NSPROBFORM Line 3334  NSPROBFORM
  my $newdropboxform=(<<NDBFORM);   my $newdropboxform=(<<NDBFORM);
  <form action="/adm/coursedocs" method="post" name="newdropbox">   <form action="/adm/coursedocs" method="post" name="newdropbox">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $uploadtag
  <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
   
  my $newexuploadform=(<<NEXUFORM);   my $newexuploadform=(<<NEXUFORM);
  <form action="/adm/coursedocs" method="post" name="newexamupload">   <form action="/adm/coursedocs" method="post" name="newexamupload">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $uploadtag
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makeexamupload();">$lt{'scuf'}</a>   <a class="LC_menubuttons_link" href="javascript:makeexamupload();">$lt{'scuf'}</a>
  $help{'Score_Upload_Form'}   $help{'Score_Upload_Form'}
Line 5664  NEXUFORM Line 3352  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   $uploadtag
  <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>
  $help{'Bulletin Board'}   $help{'Bulletin Board'}
Line 5674  NBFORM Line 3362  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   $uploadtag
  <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   $uploadtag
  <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   $uploadtag
  <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 5739  my $newfolderb; Line 3407  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 5748  NPFORM Line 3416  NPFORM
   
  $newfolderform=(<<NFFORM);   $newfolderform=(<<NFFORM);
  <form action="/adm/coursedocs" method="post" name="newfolder">   <form action="/adm/coursedocs" method="post" name="newfolder">
  $pathitem   <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="" />   <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   $uploadtag
  <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 5769  NSYLFORM Line 3437  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   $uploadtag
  <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));
   
   
         my @importdoc = (          my @importdoc = (
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform}          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'newext\');" />'=>$extresourcesform},
         );          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:makeims();" />'=>$imspform},);
         if (keys(%ltitools)) {          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc)) . '<hr id="cc_hrule" style="width:0px;text-align:left;margin-left:0" />' . $fileuploadform;
             push(@importdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleUpload(\'tool\');" />'=>$exttoolform},  
         );  
         }  
         unless ($container eq 'page') {  
             push(@importdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform}  
             );  
         }  
         push(@importdoc,  
             {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}  
         );  
         $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));  
   
         @gradingforma=(          @gradingforma=(
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
Line 5817  NGFFORM Line 3471  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',$simpleeditdefaultform],
                 'cc' => ['Grading',$gradingform],                  'cc' => ['Grading Resources',$gradingform],
                 );                  );
 unless ($container eq 'page') {  unless ($env{'form.pagepath'}) {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
     $orderhash{'dd'} = ['Collaboration',$communityform];      $orderhash{'dd'} = ['Collaboration',$communityform];
     $orderhash{'ee'} = ['Other',$specialdocumentsform];      $orderhash{'ee'} = ['Special Documents',$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);
                               \%ltitools,$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>');
           }            }
           if ($hadchanges) {            if ($hadchanges) {
              unless (&is_hash_old()) {               &mark_hash_old();
                  &mark_hash_old();  
              }  
           }            }
   
           &changewarning($r,'');            &changewarning($r,'');
         }          }
     }      }
Line 5863  unless ($container eq 'page') { Line 3514  unless ($container eq 'page') {
        } elsif ($allowed) {         } elsif ($allowed) {
   $env{'form.folderpath'} = $savefolderpath;    $env{'form.folderpath'} = $savefolderpath;
        }         }
        $pathitem = '<input type="hidden" name="folderpath" value="'.         $env{'form.pagepath'} = '';
                     &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';  
        if ($allowed) {         if ($allowed) {
    my $folderseq=     my $folderseq=
        '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_new.sequence';         '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
          '.sequence';
   
      my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
   
    my $supupdocformbtn = "<input type='submit' value='".$lt{'upld'}."' />$help{'Uploading_From_Harddrive'}";
  my $supupdocform=(<<SUPDOCFORM);   my $supupdocform=(<<SUPDOCFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleUpload('suppdoc');">  
         $lt{'upfi'}</a> $help{'Uploading_From_Harddrive'}  
  <form action="/adm/coursedocs" method="post" name="supuploaddocument" enctype="multipart/form-data">   <form action="/adm/coursedocs" method="post" name="supuploaddocument" enctype="multipart/form-data">
         <fieldset id="uploadsuppdocform" style="display: none;">  
         <legend>$lt{'upfi'}</legend>  
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="ee" />
  $fileupload   $fileupload
  <br />   <br />
Line 5886  unless ($container eq 'page') { Line 3536  unless ($container eq 'page') {
  $lt{'comment'}:<br />   $lt{'comment'}:<br />
  <textarea cols="50" rows="4" name="comment"></textarea>   <textarea cols="50" rows="4" name="comment"></textarea>
  <br />   <br />
  $pathitem   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="cmd" value="upload_supplemental" />   <input type="hidden" name="cmd" value="upload_supplemental" />
         <input type='submit' value="$lt{'upld'}" />  
         </form>  
 SUPDOCFORM  SUPDOCFORM
    $supupdocform .=  &create_form_ul(&Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>";
   
  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   <input type="hidden" name="folderpath" value="$path" />
  <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> 
  $help{'Adding_Folders'}   $help{'Adding_Folders'}
  </form>   </form>
 SNFFORM  SNFFORM
   
         my $supextform =  
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,   my $supnewextform=(<<SNEFORM);
                                                  $help{'Adding_External_Resource'},   <form action="/adm/coursedocs" method="post" name="supnewext">
                                                  undef,undef,$disabled);   <input type="hidden" name="active" value="ff" />
    <input type="hidden" name="folderpath" value="$path" />
         my $supexttoolform =   <input type="hidden" name="importdetail" value="" />
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,   <a class="LC_menubuttons_link" href="javascript:makenewext('supnewext');">$lt{'extr'}</a> $help{'Adding_External_Resource'}
                                                  $help{'Adding_External_Tool'},   </form>
                                                  undef,undef,'tool',$coursedom,  SNEFORM
                                                  $coursenum,\%ltitools,$disabled);  
  my $supnewsylform=(<<SNSFORM);   my $supnewsylform=(<<SNSFORM);
  <form action="/adm/coursedocs" method="post" name="supnewsyl">   <form action="/adm/coursedocs" method="post" name="supnewsyl">
  <input type="hidden" name="active" value="ff" />   <input type="hidden" name="active" value="ff" />
         $pathitem   <input type="hidden" name="folderpath" value="$path" />
  <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 5926  SNSFORM Line 3575  SNSFORM
  my $supnewaboutmeform=(<<SNAMFORM);   my $supnewaboutmeform=(<<SNAMFORM);
  <form action="/adm/coursedocs" method="post" name="supnewaboutme">   <form action="/adm/coursedocs" method="post" name="supnewaboutme">
  <input type="hidden" name="active" value="ff" />   <input type="hidden" name="active" value="ff" />
         $pathitem   <input type="hidden" name="folderpath" value="$path" />
  <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:makenewext(\'supnewext\');" />'
             =>$supextform});              =>$supnewextform},
         if (keys(%ltitools)) {  
             push(@supimportdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleUpload(\'supptool\')" />'  
             =>$supexttoolform});  
         }  
         push(@supimportdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'suppdoc\');" />'  
             =>$supupdocform},  
         );          );
   $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr id="ee_hrule" style="width:0px;text-align:left;margin-left:0" />' . $supupdocform;
 $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 Documents',&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);
                                \%ltitools,$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) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                             $supplementalflag,'',$iconpath,$pathitem);                              $supplementalflag,'',$iconpath);
         if ($error) {          if ($error) {
             $r->print('<p><span class="LC_error">'.$error.'</span></p>');              $r->print('<p><span class="LC_error">'.$error.'</span></p>');
         }          }
     }      }
   
     if ($needs_end) {      $r->print(&endContentScreen());
         $r->print(&endContentScreen());  
     }  
   
     if ($allowed) {      if ($allowed) {
  $r->print('   $r->print('
Line 6027  my %suporderhash = ( Line 3629  my %suporderhash = (
   } elsif ($showdoc) {    } elsif ($showdoc) {
 # -------------------------------------------------------- This is showdoc mode  # -------------------------------------------------------- This is showdoc mode
       $r->print("<h1>".&mt('Uploaded Document').' - '.        $r->print("<h1>".&mt('Uploaded Document').' - '.
  &Apache::lonnet::gettitle($r->uri).'</h1><p class="LC_warning">'.   &Apache::lonnet::gettitle($r->uri).'</h1><p>'.
 &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".  &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><table>".
                 &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');                  &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table>');
   }    }
Line 6079  sub decompression_info { Line 3681  sub decompression_info {
     my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};      my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $container='sequence';      my $container='sequence';
     my ($pathitem,$hiddenelem);      my ($pathitem,$hiddenelem);
     my @hiddens = ('newidx','comment','position','folderpath','archiveurl');      my @hiddens = ('newidx','comment','position');
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.pagepath'}) {
         $container='page';          $container='page';
           $pathitem = 'pagepath';
       } else {
           $pathitem = 'folderpath';
     }      }
     unshift(@hiddens,$pathitem);      unshift(@hiddens,$pathitem);
     foreach my $item (@hiddens) {      foreach my $item (@hiddens) {
         if ($env{'form.'.$item}) {          if ($env{'form.'.$item}) {
             $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.              $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
                            &HTML::Entities::encode($env{'form.'.$item},'<>&"').'" />'."\n";                             $env{'form.'.$item}.'" />'."\n";
         }          }
     }      }
     return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,      return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
Line 6144  sub remove_archive { Line 3749  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);
             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 6190  sub remove_archive { Line 3786  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 6210  sub generate_admin_menu { Line 3806  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 6229  sub generate_admin_menu { Line 3825  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 6248  sub generate_admin_menu { Line 3844  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 6263  sub generate_admin_menu { Line 3857  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 6277  sub generate_admin_menu { Line 3870  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('To Overview');
     $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 6318  sub generate_edit_table { Line 3909  sub generate_edit_table {
                $active = 'class="active"';                 $active = 'class="active"';
             }              }
             $form .= '<li style="float:right" '.$active              $form .= '<li style="float:right" '.$active
                   .' onmouseover="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"'
                 .' 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 6328  sub generate_edit_table { Line 3920  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 6377  END Line 3941  END
 }  }
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,$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 6388  sub editing_js { Line 3953  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',  
                                           imscms  => 'You must select which Course Management System was the source of the IMS package',  
                                           invurl  => 'Invalid URL',  
                                           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 $docs_pagepath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.pagepath'},'<>&"');
     my $main_container_page;      my $main_container_page;
     if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {      if ($docs_folderpath eq '') {
         $main_container_page = 1;          if ($docs_pagepath ne '') {
     }              $main_container_page = 1;
     my $backtourl;  
     my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref));  
     my $toplevelsupp = &supplemental_base();  
   
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {  
         my $caller = $1;  
         if ($caller =~ /^supplemental/) {  
             $backtourl = '/adm/supplemental?folderpath='.&escape($caller);  
         } else {  
             my ($map,$id,$res)=&Apache::lonnet::decode_symb($caller);  
             $res = &Apache::lonnet::clutter($res);  
             if (&Apache::lonnet::is_on_map($res)) {  
                 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),'<>&"');  
                 if ($backtourl =~ m{^\Q/uploaded/$coursedom/$coursenum/\Edefault_\d+\.sequence$}) {  
                     $backtourl .= '?navmap=1';  
                 } else {  
                     $backtourl .= '?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';  
     } else {  
         $backtourl = '/adm/navmaps';  
     }      }
       my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents';
       my $toplevelsupp = &supplemental_base();
   
     my $fieldsets = "'ext','doc'";      my $backtourl = '/adm/navmaps';
     if ($posslti) {  
         $fieldsets .= ",'tool'";  
     }  
     unless ($main_container_page) {  
         $fieldsets .=",'ims'";  
     }  
     if ($supplementalflag) {      if ($supplementalflag) {
         $fieldsets = "'suppext','suppdoc'";          $backtourl = '/adm/supplemental';
         if ($posslti) {  
             $fieldsets .= ",'supptool'";  
         }  
     }      }
   
     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 6498  function makenewfolder(targetform,folder Line 3995  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();
     }      }
 }  }
   
   function makenewext(targetname) {
       this.document.forms.extimport.useform.value=targetname;
       this.document.forms.extimport.title.value='';
       this.document.forms.extimport.url.value='';
       this.document.forms.extimport.residx.value='';
       window.open('/adm/rat/extpickframe.html');
   }
   
   function edittext(targetname,residx,title,url) {
       this.document.forms.extimport.useform.value=targetname;
       this.document.forms.extimport.residx.value=residx;
       this.document.forms.extimport.url.value=url;
       this.document.forms.extimport.title.value=title;
       window.open('/adm/rat/extpickframe.html');
   }
   
 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 6515  function makeexamupload() { Line 4028  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 6548  function makesmpproblem() { Line 4046  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 6557  function makedropbox() { Line 4055  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  function makeims() {
     } else {  var caller = document.forms.ims.folder.value;
         $jsmakefunctions = <<ENDNEWSCRIPT;  var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
   newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
 function makenewfolder() {  newWindow.location.href = newlocation;
     alert("$js_lt{'edri'}");  
 }  }
   
 function makenewpage() {  function finishpick() {
     alert("$js_lt{'edri'}");  var title=this.document.forms.extimport.title.value;
   var url=this.document.forms.extimport.url.value;
   var form=this.document.forms.extimport.useform.value;
   var residx=this.document.forms.extimport.residx.value;
   eval('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+'='+residx+'";this.document.forms.'+form+'.submit();');
 }  }
   
 function makeexamupload() {  function changename(folderpath,index,oldtitle,container,pagesymb) {
     alert("$js_lt{'edri'}");  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;
   if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
 }  }
   if (container == 'page') {
 function makesmppage() {      this.document.forms.renameform.pagepath.value=folderpath;
     alert("$js_lt{'edri'}");      this.document.forms.renameform.pagesymb.value=pagesymb;
 }  }
   this.document.forms.renameform.submit();
 function makewebpage(type) {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function makesmpproblem() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function makedropbox() {  function removeres(folderpath,index,oldtitle,container,pagesymb,skip_confirm) {
     alert("$js_lt{'edri'}");  if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
   this.document.forms.renameform.markcopy.value=-1;
   this.document.forms.renameform.cmd.value='del_'+index;
   if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
 }  }
   if (container == 'page') {
 function makebulboard() {      this.document.forms.renameform.pagepath.value=folderpath;
     alert("$js_lt{'edri'}");      this.document.forms.renameform.pagesymb.value=pagesymb;
 }  }
   this.document.forms.renameform.submit();
 function makeabout() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function changename() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function makenew() {  function cutres(folderpath,index,oldtitle,container,pagesymb,folder,skip_confirm) {
     alert("$js_lt{'edri'}");  if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
   this.document.forms.renameform.cmd.value='cut_'+index;
   this.document.forms.renameform.markcopy.value=index;
   this.document.forms.renameform.copyfolder.value=folder+'.'+container;
   if (container == 'sequence') {
       this.document.forms.renameform.folderpath.value=folderpath;
 }  }
   if (container == 'page') {
 function groupimport() {      this.document.forms.renameform.pagepath.value=folderpath;
     alert("$js_lt{'edri'}");      this.document.forms.renameform.pagesymb.value=pagesymb;
 }  }
   this.document.forms.renameform.submit();
 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  function markcopy(folderpath,index,oldtitle,container,pagesymb,folder) {
   this.document.forms.renameform.markcopy.value=index;
     }  this.document.forms.renameform.copyfolder.value=folder+'.'+container;
     return <<ENDSCRIPT;  if (container == 'sequence') {
   this.document.forms.renameform.folderpath.value=folderpath;
 $jsmakefunctions  
   
 function toggleUpload(caller) {  
     var blocks = Array($fieldsets);  
     for (var i=0; i<blocks.length; i++) {  
         var disp = 'none';  
         if (caller == blocks[i]) {  
             var curr = document.getElementById('upload'+caller+'form').style.display;  
             if (curr == 'none') {  
                 disp='block';  
             }  
         }  
         document.getElementById('upload'+blocks[i]+'form').style.display=disp;  
         if ((caller == 'tool') || (caller == 'supptool')) {  
             if (disp == 'block') {  
                 if (document.getElementById('LC_exttoolid')) {  
                     var toolselector = document.getElementById('LC_exttoolid');  
                     var suppflag = 0;  
                     if (caller == 'supptool') {  
                         suppflag = 1;  
                     }  
                     currForm = document.getElementById('new'+caller);  
                     updateExttool(toolselector,currForm,suppflag);  
                 }  
             }  
         }  
     }  
     resize_scrollbox('contentscroll','1','1');  
     return;  
 }  }
   if (container == 'page') {
 function toggleMap(caller) {  this.document.forms.renameform.pagepath.value=folderpath;
     var disp = 'none';  this.document.forms.renameform.pagesymb.value=pagesymb;
     if (document.getElementById('importmapform')) {  
         if (caller == 'map') {  
             var curr = document.getElementById('importmapform').style.display;  
             if (curr == 'none') {  
                 disp='block';  
             }  
         }  
         document.getElementById('importmapform').style.display=disp;  
         resize_scrollbox('contentscroll','1','1');  
     }  
     return;  
 }  }
   this.document.forms.renameform.submit();
 function makeims(imsform) {  
     if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {  
         alert("$js_lt{'imsfile'}");  
         return;  
     }  
     if (imsform.source.selectedIndex == 0) {  
         alert("$js_lt{'imscms'}");  
         return;  
     }  
     newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes");  
     imsform.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 7019  for (i = 0; i < currentLis.length; i++) Line 4207  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 7055  function openTabs(pageId) { Line 4241  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;
         toggleUpload();  
         toggleMap();  
         if (nav == 'mainnav') {          if (nav == 'mainnav') {
             var storedpath = "$docs_folderpath";              var storedpath = "$docs_folderpath";
               if (storedpath == '') {
                   storedpath = "$docs_pagepath";
               }
             var storedpage = "$main_container_page";              var storedpage = "$main_container_page";
             var reg = new RegExp("^supplemental");              var reg = new RegExp("^supplemental");
             if (pageId == 'mainCourseDocuments') {              if (pageId == 'mainCourseDocuments') {
Line 7115  function showPage(current, pageId, nav, Line 4288  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 7470  ENDINJECT Line 4324  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?',          swit => 'Switch server?',
     );          duco => 'Dump content to Authoring Space',
     my %html_js_lt = &Apache::lonlocal::texthash(  
         swit => 'Switch server?',  
         duco => 'Copying Content to Authoring Space',  
         yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',          yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
         chos => 'Choose server',          chos => 'Choose server',
     );      );
     &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 7523  ENDSWJS Line 4371  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 7534  function choose_switchserver_window() { Line 4382  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 7626  Return hash with valid author names Line 4474  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 dbcopy()  
   
 =item uniqueness_check()  
   
 =item contained_map_check()  
   
 =item url_paste_fixups()  
   
 =item apply_fixups()  
   
 =item copy_dependencies()  
   
 =item update_parameter()  =item update_parameter()
   
 =item handle_edit_cmd()  =item handle_edit_cmd()
Line 7670  check on this Line 4500  check on this
   
 Verify Content  Verify Content
   
 =item devalidateversioncache()   =item devalidateversioncache() & checkversions()
   
 =item checkversions()  
   
 Check Versions  Check Versions
   

Removed from v.1.484.2.72.2.2  
changed lines
  Added in v.1.491


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.