Diff for /loncom/interface/londocs.pm between versions 1.542 and 1.583

version 1.542, 2013/04/02 20:33:41 version 1.583, 2014/08/25 00:55:27
Line 41  use Apache::lonclonecourse; Line 41  use Apache::lonclonecourse;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
 use Apache::lonextresedit();  use Apache::lonextresedit();
   use Apache::lontemplate();
   use Apache::lonsimplepage();
 use HTML::Entities;  use HTML::Entities;
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
   use File::MMagic;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Cwd;  use Cwd;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
Line 56  my $hashtied; Line 59  my $hashtied;
 my %alreadyseen=();  my %alreadyseen=();
   
 my $hadchanges;  my $hadchanges;
   my $suppchanges;
   
   
 my %help=();  my %help=();
Line 79  sub storemap { Line 83  sub storemap {
       $map,1,$report);        $map,1,$report);
     if ($errtext) { return ($errtext,2); }      if ($errtext) { return ($errtext,2); }
   
     $hadchanges=1;      if ($map =~ /^default/) {
           $hadchanges=1;
       } else {
           $suppchanges=1;
       }
     return ($errtext,0);      return ($errtext,0);
 }  }
   
Line 136  sub clean { Line 144  sub clean {
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n".      my ($starthash,$js);
               &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n");      unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
           $js = <<"ENDJS";
   <script type="text/javascript">
   // <![CDATA[
   
   function hide_searching() {
       if (document.getElementById('searching')) {
           document.getElementById('searching').style.display = 'none';
       }
       return;
   }
   
   // ]]>
   </script>
   ENDJS
           $starthash = {
                            add_entries => {'onload' => "hide_searching();"},
                        };
       }
       $r->print(&Apache::loncommon::start_page('Copy '.$crstype.' Content to Authoring Space',$js,$starthash)."\n".
                 &Apache::lonhtmlcommon::breadcrumbs('Copy '.$crstype.' Content to Authoring Space')."\n");
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) {      unless ($home) {
Line 156  sub dumpcourse { Line 184  sub dumpcourse {
  $r->print('<h3>'.&mt('Copying Files').'</h3>');   $r->print('<h3>'.&mt('Copying Files').'</h3>');
  my $title=$env{'form.authorfolder'};   my $title=$env{'form.authorfolder'};
  $title=&clean($title);   $title=&clean($title);
  my %replacehash=();          my ($navmap,$errormsg) =
  foreach my $key (keys(%env)) {              &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');
     if ($key=~/^form\.namefor\_(.+)/) {          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
  $replacehash{$1}=$env{$key};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     }          my (%maps,%resources,%titles);
           if (!ref($navmap)) {
               $r->print($errormsg.
                         &endContentScreen());
               return '';
           } else {
               &Apache::loncourserespicker::enumerate_course_contents($navmap,\%maps,\%resources,\%titles,
                                                                      'dumpdocs',$cdom,$cnum);
  }   }
           my @todump = &Apache::loncommon::get_env_multiple('form.archive');
           my (%tocopy,%replacehash,%lookup,%deps,%display,%result,%depresult,%simpleproblems,%simplepages,
               %newcontent,%has_simpleprobs);
           foreach my $item (sort {$a <=> $b} (@todump)) {
               my $name = $env{'form.namefor_'.$item};
               if ($resources{$item}) {
                   my ($map,$id,$res) = &Apache::lonnet::decode_symb($resources{$item});
                   if ($res =~ m{^uploaded/$cdom/$cnum/\E((?:docs|supplemental)/.+)$}) {
                       $tocopy{$1} = $name;
                       $display{$item} = $1;
                       $lookup{$1} = $item; 
                   } elsif ($res eq 'lib/templates/simpleproblem.problem') {
                       $simpleproblems{$item} = {
                                                   symb => $resources{$item},
                                                   name => $name,
                                                };
                       $display{$item} = 'simpleproblem_'.$name;
                       if ($map =~ m{^\Quploaded/$cdom/$cnum/\E(.+)$}) {
                           $has_simpleprobs{$1}{$id} = $item;
                       }
                   } elsif ($res =~ m{^adm/$match_domain/$match_username/(\d+)/smppg}) {
                       my $marker = $1;
                       my $db_name = &Apache::lonsimplepage::get_db_name($res,$marker,$cdom,$cnum);
                       $simplepages{$item} = {
                                               res    => $res,
                                               title  => $titles{$item},
                                               db     => $db_name,
                                               marker => $marker,
                                               symb   => $resources{$item},
                                               name   => $name,
                                             };
                       $display{$item} = '/'.$res;
                   }
               } elsif ($maps{$item}) {
                   if ($maps{$item} =~ m{^\Quploaded/$cdom/$cnum/\E((?:default|supplemental)_\d+\.(?:sequence|page))$}) {
                       $tocopy{$1} = $name;
                       $display{$item} = $1;
                       $lookup{$1} = $item;
                   }
               } else {
                   next;
               }
           }
  my $crs='/uploaded/'.$env{'request.course.id'}.'/';   my $crs='/uploaded/'.$env{'request.course.id'}.'/';
  $crs=~s/\_/\//g;   $crs=~s/\_/\//g;
  foreach my $item (keys(%replacehash)) {          my $mm = new File::MMagic;
     my $newfilename=$title.'/'.$replacehash{$item};          my $prefix = "/uploaded/$cdom/$cnum/";
     $newfilename=~s/\.(\w+)$//;          %replacehash = %tocopy;
     my $ext=$1;          foreach my $item (sort(keys(%simpleproblems))) {
     $newfilename=&clean($newfilename);              my $content = &Apache::imsexport::simpleproblem($simpleproblems{$item}{'symb'});
     $newfilename.='.'.$ext;              $newcontent{$display{$item}} = $content;
     my @dirs=split(/\//,$newfilename);          }
     my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";          my $gateway = Apache::lonhtmlgateway->new('web');
     my $makepath=$path;          foreach my $item (sort(keys(%simplepages))) {
     my $fail=0;              if (ref($simplepages{$item}) eq 'HASH') {
     for (my $i=0;$i<$#dirs;$i++) {                  my $pagetitle = $simplepages{$item}{'title'};
  $makepath.='/'.$dirs[$i];                  my %fields = &Apache::lonnet::dump($simplepages{$item}{'db'},$cdom,$cnum);
  unless (-e $makepath) {                  my %contents;
     unless(mkdir($makepath,0777)) { $fail=1; }                  foreach my $field (keys(%fields)) {
  }                      if ($field =~ /^(?:aaa|bbb|ccc)_(\w+)$/) {
     }                          my $name = $1;
     $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ');                          my $msg = $fields{$field};
     if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {                          if ($name eq 'webreferences') {
  if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {                              if ($msg =~ m{^https?://}) {
     print $fh &Apache::lonclonecourse::rewritefile(                                  $contents{$name} = '<a href="'.$msg.'"><tt>'.$msg.'</tt></a>';
          &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),                              }
      (%replacehash,$crs => '')                          } else {
     );                              $msg = &Encode::decode('utf8',$msg);
  } else {                              $msg = $gateway->process_outgoing_html($msg,1);
     print $fh                              $contents{$name} = $msg;
          &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);                          }
        }                      } elsif ($field eq 'uploaded.photourl') {
  $fh->close();                          my $marker = $simplepages{$item}{marker};
     } else {                          if ($fields{$field} =~ m{^\Q$prefix\E(simplepage/$marker/.+)$}) {
  $fail=1;                              my $filepath = $1;
     }                              my ($relpath,$fname) = ($filepath =~ m{^(.+/)([^/]+)$});
     if ($fail) {                              if ($fname ne '') {
  $r->print('<span class="LC_error">'.&mt('fail').'</span>');                                  $fname=~s/\.(\w+)$//;
     } else {                                  my $ext=$1;
  $r->print('<span class="LC_success">'.&mt('ok').'</span>');                                  $fname = &clean($fname);
     }                                  $fname.='.'.$ext;
  }                                  $contents{image} = '<img src="'.$relpath.$fname.'" alt="Image" />';
                                   $replacehash{$filepath} = $relpath.$fname;
                                   $deps{$item}{$filepath} = 1;
                               }
                           }
                       }
                   }
                   $replacehash{'/'.$simplepages{$item}{'res'}} = $simplepages{$item}{'name'};
                   $lookup{'/'.$simplepages{$item}{'res'}} = $item;
                   my $content = '
   <html>
   <head>
   <title>'.$pagetitle.'</title>
   </head>
   <body bgcolor="#ffffff">';
                   if ($contents{title}) {
                       $content .= "\n".'<h2>'.$contents{title}.'</h2>';
                   }
                   if ($contents{image}) {
                       $content .= "\n".$contents{image};
                   }
                   if ($contents{content}) {
                       $content .= '
   <div class="LC_Box">
   <h4 class="LC_hcell">'.&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 {
         $r->print(&mt('Searching ...').'<br />');          my ($navmap,$errormsg) =
         $r->rflush();              &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');
 # Input form          if (!ref($navmap)) {
         $r->print('<form name="dumpdoc" action="" method="post">'."\n");              $r->print($errormsg);
  unless ($home==1) {          } else {
     $r->print('<div class="LC_left_float">'.              $r->print('<div id="searching">'.&mt('Searching ...').'</div>');
       '<fieldset><legend>'.              $r->rflush();
                       &mt('Select the Authoring Space').              my ($preamble,$formname);
                       '</legend><select name="authorspace">');              $formname = 'dumpdoc';
  }      unless ($home==1) {
  foreach my $key (sort(keys(%outhash))) {          $preamble = '<div class="LC_left_float">'.
     if ($key=~/^home_(.+)$/) {              '<fieldset><legend>'.
                               &mt('Select the Authoring Space').
                               '</legend><select name="authorspace">';
       }
               my @orderspaces = ();
       foreach my $key (sort(keys(%outhash))) {
                   if ($key=~/^home_(.+)$/) {
                       if ($1 eq $env{'user.name'}.':'.$env{'user.domain'}) {
                           unshift(@orderspaces,$1);
                       } else {
                           push(@orderspaces,$1);
                       }
                   } 
               }
               if ($home>1) {
                   $preamble .= '<option value="" selected="selected">'.&mt('Select').'</option>';
               }
               foreach my $user (@orderspaces) {
  if ($home==1) {   if ($home==1) {
     $r->print(      $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />';
   '<input type="hidden" name="authorspace" value="'.$1.'" />');  
  } else {   } else {
     $r->print('<option value="'.$1.'">'.$1.' - '.      $preamble .= '<option value="'.$user.'">'.$user.' - '.
       &Apache::loncommon::plainname(split(/\:/,$1)).'</option>');           &Apache::loncommon::plainname(split(/\:/,$user)).'</option>';
  }          }
     }      }
  }      unless ($home==1) {
  unless ($home==1) {          $preamble .= '</select></fieldset></div>'."\n";
     $r->print('</select></fieldset></div>'."\n");  
  }  
  my $title=$origcrsdata{'description'};  
  $title=~s/[\/\s]+/\_/gs;  
  $title=&clean($title);  
  $r->print('<div class="LC_left_float">'.  
                   '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.  
                   '<input type="text" size="50" name="authorfolder" value="'.  
                   $title.'" />'.  
                   '</fieldset></div><br clear="all" />'."\n");  
  &tiehash();  
  $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>'  
                  .&Apache::loncommon::start_data_table()  
                  .&Apache::loncommon::start_data_table_header_row()  
                  .'<th>'.&mt('Internal Filename').'</th>'  
                  .'<th>'.&mt('Title').'</th>'  
                  .'<th>'.&mt('Save as ...').'</th>'  
                  .&Apache::loncommon::end_data_table_header_row());  
  foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {  
     $r->print(&Apache::loncommon::start_data_table_row()  
                      .'<td>'.$file.'</td>');  
     my ($ext)=($file=~/\.(\w+)$/);  
     my $title=$hash{'title_'.$hash{  
  'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};  
     $r->print('<td>'.($title?$title:'&nbsp;').'</td>');  
     if (!$title) {  
  $title=$file;  
     } else {  
  $title=~s|/|_|g;  
     }      }
     $title=~s/\.(\w+)$//;      my $title=$origcrsdata{'description'};
       $title=~s/[\/\s]+/\_/gs;
     $title=&clean($title);      $title=&clean($title);
     $title.='.'.$ext;      $preamble .= '<div class="LC_left_float">'.
     $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"                           '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                      .&Apache::loncommon::end_data_table_row());                           '<input type="text" size="50" name="authorfolder" value="'.
  }                           $title.'" />'.
  $r->print(&Apache::loncommon::end_data_table());                           '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
  &untiehash();              my %uploadedfiles;
  $r->print(      &tiehash();
   '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>');      foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
           my ($ext)=($file=~/\.(\w+)$/);
   # FIXME Check supplemental here
           my $title=$hash{'title_'.$hash{
                   'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};
           if (!$title) {
       $title=$file;
           } else {
       $title=~s|/|_|g;
           }
           $title=~s/\.(\w+)$//;
           $title=&clean($title);
           $title.='.'.$ext;
   #    $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"
                   $uploadedfiles{$file} = $title;
       }
       &untiehash();
               $r->print(&Apache::loncourserespicker::create_picker($navmap,'dumpdocs',$formname,$crstype,undef,
                                                                    undef,undef,$preamble,$home,\%uploadedfiles));
           }
     }      }
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
 }  }
   
   sub recurse_html {
       my ($mm,$prefix,$currdirpath,$currurlpath,$container,$item,$replacehash,$deps) = @_;
       return unless ((ref($replacehash) eq 'HASH') && (ref($deps) eq 'HASH'));
       my (%allfiles,%codebase);
       if (&Apache::lonnet::extract_embedded_items($currdirpath,\%allfiles,\%codebase) eq 'ok') {
           if (keys(%allfiles)) {
               foreach my $dependency (keys(%allfiles)) {
                   next if (($dependency =~ m{^/(res|adm)/}) || ($dependency =~ m{^https?://}));
                   my ($depurl,$relfile,$newcontainer);
                   if ($dependency =~ m{^/}) {
                       if ($dependency =~ m{^\Q$currurlpath/\E(.+)$}) {
                           $relfile = $1;
                           if ($dependency =~ m{^\Q$prefix\E(.+)$}) {
                               $newcontainer = $1;
                               next if ($replacehash->{$newcontainer});
                           }
                           $depurl = $dependency;
                       } else {
                           next;
                       }
                   } else {
                       $relfile = $dependency;
                       $depurl = $currurlpath;
                       $depurl =~ s{[^/]+$}{};  
                       $depurl .= $dependency;
                       ($newcontainer) = ($depurl =~ m{^\Q$prefix\E(.+)$}); 
                   }
                   next if ($relfile eq '');
                   my $newname = $replacehash->{$container};
                   $newname =~ s{[^/]+$}{};
                   $replacehash->{$newcontainer} = $newname.$relfile;
                   $deps->{$item}{$newcontainer} = 1;
                   my ($newurlpath) = ($depurl =~ m{^(.*)/[^/]+$});  
                   my $depfile = &Apache::lonnet::filelocation('',$depurl);
                   my $type = $mm->checktype_filename($depfile);
                   if ($type eq 'text/html') {
                       &recurse_html($mm,$prefix,$depfile,$newurlpath,$newcontainer,$item,$replacehash,$deps);
                   }
               }
           }
       }
       return;
   }
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
     my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,      my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
Line 340  sub group_import { Line 657  sub group_import {
                 }                  }
                 my $initialtext = &mt('Replace with your own content.');                  my $initialtext = &mt('Replace with your own content.');
                 my $newhtml = <<END;                  my $newhtml = <<END;
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html>
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">  
 <head>  <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
 <title>$name</title>  <title>$name</title>
 </head>  </head>
 <body bgcolor="#ffffff">  <body bgcolor="#ffffff">
Line 404  END Line 719  END
     }      }
     my ($errtext,$fatal) =      my ($errtext,$fatal) =
         &storemap($coursenum, $coursedom, $folder.'.'.$container,1);          &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);      return ($errtext,$fatal,$fixuperrors);
 }  }
   
Line 490  sub docs_change_log { Line 812  sub docs_change_log {
     }      }
     my $folderpath=$env{'form.folderpath'};      my $folderpath=$env{'form.folderpath'};
     if ($folderpath eq '') {      if ($folderpath eq '') {
         $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Content').':::::');          $folderpath = 'default&'.&escape(&mt('Main Content').':::::');
     }      }
     $pathitem = '<input type="hidden" name="folderpath" value="'.      $pathitem = '<input type="hidden" name="folderpath" value="'.
                 &HTML::Entities::encode($folderpath,'<>&"').'" />';                  &HTML::Entities::encode($folderpath,'<>&"').'" />';
Line 702  sub update_paste_buffer { Line 1024  sub update_paste_buffer {
              my $url = $env{'docs.markedcopy_url_'.$suffix};               my $url = $env{'docs.markedcopy_url_'.$suffix};
              if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&               if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
                  ($url ne '')) {                   ($url ne '')) {
                  $pasteurls{$cid.'_'.$url};                   $pasteurls{$cid.'_'.$url} = 1;
              }               }
         }          }
     }      }
Line 766  sub update_paste_buffer { Line 1088  sub update_paste_buffer {
     }      }
     &Apache::lonnet::appenv(\%addtoenv);      &Apache::lonnet::appenv(\%addtoenv);
     delete($env{'form.markcopy'});      delete($env{'form.markcopy'});
       return;
 }  }
   
 sub recurse_uploaded_maps {  sub recurse_uploaded_maps {
Line 803  sub print_paste_buffer { Line 1126  sub print_paste_buffer {
   
     my @currpaste = split(/,/,$env{'docs.markedcopies'});      my @currpaste = split(/,/,$env{'docs.markedcopies'});
     my ($pasteitems,@pasteable);      my ($pasteitems,@pasteable);
       my $clipboardcount = 0;
   
 # Construct identifiers for current contents of user's paste buffer  # Construct identifiers for current contents of user's paste buffer
     foreach my $suffix (@currpaste) {      foreach my $suffix (@currpaste) {
Line 811  sub print_paste_buffer { Line 1135  sub print_paste_buffer {
         my $url = $env{'docs.markedcopy_url_'.$suffix};          my $url = $env{'docs.markedcopy_url_'.$suffix};
         if (($cid =~ /^$match_domain\_$match_courseid$/) &&          if (($cid =~ /^$match_domain\_$match_courseid$/) &&
             ($url ne '')) {              ($url ne '')) {
               $clipboardcount ++;
             my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,              my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent,
                 $canpaste,$nopaste,$othercrs,$areachange);                  $canpaste,$nopaste,$othercrs,$areachange);
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];              my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
Line 904  sub print_paste_buffer { Line 1229  sub print_paste_buffer {
         $pasteitems .= '<div style="padding:0;clear:both;margin:0;border:0"></div>';          $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();">';          $form_start = '<form name="pasteform" action="/adm/coursedocs" method="post" onsubmit="return validateClipboard();">';
         if (@pasteable) {          if (@pasteable) {
             $buttons = '<input type="submit" name="pastemarked" value="'.&mt('Paste selected').'" />'.('&nbsp;'x2);              my $value = &mt('Paste to current folder');
               if ($container eq 'page') {
                   $value = &mt('Paste to current page');
               } 
               $buttons = '<input type="submit" name="pastemarked" value="'.$value.'" />'.('&nbsp;'x2);
         }          }
         $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.          $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Remove from clipboard').'" />'.('&nbsp;'x2);
                     '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';          if ($clipboardcount > 1) {
         $form_end = '</form>';              $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');          $pasteitems = &mt('Clipboard is empty');
     }      }
Line 1062  function validateClipboard() { Line 1399  function validateClipboard() {
     }      }
 }  }
   
   function checkClipboard() {
       if (document.pasteform.pasting.length > 1) {
           for (var i=0; i<document.pasteform.pasting.length; i++) {
               document.pasteform.pasting[i].checked = true;
           } 
       }
       return;
   }
   
   function uncheckClipboard() {
       if (document.pasteform.pasting.length >1) {
           for (var i=0; i<document.pasteform.pasting.length; i++) {
               document.pasteform.pasting[i].checked = false;
           }
       }
       return;
   }
   
 END  END
   
 }  }
Line 1099  sub do_paste_from_buffer { Line 1454  sub do_paste_from_buffer {
     }      }
   
     my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,      my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,
         %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult,          %prefixchg,%srcdom,%srcnum,%marktomove,$save_err,$lockerrors,$allresult);
         %msgs);  
   
     foreach my $suffix (@topaste) {      foreach my $suffix (@topaste) {
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});          my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
Line 1301  sub do_paste_from_buffer { Line 1655  sub do_paste_from_buffer {
                     if ($prefix eq 'smppg') {                      if ($prefix eq 'smppg') {
                         $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;                          $msg = &mt('Paste failed: An error occurred when copying the simple page.').' '.$errtext;
                     } elsif ($prefix eq 'bulletinboard') {                      } elsif ($prefix eq 'bulletinboard') {
                         $msg = &mt('Paste failed: An error occurred when copying the bulletin board.').' '.$errtext;                          $msg = &mt('Paste failed: An error occurred when copying the discussion board.').' '.$errtext;
                     }                      }
                     $results{$suffix} = $result;                      $results{$suffix} = $result;
                     $msgerrs{$suffix} = $msg;                      $msgerrs{$suffix} = $msg;
Line 1551  sub get_newmap_url { Line 1905  sub get_newmap_url {
 sub dbcopy {  sub dbcopy {
     my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;      my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_;
     my ($url,$result,$errtext);      my ($url,$result,$errtext);
     my $url = $dbref->{'src'};      $url = $dbref->{'src'};
     if (ref($dbref) eq 'HASH') {      if (ref($dbref) eq 'HASH') {
         if ($url =~ m{/(smppg|bulletinboard)$}) {          if ($url =~ m{/(smppg|bulletinboard)$}) {
             my $prefix = $1;              my $prefix = $1;
Line 1576  sub dbcopy { Line 1930  sub dbcopy {
                     if ($prefix eq 'smppg') {                      if ($prefix eq 'smppg') {
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);                          $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);
                     } else {                      } else {
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a bulletin board [_1].',$url);                          $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a discussion board [_1].',$url);
                     }                      }
                     if ($error) {                      if ($error) {
                         $errtext .= '<br />'.$error;                          $errtext .= '<br />'.$error;
Line 1612  sub dbcopy { Line 1966  sub dbcopy {
                     }                      }
                 }                  }
                 if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {                  if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
                     $lockerrorsref->{$prefix} =                       $lockerrorsref->{$prefix} =
                         '<div class="LC_error">'.                          '<div class="LC_error">'.
                         &mt('There was a problem removing a lockfile.');                          &mt('There was a problem removing a lockfile.');
                     if ($prefix eq 'smppg') {                      if ($prefix eq 'smppg') {
                         $lockerrorsref->{$prefix} .=                           $lockerrorsref->{$prefix} .=
                             &mt('This will prevent creation of additional simple pages in this course.');                              ' '.&mt('This will prevent creation of additional simple pages in this course.');
                     } else {                      } else {
                         $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional bulletin boards in this course.');                          $lockerrorsref->{$prefix} .= ' '.&mt('This will prevent creation of additional discussion boards in this course.');
                     }                      }
                     $lockerrorsref->{$prefix} .= &mt('Please contact the domain coordinator for your LON-CAPA domain.').'</div>';                      $lockerrorsref->{$prefix} .= ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.',
                                                        '<a href="/adm/helpdesk" target="_helpdesk">','</a>').
                                                    '</div>';
                 }                  }
             }              }
         } elsif ($url =~ m{/syllabus$}) {          } elsif ($url =~ m{/syllabus$}) {
Line 2269  sub update_parameter { Line 2625  sub update_parameter {
   
 sub handle_edit_cmd {  sub handle_edit_cmd {
     my ($coursenum,$coursedom) =@_;      my ($coursenum,$coursedom) =@_;
     return if ($env{'form.cmd'} eq '');      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]];
Line 2330  sub editor { Line 2688  sub editor {
     my $jumpto;      my $jumpto;
   
     unless ($supplementalflag) {      unless ($supplementalflag) {
         $jumpto = "'uploaded/$coursedom/$coursenum/$folder.$container'";          $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container";
     }      }
   
     unless ($allowed) {      unless ($allowed) {
Line 2597  sub editor { Line 2955  sub editor {
   
     my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);      my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);
     %filters =  (      %filters =  (
                   canremove => [],                    canremove      => [],
                   cancut    => [],                    cancut         => [],
                   cancopy   => [],                    cancopy        => [],
                     hiddenresource => [],
                     encrypturl     => [],
                     randomorder    => [],
                     randompick     => [],
                 );                  );
     %curr_groups = &Apache::longroup::coursegroups();      %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 
Line 2624  sub editor { Line 2986  sub editor {
   
     my $need_save;      my $need_save;
     if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {      if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {
         my $toolslink = '<table><tr><td>'          my $toolslink;
           if ($allowed || &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
               $toolslink = '<table><tr><td>'
                        .&Apache::loncommon::help_open_menu('Navigation Screen',                         .&Apache::loncommon::help_open_menu('Navigation Screen',
                                                            'Navigation_Screen',undef,'RAT')                                                             'Navigation_Screen',undef,'RAT')
                        .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'                         .'</td><td class="LC_middle">'.&mt('Tools:').'</td>'
Line 2634  sub editor { Line 2998  sub editor {
                        .'class="LC_toolbarItem" '                         .'class="LC_toolbarItem" '
                        .'title="'.&mt('Supplemental Content Editor').'">'                         .'title="'.&mt('Supplemental Content Editor').'">'
                        .'</a></li></ul></td></tr></table><br />';                         .'</a></li></ul></td></tr></table><br />';
           }
         if ($shown) {          if ($shown) {
             if ($allowed) {              if ($allowed) {
                 $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')                  $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll')
Line 2649  sub editor { Line 3014  sub editor {
                 if ($folder !~ /^supplemental/) {                  if ($folder !~ /^supplemental/) {
                     $lists{'canhide'} = join(',',@allidx);                      $lists{'canhide'} = join(',',@allidx);
                     $lists{'canrandomlyorder'} = join(',',@allmapidx);                      $lists{'canrandomlyorder'} = join(',',@allmapidx);
                     foreach my $item ('canremove','cancut','cancopy') {                      my @possfilters = ('canremove','cancut','cancopy','hiddenresource','encrypturl',
                                          'randomorder','randompick');
                       foreach my $item (@possfilters) {
                         if (ref($filters{$item}) eq 'ARRAY') {                          if (ref($filters{$item}) eq 'ARRAY') {
                             $lists{$item} = join(',',@{$filters{$item}});                               if (@{$filters{$item}} > 0) {
                                   $lists{$item} = join(',',@{$filters{$item}});
                               }
                         }                          }
                     }                      }
                     if (@allidx > 0) {                      if (@allidx > 0) {
Line 2693  sub editor { Line 3062  sub editor {
             }              }
             $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')              $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
                        .'<div class="LC_info" id="contentlist">'                         .'<div class="LC_info" id="contentlist">'
                        .&mt('Currently no documents.')                         .&mt('Currently empty')
                        .'</div>'                         .'</div>'
                        .&Apache::loncommon::end_scrollbox();                         .&Apache::loncommon::end_scrollbox();
         }          }
Line 2706  sub editor { Line 3075  sub editor {
                       .'</div>';                        .'</div>';
         } else {          } else {
             $to_show = '<div class="LC_info" id="contentlist">'              $to_show = '<div class="LC_info" id="contentlist">'
                       .&mt('Currently no documents.')                        .&mt('Currently empty')
                       .'</div>'                        .'</div>'
         }          }
     }      }
Line 2773  sub multiple_check_form { Line 3142  sub multiple_check_form {
         '<input type="hidden" name="allidx" value="'.$listsref->{'canhide'}.'" />';          '<input type="hidden" name="allidx" value="'.$listsref->{'canhide'}.'" />';
     if ($caller eq 'settings') {      if ($caller eq 'settings') {
         $output .=           $output .= 
         '<input type="hidden" name="allmapidx" value="'.$listsref->{'canrandomlyorder'}.'" />';          '<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') {      } elsif ($caller eq 'actions') {
         $output .=          $output .=
         '<input type="hidden" name="allremoveidx" id="allremoveidx" value="'.$listsref->{'canremove'}.'" />'.          '<input type="hidden" name="allremoveidx" id="allremoveidx" value="'.$listsref->{'canremove'}.'" />'.
Line 2787  sub multiple_check_form { Line 3160  sub multiple_check_form {
 }  }
   
 sub process_file_upload {  sub process_file_upload {
     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;      my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd,$crstype) = @_;
 # upload a file, if present  # upload a file, if present
       my $filesize = length($env{'form.uploaddoc'});
       if (!$filesize) {
           $$upload_output = '<div class="LC_error">'.
                              &mt('Unable to upload [_1]. (size = [_2] bytes)',
                             '<span class="LC_filename">'.$env{'form.uploaddoc.filename'}.'</span>',
                             $filesize).'<br />'.
                             &mt('Either the file you attempted to upload was empty, or your web browser was unable to read its contents.').'<br />'.
                             '</div>';
           return;
       }
       my $quotatype = 'unofficial';
       if ($crstype eq 'Community') {
           $quotatype = 'community';    
       } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.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 2884  sub process_file_upload { Line 3282  sub process_file_upload {
                     $$upload_output .= &mt('No embedded items identified').'<br />';                      $$upload_output .= &mt('No embedded items identified').'<br />';
                 }                  }
                 $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';                  $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>';
             } elsif (&Apache::loncommon::is_archive_file($mimetype)) {              } elsif ((&Apache::loncommon::is_archive_file($mimetype)) &&
                        ($env{'form.uploaddoc.filename'} =~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/i)) {
                 $nextphase = 'decompress_uploaded';                  $nextphase = 'decompress_uploaded';
                 my $position = scalar(@LONCAPA::map::order)-1;                  my $position = scalar(@LONCAPA::map::order)-1;
                 my $noextract = &return_to_editor();                  my $noextract = &return_to_editor();
Line 2946  sub is_supplemental_title { Line 3345  sub is_supplemental_title {
 sub entryline {  sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,      my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups)=@_;          $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups)=@_;
     my ($foldertitle,$renametitle);      my ($foldertitle,$renametitle,$oldtitle);
     if (&is_supplemental_title($title)) {      if (&is_supplemental_title($title)) {
  ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);   ($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
     } else {      } else {
Line 2960  sub entryline { Line 3359  sub entryline {
     $renametitle=~s/\\/\\\\/g;      $renametitle=~s/\\/\\\\/g;
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/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,$form_param);
 # Edit commands  # Edit commands
Line 3056  END Line 3457  END
  }   }
   
  if ($denied{'copy'}) {   if ($denied{'copy'}) {
             $copylink=(<<ENDCOPY);              $copylink=(<<ENDCOPY)
 <span style="visibility: hidden;">$lt{'cp'}</span>  <span style="visibility: hidden;">$lt{'cp'}</span>
 ENDCOPY  ENDCOPY
         } else {          } else {
Line 3108  ENDREM Line 3509  ENDREM
                 push(@{$filtersref->{'canremove'}},$orderidx);                  push(@{$filtersref->{'canremove'}},$orderidx);
             }              }
         }          }
         unless ($isexternal) {          $renamelink=(<<ENDREN);
             $renamelink=(<<ENDREN);  <a href='javascript:changename("$esc_path","$index","$oldtitle");' class="LC_docs_rename">$lt{'rn'}</a>
 <a href='javascript:changename("$esc_path","$index","$renametitle");' class="LC_docs_rename">$lt{'rn'}</a>  
 ENDREN  ENDREN
         }  
  $line.=(<<END);   $line.=(<<END);
 <td>  <td>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
Line 3223  END Line 3622  END
             my $rpckchk;              my $rpckchk;
             if ($rpicknum) {              if ($rpicknum) {
                 $rpckchk = ' checked="checked"';                  $rpckchk = ' checked="checked"';
                   if (($ishash) && (ref($filtersref->{'randompick'}) eq 'ARRAY')) {
                       push(@{$filtersref->{'randompick'}},$orderidx.':'.$rpicknum);
                   }
             }              }
             my $formname = 'edit_randompick_'.$orderidx;              my $formname = 'edit_randompick_'.$orderidx;
     $rand_pick_text =       $rand_pick_text = 
Line 3235  $form_common."\n". Line 3637  $form_common."\n".
             }              }
             $rand_pick_text .= '</span></span>'.              $rand_pick_text .= '</span></span>'.
                                $form_end;                                 $form_end;
        my $ro_set=              my $ro_set;
         ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':'');              if ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i) {
             my $formname = 'edit_rorder_'.$orderidx;                  $ro_set = 'checked="checked"';
                   if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
                       push(@{$filtersref->{'randomorder'}},$orderidx);
                   }
               }
               $formname = 'edit_rorder_'.$orderidx;
     $rand_order_text =       $rand_order_text = 
 '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".  '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
 $form_param."\n".  $form_param."\n".
Line 3313  $form_end; Line 3720  $form_end;
   my %lt=&Apache::lonlocal::texthash(    my %lt=&Apache::lonlocal::texthash(
        'hd' => 'Hidden',         'hd' => 'Hidden',
        'ec' => 'URL hidden');         'ec' => 'URL hidden');
  my $enctext=          my ($enctext,$hidtext);
     ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':'');          if ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) {
  my $hidtext=              $enctext = ' checked="checked"';
     ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':'');              if (($ishash) && (ref($filtersref->{'encrypturl'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'encrypturl'}},$orderidx);
               }
           }
           if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
               $hidtext = ' checked="checked"';
               if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
                   push(@{$filtersref->{'hiddenresource'}},$orderidx);
               }
           }
         my $formhidden = 'edit_hiddenresource_'.$orderidx;          my $formhidden = 'edit_hiddenresource_'.$orderidx;
         my $formurlhidden = 'edit_encrypturl_'.$orderidx;          my $formurlhidden = 'edit_encrypturl_'.$orderidx;
  $line.=(<<ENDPARMS);   $line.=(<<ENDPARMS);
Line 3431  sub new_timebased_suffix { Line 3847  sub new_timebased_suffix {
         } elsif ($type eq 'smppg') {          } elsif ($type eq 'smppg') {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');              $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');
         } else {          } else {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new bulletin board.');              $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new discussion board.');
         }          }
         if ($error) {          if ($error) {
             $errtext .= '<br />'.$error;              $errtext .= '<br />'.$error;
Line 3450  sub new_timebased_suffix { Line 3866  sub new_timebased_suffix {
                 &mt('This will prevent creation of additional simple pages in this course.');                  &mt('This will prevent creation of additional simple pages in this course.');
         } else {          } else {
             $locknotfreed .=              $locknotfreed .=
                 &mt('This will prevent creation of additional bulletin boards in this course.');                  &mt('This will prevent creation of additional discussion boards in this course.');
         }          }
         unless ($type eq 'paste') {          unless ($type eq 'paste') {
             $locknotfreed .=              $locknotfreed .=
                 ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.');                  ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.',
                           '<a href="/adm/helpdesk" target="_helpdesk">','</a>');
         }          }
         $locknotfreed .= '</div>';          $locknotfreed .= '</div>';
     }      }
Line 3619  sub list_symbs { Line 4036  sub list_symbs {
 sub verifycontent {  sub verifycontent {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents'));      $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>');       $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>'); 
    $hashtied=0;     $hashtied=0;
Line 3656  sub devalidateversioncache { Line 4073  sub devalidateversioncache {
 sub checkversions {  sub checkversions {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));      $r->print(&Apache::loncommon::start_page("Check $crstype Resource Versions"));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));      $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Resource Versions"));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
   
     my $header='';      my $header='';
Line 3722  sub checkversions { Line 4139  sub checkversions {
     &changewarning($r,'');      &changewarning($r,'');
     if ($env{'form.timerange'} eq 'all') {      if ($env{'form.timerange'} eq 'all') {
 # show all documents  # show all documents
  $header=&mt('All Documents in '.$crstype);   $header=&mt('All content in '.$crstype);
  $allsel=' selected="selected"';   $allsel=' selected="selected"';
  foreach my $key (keys(%hash)) {   foreach my $key (keys(%hash)) {
     if ($key=~/^ids\_(\/res\/.+)$/) {      if ($key=~/^ids\_(\/res\/.+)$/) {
Line 3813  $lt{'sc'}: <input type="submit" name="se Line 4230  $lt{'sc'}: <input type="submit" name="se
 <br clear="all" />  <br clear="all" />
 <hr />  <hr />
 <h4>$lt{'vers'}</h4>  <h4>$lt{'vers'}</h4>
 <input type="submit" name="setversions" value="$lt{'save'}" />  
 ENDHEADERS  ENDHEADERS
     #number of columns for version history      #number of columns for version history
       my %changedbytime;
       foreach my $key (keys(%changes)) {
           #excludes not versionable problems from resource version history:
           next if ($key =~ /^\/res\/lib\/templates/);
           my $chg;
           if ($env{'form.timerange'} eq 'all') {
               my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
               $chg = &Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate');
           } else {
               $chg = $changes{$key};
               next if ($chg < $starttime);
           }
           push(@{$changedbytime{$chg}},$key);
       }
       if (keys(%changedbytime) == 0) {
           &untiehash();
           $r->print(&mt('No content changes in imported content in specified time frame').
                     &endContentScreen());
           return;
       }
     $r->print(      $r->print(
          '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'.
         &Apache::loncommon::start_data_table().          &Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row().          &Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Resources').'</th>'.          '<th>'.&mt('Resources').'</th>'.
Line 3826  ENDHEADERS Line 4263  ENDHEADERS
         '<th>'.&mt('History').'</th>'.          '<th>'.&mt('History').'</th>'.
         &Apache::loncommon::end_data_table_header_row()          &Apache::loncommon::end_data_table_header_row()
     );      );
     foreach my $key (sort(keys(%changes))) {      foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) {
         #excludes not versionable problems from resource version history:          foreach my $key (sort(@{$changedbytime{$chg}})) {
         next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/);              my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
         my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);              my $currentversion=&Apache::lonnet::getversion($key);
         my $currentversion=&Apache::lonnet::getversion($key);              if ($currentversion<0) {
         if ($currentversion<0) {                  $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';
             $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';              }
         }              my $linkurl=&Apache::lonnet::clutter($key);
         my $linkurl=&Apache::lonnet::clutter($key);              $r->print(
         $r->print(                  &Apache::loncommon::start_data_table_row().
             &Apache::loncommon::start_data_table_row().                  '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.
             '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.                  '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.
             '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.                  '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.
             '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.                  &Apache::lonlocal::locallocaltime($chg).')</span></td>'.
             &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'.                  '<td align="right">'
             '<td align="right">'              );
         );              # Used in course
         # Used in course              my $usedversion=$hash{'version_'.$linkurl};
         my $usedversion=$hash{'version_'.$linkurl};              if (($usedversion) && ($usedversion ne 'mostrecent')) {
         if (($usedversion) && ($usedversion ne 'mostrecent')) {  
                 if ($usedversion != $currentversion) {                  if ($usedversion != $currentversion) {
                     $r->print('<span class="LC_warning">'.$usedversion.'</span>');                      $r->print('<span class="LC_warning">'.$usedversion.'</span>');
                 } else {                  } else {
Line 3854  ENDHEADERS Line 4290  ENDHEADERS
             } else {              } else {
                 $r->print($currentversion);                  $r->print($currentversion);
             }              }
         $r->print('</td><td title="'.$lt{'vu'}.'">');              $r->print('</td><td title="'.$lt{'vu'}.'">');
         # Set version              # Set version
         $r->print(&Apache::loncommon::select_form(              $r->print(&Apache::loncommon::select_form(
             $setversions{$linkurl},                        $setversions{$linkurl},
             'set_version_'.$linkurl,                        'set_version_'.$linkurl,
             {'select_form_order' => ['',1..$currentversion,'mostrecent'],                        {'select_form_order' => ['',1..$currentversion,'mostrecent'],
              '' => '',                        '' => '',
              'mostrecent' => &mt('most recent'),                        'mostrecent' => &mt('most recent'),
              map {$_,$_} (1..$currentversion)}));                        map {$_,$_} (1..$currentversion)}));
         my $lastold=1;              my $lastold=1;
         for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {              for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
             my $url=$root.'.'.$prevvers.'.'.$extension;                  my $url=$root.'.'.$prevvers.'.'.$extension;
             if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {                  if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {
                 $lastold=$prevvers;                      $lastold=$prevvers;
             }                  }
         }              }
         $r->print('</td>');              $r->print('</td>');
         # List all available versions              # List all available versions
         $r->print('<td valign="top"><span class="LC_fontsize_medium">');              $r->print('<td valign="top"><span class="LC_fontsize_medium">');
         for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {              for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
             my $url=$root.'.'.$prevvers.'.'.$extension;                  my $url=$root.'.'.$prevvers.'.'.$extension;
             $r->print(  
                 '<span class="LC_nobreak">'  
                .'<a href="'.&Apache::lonnet::clutter($url).'">'  
                .&mt('Version [_1]',$prevvers).'</a>'  
                .' ('.&Apache::lonlocal::locallocaltime(  
                          &Apache::lonnet::metadata($url,'lastrevisiondate'))  
                .')');  
             if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {  
                 $r->print(                  $r->print(
                     ' <a href="/adm/diff?filename='.                      '<span class="LC_nobreak">'
                     &Apache::lonnet::clutter($root.'.'.$extension).                     .'<a href="'.&Apache::lonnet::clutter($url).'">'
                     &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').                     .&mt('Version [_1]',$prevvers).'</a>'
                     '" target="diffs">'.&mt('Diffs').'</a>');                     .' ('.&Apache::lonlocal::locallocaltime(
                            &Apache::lonnet::metadata($url,'lastrevisiondate'))
                      .')');
                   if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
                       $r->print(
                           ' <a href="/adm/diff?filename='.
                           &Apache::lonnet::clutter($root.'.'.$extension).
                           &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').
                           '" target="diffs">'.&mt('Diffs').'</a>');
                   }
                   $r->print('</span><br />');
             }              }
             $r->print('</span><br />');              $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());
         }          }
         $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());  
     }      }
     $r->print(      $r->print(
         &Apache::loncommon::end_data_table().          &Apache::loncommon::end_data_table().
Line 3901  ENDHEADERS Line 4338  ENDHEADERS
   
     &untiehash();      &untiehash();
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
       return;
 }  }
   
 sub mark_hash_old {  sub mark_hash_old {
Line 3955  $help{'Caching'}.'</p></form>'."\n\n"); Line 4393  $help{'Caching'}.'</p></form>'."\n\n");
   
   
 sub init_breadcrumbs {  sub init_breadcrumbs {
     my ($form,$text)=@_;      my ($form,$text,$help)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",
     text=>&Apache::loncommon::course_type().' Editor',      text=>&Apache::loncommon::course_type().' Editor',
     faq=>273,      faq=>273,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
                                             help => 'Docs_Adding_Course_Doc'});                                              help => $help});
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
     text=>$text,      text=>$text,
     faq=>273,      faq=>273,
Line 4000  sub startContentScreen { Line 4438  sub startContentScreen {
         $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 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Index').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';
     } else {      } else {
         $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Main Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Content Editor').'</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'tools')?' class="active"':'').'><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
                    '><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';                     '><a href="/adm/coursedocs?tools=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Utilities').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>';
Line 4021  sub endContentScreen { Line 4459  sub endContentScreen {
 }  }
   
 sub supplemental_base {  sub supplemental_base {
     return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content'));      return 'supplemental&'.&escape(&mt('Supplemental Content'));
 }  }
   
 sub handler {  sub handler {
Line 4045  sub handler { Line 4483  sub handler {
                'Adding_Folders','Docs_Overview', 'Load_Map',                 'Adding_Folders','Docs_Overview', 'Load_Map',
                'Supplemental','Score_Upload_Form','Adding_Pages',                 'Supplemental','Score_Upload_Form','Adding_Pages',
                'Importing_LON-CAPA_Resource','Importing_IMS_Course',                 'Importing_LON-CAPA_Resource','Importing_IMS_Course',
                        'Uploading_From_Harddrive',                         'Uploading_From_Harddrive','Course_Roster','Web_Page',
                'Check_Resource_Versions','Verify_Content') {                         'Dropbox','Simple_Problem') {
  $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);   $help{$topic}=&Apache::loncommon::help_open_topic('Docs_'.$topic);
     }      }
     # Composite help files      # Composite help files
Line 4054  sub handler { Line 4492  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');
     $help{'Course Roster'} = &Apache::loncommon::help_open_topic('Docs_Course_Roster');  
     $help{'Web Page'} =  &Apache::loncommon::help_open_topic('Docs_Web_Page');  
     
     my $allowed;      my $allowed;
 # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.  # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
Line 4072  sub handler { Line 4506  sub handler {
         $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});          $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
     }      }
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver',      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);
                                             'inhibitmenu']);    if ($allowed && $env{'form.verify'}) {
   if ($allowed && $env{'form.chooseserver'}) {        &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content');
       &choose_dump_server($r);  
       return OK;  
   } elsif ($allowed && $env{'form.verify'}) {  
       &init_breadcrumbs('verify','Verify Content');  
       &verifycontent($r);        &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {    } elsif ($allowed && $env{'form.listsymbs'}) {
       &init_breadcrumbs('listsymbs','List Content IDs');        &init_breadcrumbs('listsymbs','List Content IDs');
Line 4091  sub handler { Line 4521  sub handler {
       }        }
       &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);        &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);
   } elsif ($allowed && $env{'form.versions'}) {    } elsif ($allowed && $env{'form.versions'}) {
       &init_breadcrumbs('versions','Check/Set Resource Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');
       &checkversions($r);        &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
Line 4120  sub handler { Line 4550  sub handler {
 # supplementalflag=0: show standard documents  # supplementalflag=0: show standard documents
 # toolsflag=1: show utilities  # toolsflag=1: show utilities
   
     $env{'form.folderpath'} = &unescape($env{'form.folderpath'});      my $unesc_folderpath = &unescape($env{'form.folderpath'});
     my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);      my $supplementalflag=($unesc_folderpath=~/^supplemental/);
     if (($env{'form.folderpath'}=~/^default/) || ($env{'form.folderpath'} eq "")) {      if (($unesc_folderpath=~/^default/) || ($unesc_folderpath eq "")) {
        $supplementalflag=0;         $supplementalflag=0;
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
Line 4154  sub handler { Line 4584  sub handler {
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
        $env{'form.folderpath'} = 'default&'.         $env{'form.folderpath'} = 'default&'.
                                  &escape(&mt('Main '.$crstype.' Content').':::::');                                   &escape(&mt('Main Content').':::::');
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}});         &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => $env{'form.command'}});
    } elsif ($env{'form.command'} eq 'editsupp') {     } elsif ($env{'form.command'} eq 'editsupp') {
        $env{'form.folderpath'} = 'supplemental&'.         $env{'form.folderpath'} = 'supplemental&'.
Line 4199  sub handler { Line 4629  sub handler {
        if ($supplementalflag) {         if ($supplementalflag) {
           $env{'form.folderpath'}=&supplemental_base();            $env{'form.folderpath'}=&supplemental_base();
        } else {         } else {
           $env{'form.folderpath'}='default'.&escape(&mt('Main '.$crstype.' Content').            $env{'form.folderpath'}='default&'.&escape(&mt('Main Content').
                                   ':::::');                                    ':::::');
        }         }
     }      }
Line 4225  sub handler { Line 4655  sub handler {
             if ($env{'form.folder'} eq '' ||              if ($env{'form.folder'} eq '' ||
                 $env{'form.folder'} eq 'supplemental') {                  $env{'form.folder'} eq 'supplemental') {
                 $folderpath='default&'.                  $folderpath='default&'.
                             &escape(&mt('Main '.$crstype.' Content').':::::');                              &escape(&mt('Main Content').':::::');
             }              }
         }          }
         $containertag = '<input type="hidden" name="folderpath" value="" />';          $containertag = '<input type="hidden" name="folderpath" value="" />';
Line 4262  sub handler { Line 4692  sub handler {
                 $script .= &dump_switchserver_js(@hosts);                   $script .= &dump_switchserver_js(@hosts); 
             }              }
         } else {          } else {
               my $tid = 1;
             my @tabids;              my @tabids;
             if ($supplementalflag) {              if ($supplementalflag) {
                 @tabids = ('002','ee2','ff2');                  @tabids = ('002','ee2','ff2');
                   $tid = 2;
             } else {              } else {
                 @tabids = ('aa1','bb1','cc1','ff1');                  @tabids = ('aa1','bb1','cc1','ff1');
                 unless ($env{'form.folderpath'} =~ /\:1$/) {                  unless ($env{'form.folderpath'} =~ /\:1$/) {
Line 4276  sub handler { Line 4708  sub handler {
     $script .= &editing_js($udom,$uname,$supplementalflag).      $script .= &editing_js($udom,$uname,$supplementalflag).
                        &history_tab_js().                         &history_tab_js().
                        &inject_data_js().                         &inject_data_js().
                        &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr).                         &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid).
                        &Apache::lonextresedit::extedit_javascript();                         &Apache::lonextresedit::extedit_javascript();
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
Line 4301  sub handler { Line 4733  sub handler {
     if ($showdoc) {      if ($showdoc) {
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,          $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
                                                 {'force_register' => $showdoc,}));                                                  {'force_register' => $showdoc,}));
       } elsif ($toolsflag) {
           &Apache::lonhtmlcommon::add_breadcrumb({
               href=>"/adm/coursedocs",text=>"$crstype Contents"});
           $r->print(&Apache::loncommon::start_page("$crstype Contents", $script)
                    .&Apache::loncommon::help_open_menu('','',273,'RAT')
                    .&Apache::lonhtmlcommon::breadcrumbs(
                        'Editing Course Contents')
                    );
     } elsif ($r->uri eq '/adm/supplemental') {      } elsif ($r->uri eq '/adm/supplemental') {
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,          $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
Line 4328  sub handler { Line 4768  sub handler {
           # Process file upload - phase one - upload and parse primary file.            # Process file upload - phase one - upload and parse primary file.
   undef($hadchanges);    undef($hadchanges);
           $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,            $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,
                                               \%allfiles,\%codebase,$context);                                                \%allfiles,\%codebase,$context,$crstype);
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
Line 4380  sub handler { Line 4820  sub handler {
        my %lt=&Apache::lonlocal::texthash(         my %lt=&Apache::lonlocal::texthash(
  'copm' => 'All documents out of a published map into this folder',   'copm' => 'All documents out of a published map into this folder',
                 'upfi' => 'Upload File',                  'upfi' => 'Upload File',
                 'upld' => 'Import Content',                  'upld' => 'Upload Content',
                 'srch' => 'Search',                  'srch' => 'Search',
                 'impo' => 'Import',                  'impo' => 'Import',
  'lnks' => 'Import from Stored Links',   'lnks' => 'Import from Stored Links',
Line 4401  sub handler { Line 4841  sub handler {
                 'grpo' => 'Group Portfolio',                  'grpo' => 'Group Portfolio',
                 'rost' => 'Course Roster',                  'rost' => 'Course Roster',
                 'abou' => 'Personal Information Page for a User',                  'abou' => 'Personal Information Page for a User',
                 'imsf' => 'IMS Import',                  'imsf' => 'IMS Upload',
                 'imsl' => 'Import IMS package',                  'imsl' => 'Upload IMS package',
                 'cms'  => 'Origin of IMS package',                  'cms'  => 'Origin of IMS package',
                 'se'   => 'Select',                  'se'   => 'Select',
                 'file' =>  'File',                  'file' =>  'File',
                 'title' => 'Title',                  'title' => 'Title',
                 'comment' => 'Comment',                  'comment' => 'Comment',
                 'parse' => 'Upload embedded images/multimedia files if HTML file',                  'parse' => 'Upload embedded images/multimedia files if HTML file',
   );                  'bb5'      => 'Blackboard 5',
                   'bb6'      => 'Blackboard 6',
                   'angel5'   => 'ANGEL 5.5',
                   'webctce4' => 'WebCT 4 Campus Edition',
           );
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
  $lt{'file'}:<br />   $lt{'file'}:<br />
Line 4440  CHBO Line 4884  CHBO
         $lt{'cms'}:&nbsp;           $lt{'cms'}:&nbsp; 
         <select name="source">          <select name="source">
         <option value="-1" selected="selected">$lt{'se'}</option>          <option value="-1" selected="selected">$lt{'se'}</option>
         <option value="bb5">Blackboard 5</option>          <option value="bb5">$lt{'bb5'}</option>
         <option value="bb6">Blackboard 6</option>          <option value="bb6">$lt{'bb6'}</option>
         <option value="angel5">ANGEL 5.5</option>          <option value="angel5">$lt{'angel5'}</option>
         <option value="webctce4">WebCT 4 Campus Edition</option>          <option value="webctce4">$lt{'webctce4'}</option>
         </select>          </select>
         <input type="hidden" name="folder" value="$imsfolder" />          <input type="hidden" name="folder" value="$imsfolder" />
         </p>          </p>
Line 4550  HIDDENFORM Line 4994  HIDDENFORM
        if ($folder eq '' || $supplementalflag) {         if ($folder eq '' || $supplementalflag) {
            $folder='default';             $folder='default';
    $savefolderpath = $env{'form.folderpath'};     $savefolderpath = $env{'form.folderpath'};
    $env{'form.folderpath'}='default&'.&escape(&mt('Content'));     $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'));
            $pathitem = '<input type="hidden" name="folderpath" value="'.             $pathitem = '<input type="hidden" name="folderpath" value="'.
        &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';         &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
        }         }
Line 4571  HIDDENFORM Line 5015  HIDDENFORM
   
  my $newnavform=(<<NNFORM);   my $newnavform=(<<NNFORM);
  <form action="/adm/coursedocs" method="post" name="newnav">   <form action="/adm/coursedocs" method="post" name="newnav">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'navc'}=/adm/navmaps" />   value="$lt{'navc'}=/adm/navmaps" />
Line 4581  HIDDENFORM Line 5025  HIDDENFORM
 NNFORM  NNFORM
  my $newsmppageform=(<<NSPFORM);   my $newsmppageform=(<<NSPFORM);
  <form action="/adm/coursedocs" method="post" name="newsmppg">   <form action="/adm/coursedocs" method="post" name="newsmppg">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>   <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>
Line 4595  NSPFORM Line 5039  NSPFORM
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a>   <a class="LC_menubuttons_link" href="javascript:makesmpproblem();">$lt{'sipr'}</a>
  $help{'Simple Problem'}   $help{'Simple_Problem'}
  </form>   </form>
   
 NSPROBFORM  NSPROBFORM
Line 4606  NSPROBFORM Line 5050  NSPROBFORM
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a>   <a class="LC_menubuttons_link" href="javascript:makedropbox();">$lt{'drbx'}</a>
           $help{'Dropbox'}
  </form>   </form>
 NDBFORM  NDBFORM
   
Line 4621  NEXUFORM Line 5066  NEXUFORM
   
  my $newbulform=(<<NBFORM);   my $newbulform=(<<NBFORM);
  <form action="/adm/coursedocs" method="post" name="newbul">   <form action="/adm/coursedocs" method="post" name="newbul">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>   <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>
Line 4631  NBFORM Line 5076  NBFORM
   
  my $newaboutmeform=(<<NAMFORM);   my $newaboutmeform=(<<NAMFORM);
  <form action="/adm/coursedocs" method="post" name="newaboutme">   <form action="/adm/coursedocs" method="post" name="newaboutme">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
Line 4642  NAMFORM Line 5087  NAMFORM
   
  my $newaboutsomeoneform=(<<NASOFORM);   my $newaboutsomeoneform=(<<NASOFORM);
  <form action="/adm/coursedocs" method="post" name="newaboutsomeone">   <form action="/adm/coursedocs" method="post" name="newaboutsomeone">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>   <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>
Line 4651  NASOFORM Line 5096  NASOFORM
   
  my $newrosterform=(<<NROSTFORM);   my $newrosterform=(<<NROSTFORM);
  <form action="/adm/coursedocs" method="post" name="newroster">   <form action="/adm/coursedocs" method="post" name="newroster">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'rost'}=/adm/viewclasslist" />   value="$lt{'rost'}=/adm/viewclasslist" />
  <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a>
  $help{'Course Roster'}   $help{'Course_Roster'}
  </form>   </form>
 NROSTFORM  NROSTFORM
   
Line 4672  NROSTFORM Line 5117  NROSTFORM
         }          }
         my $newwebpageform =(<<NWEBFORM);          my $newwebpageform =(<<NWEBFORM);
         <form action="/adm/coursedocs" method="post" name="newwebpage">          <form action="/adm/coursedocs" method="post" name="newwebpage">
         <input type="hidden" name="active" value="cc" />          <input type="hidden" name="active" value="ee" />
         $pathitem          $pathitem
         <input type="hidden" name="importdetail" value="$newwebpage" />          <input type="hidden" name="importdetail" value="$newwebpage" />
         <a class="LC_menubuttons_link" href="javascript:makewebpage();">$lt{'webp'}</a>          <a class="LC_menubuttons_link" href="javascript:makewebpage();">$lt{'webp'}</a>
         $help{'Web Page'}          $help{'Web_Page'}
         </form>          </form>
 NWEBFORM  NWEBFORM
     
Line 4696  my $newfolderb; Line 5141  my $newfolderb;
  <form action="/adm/coursedocs" method="post" name="newpage">   <form action="/adm/coursedocs" method="post" name="newpage">
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>   <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>
  $help{'Adding_Pages'}   $help{'Adding_Pages'}
  </form>   </form>
Line 4707  NPFORM Line 5152  NPFORM
  <form action="/adm/coursedocs" method="post" name="newfolder">   <form action="/adm/coursedocs" method="post" name="newfolder">
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="aa" />   <input type="hidden" name="active" value="" />
  <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}   <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}
  </form>   </form>
 NFFORM  NFFORM
   
  my $newsylform=(<<NSYLFORM);   my $newsylform=(<<NSYLFORM);
  <form action="/adm/coursedocs" method="post" name="newsyl">   <form action="/adm/coursedocs" method="post" name="newsyl">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="ee" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />   value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
Line 4726  NSYLFORM Line 5171  NSYLFORM
   
  my $newgroupfileform=(<<NGFFORM);   my $newgroupfileform=(<<NGFFORM);
  <form action="/adm/coursedocs" method="post" name="newgroupfiles">   <form action="/adm/coursedocs" method="post" name="newgroupfiles">
  <input type="hidden" name="active" value="cc" />   <input type="hidden" name="active" value="dd" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"   <input type="hidden" name="importdetail"
  value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />   value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
Line 4753  NGFFORM Line 5198  NGFFORM
             );              );
         }          }
         push(@importdoc,          push(@importdoc,
             {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}              {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}
         );          );
         $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));
   
Line 4775  NGFFORM Line 5220  NGFFORM
         $communityform = &create_form_ul(&create_list_elements(@communityforma));          $communityform = &create_form_ul(&create_list_elements(@communityforma));
   
 my %orderhash = (  my %orderhash = (
                 'aa' => ['Import Content',$fileuploadform],                  'aa' => ['Upload',$fileuploadform],
                 'bb' => ['Published Content',$importpubform],                  'bb' => ['Import',$importpubform],
                 'cc' => ['Grading Resources',$gradingform],                  'cc' => ['Grading',$gradingform],
                 );                  );
 unless ($container eq 'page') {  unless ($container eq 'page') {
     $orderhash{'00'} = ['Newfolder',$newfolderform];      $orderhash{'00'} = ['Newfolder',$newfolderform];
     $orderhash{'dd'} = ['Collaboration',$communityform];      $orderhash{'dd'} = ['Collaboration',$communityform];
     $orderhash{'ee'} = ['Special Pages',$specialdocumentsform];      $orderhash{'ee'} = ['Other',$specialdocumentsform];
 }  }
   
  $hadchanges=0;   $hadchanges=0;
Line 4843  SUPDOCFORM Line 5288  SUPDOCFORM
   
  my $supnewfolderform=(<<SNFFORM);   my $supnewfolderform=(<<SNFFORM);
  <form action="/adm/coursedocs" method="post" name="supnewfolder">   <form action="/adm/coursedocs" method="post" name="supnewfolder">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="" />
         $pathitem          $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a>    <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> 
Line 4893  SNAMFORM Line 5338  SNAMFORM
         $pathitem          $pathitem
         <input type="hidden" name="importdetail" value="$supwebpage" />          <input type="hidden" name="importdetail" value="$supwebpage" />
         <a class="LC_menubuttons_link" href="javascript:makewebpage('supp');">$lt{'webp'}</a>          <a class="LC_menubuttons_link" href="javascript:makewebpage('supp');">$lt{'webp'}</a>
         $help{'Web Page'}          $help{'Web_Page'}
         </form>          </form>
 SWEBFORM  SWEBFORM
   
Line 4916  my @supimportdoc = ( Line 5361  my @supimportdoc = (
 $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));  $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));
 my %suporderhash = (  my %suporderhash = (
  '00' => ['Supnewfolder', $supnewfolderform],   '00' => ['Supnewfolder', $supnewfolderform],
                 'ee' => ['Import Content',$supupdocform],                  'ee' => ['Upload',$supupdocform],
                 'ff' => ['Special Pages',&create_form_ul(&create_list_elements(@specialdocs))]                  'ff' => ['Other',&create_form_ul(&create_list_elements(@specialdocs))]
                 );                  );
         if ($supplementalflag) {          if ($supplementalflag) {
            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,             my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                                $supplementalflag,\%suporderhash,$iconpath,$pathitem);                                 $supplementalflag,\%suporderhash,$iconpath,$pathitem);
            if ($error) {             if ($error) {
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');                $r->print('<p><span class="LC_error">'.$error.'</span></p>');
            }             } else {
                  if ($suppchanges) {
                      my %servers = &Apache::lonnet::internet_dom_servers($coursedom);
                      my @ids=&Apache::lonnet::current_machine_ids();
                      foreach my $server (keys(%servers)) {
                          next if (grep(/^\Q$server\E$/,@ids));
                          my $hashid=$coursenum.':'.$coursedom;
                          my $cachekey = &escape('suppcount').':'.&escape($hashid);
                          &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);
                      }
                      &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);
                      undef($suppchanges);
                  }  
              } 
         }          }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
Line 5002  sub decompression_info { Line 5460  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');      my @hiddens = ('newidx','comment','position','folderpath','archiveurl');
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.folderpath'} =~ /\:1$/) {
         $container='page';          $container='page';
     }      }
     unshift(@hiddens,$pathitem);      unshift(@hiddens,$pathitem);
     foreach my $item (@hiddens) {      foreach my $item (@hiddens) {
         if ($env{'form.'.$item}) {          if ($env{'form.'.$item}) {
               my $value = $env{'form.'.$item};
             $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.              $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
                            $env{'form.'.$item}.'" />'."\n";                             &HTML::Entities::encode($env{'form.'.$item},'<>&"').'" />'."\n";
         }          }
     }      }
     return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,      return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
Line 5067  sub remove_archive { Line 5526  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'};
         if ($position > 0) {           my $archiveidx = $position;
             $env{'form.cmd'} = 'del_'.$position;          if ($position > 0) {
               if (($env{'form.autoextract_camtasia'}) && (scalar(@LONCAPA::map::order) == 2)) {
                   $archiveidx = $position-1;
               }
               $env{'form.cmd'} = 'remove_'.$archiveidx;
             my ($title,$url,@rrest) =               my ($title,$url,@rrest) = 
                 split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]);                  split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$archiveidx]]);
             if (&handle_edit_cmd($docuname,$docudom)) {              if ($url eq $env{'form.archiveurl'}) {
                 ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);                  if (&handle_edit_cmd($docuname,$docudom)) {
                 if ($fatal) {                      ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);
                     if ($container eq 'page') {                      if ($fatal) {
                         $delwarning = &mt('An error occurred updating the contents of the current page.');                          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 {
                         $delwarning = &mt('An error occurred updating the contents of the current folder.');                          $delresult = &mt('Archive file removed.');
                     }                      }
                 } 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 5107  sub generate_admin_menu { Line 5575  sub generate_admin_menu {
     my ($crstype) = @_;      my ($crstype) = @_;
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     my %lt=&Apache::lonlocal::texthash (      my %lt= ( # do not translate here
                                          'vc'   => 'Verify Content',                                           'vc'   => 'Verify Content',
                                          'cv'   => 'Check/Set Resource Versions',                                           'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',                                           'ls'   => 'List Resource Identifiers',
                                          'imse' => 'Export contents to IMS Archive',                                           'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Dump $crstype Content to Authoring Space",                                           'dcd'  => "Copy $crstype Content to Authoring Space",
                                        );              );
     my ($candump,$dumpurl);      my ($candump,$dumpurl);
     if ($home + $other > 0) {      if ($home + $other > 0) {
         $candump = 'F';          $candump = 'F';
Line 5143  sub generate_admin_menu { Line 5611  sub generate_admin_menu {
                 {   linktext   => $lt{'vc'},                  {   linktext   => $lt{'vc'},
                     url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",                      url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",
                     permission => 'F',                      permission => 'F',
                     help       => 'Verify_Content',                      help       => 'Docs_Verify_Content',
                     icon       => 'verify.png',                      icon       => 'verify.png',
                     linktitle  => 'Verify contents can be retrieved/rendered',                      linktitle  => 'Verify contents can be retrieved/rendered',
                 },                  },
                 {   linktext => $lt{'cv'},                  {   linktext => $lt{'cv'},
                     url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",                      url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",
                     permission => 'F',                      permission => 'F',
                     help       => 'Check_Resource_Versions',                      help       => 'Docs_Check_Resource_Versions',
                     icon       => 'resversion.png',                      icon       => 'resversion.png',
                     linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",                      linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",
                 },                  },
Line 5175  sub generate_admin_menu { Line 5643  sub generate_admin_menu {
                 {   linktext   => $lt{'dcd'},                  {   linktext   => $lt{'dcd'},
                     url        => $dumpurl,                      url        => $dumpurl,
                     permission => $candump,                      permission => $candump,
                     #help => '',                      help       => 'Docs_Dump_Course_Docs',
                     icon       => 'dump.png',                      icon       => 'dump.png',
                     linktitle  => $lt{'dcd'},                      linktitle  => $lt{'dcd'},
                 },                  },
Line 5195  sub generate_edit_table { Line 5663  sub generate_edit_table {
     my $form;      my $form;
     my $activetab;      my $activetab;
     my $active;      my $active;
     if (($env{'form.active'} ne '') && ($env{'form.active'} ne 'aa')) {      if (($env{'form.active'} ne '') && ($env{'form.active'} ne '00')) {
         $activetab = $env{'form.active'};          $activetab = $env{'form.active'};
     }      }
     my $backicon = $iconpath.'clickhere.gif';      my $backicon = $iconpath.'clickhere.gif';
Line 5203  sub generate_edit_table { Line 5671  sub generate_edit_table {
     $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">'.
             '<a href="javascript:toContents('.$jumpto.');">'.              '<a href="javascript:toContents('."'$jumpto'".');">'.
             '<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'.              '<img src="'.$backicon.'" class="LC_icon" style="border: none; vertical-align: top;"'.
             '  alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n".              '  alt="'.$backtext.'" />'.$backtext.'</a></li>'."\n".
             '<li>'.              '<li>'.
Line 5230  sub generate_edit_table { Line 5698  sub generate_edit_table {
             $form .= '<li style="float:right" '.$active              $form .= '<li style="float:right" '.$active
                 .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";                  .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";
         } else {          } else {
     $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";      $form .= '<li style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";
   
  }   }
     }      }
Line 5322  sub editing_js { Line 5790  sub editing_js {
                                           titbl   => 'Title is blank',                                            titbl   => 'Title is blank',
                                           more    => '(More ...)',                                            more    => '(More ...)',
                                           less    => '(Less ...)',                                            less    => '(Less ...)',
                                             noor    => 'No actions selected or changes to settings specified.',
                                             noch    => 'No changes to settings specified.',
                                             noac    => 'No actions selected.',
                                         );                                          );
   
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 5331  sub editing_js { Line 5802  sub editing_js {
         $main_container_page = 1;          $main_container_page = 1;
     }      }
     my $toplevelmain =       my $toplevelmain = 
         &escape(&mt('Main '.$crstype.' Content').':::::');          &escape(&mt('Main Content').':::::');
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
     my $backtourl;      my $backtourl;
Line 5345  sub editing_js { Line 5816  sub editing_js {
             if (&Apache::lonnet::is_on_map($res)) {              if (&Apache::lonnet::is_on_map($res)) {
                 $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($res),'<>&"').'?symb='.                  $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($res),'<>&"').'?symb='.
                              &HTML::Entities::encode($caller,'<>&"');                               &HTML::Entities::encode($caller,'<>&"');
               } else {
                   $backtourl = '/adm/navmaps';
             }              }
         }          }
     } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {      } elsif ($env{'docs.exit.'.$env{'request.course.id'}} eq '/adm/menu') {
Line 5788  for (i = 0; i < currentLis.length; i++) Line 6261  for (i = 0; i < currentLis.length; i++)
   
 function hideAll(current, nav, data) {  function hideAll(current, nav, data) {
 unselectInactive(nav);  unselectInactive(nav);
 if(current.className == 'right'){  if (current) { 
  current.className = 'right active'      if (current.className == 'right'){
  }else{          current.className = 'right active'
  current.className = 'active';      } else {
           current.className = 'active';
       }
 }  }
 currentData = document.getElementById(data);  currentData = document.getElementById(data);
 currentDivs = currentData.getElementsByTagName('DIV');  currentDivs = currentData.getElementsByTagName('DIV');
Line 5822  function openTabs(pageId) { Line 6297  function openTabs(pageId) {
 }  }
   
 function showPage(current, pageId, nav, data) {  function showPage(current, pageId, nav, data) {
           currstate = current.className;
  hideAll(current, nav, data);   hideAll(current, nav, data);
  openTabs(pageId);   openTabs(pageId);
  unselectInactive(nav);   unselectInactive(nav);
  current.className = 'active';          if ((currstate == 'active') || (currstate == 'right active')) {
               if (currstate == 'active') {
           current.className = '';
               } else {
                   current.className = 'right';
               }
               activeTab = ''; 
               toggleUpload();
               toggleMap();
               resize_scrollbox('contentscroll','1','0');
               return;
           } else {
               current.className = 'active';
           }
  currentData = document.getElementById(pageId);   currentData = document.getElementById(pageId);
  currentData.style.display = 'block';   currentData.style.display = 'block';
         activeTab = pageId;          activeTab = pageId;
Line 6009  function checkSubmits() { Line 6498  function checkSubmits() {
         }          }
     }      }
     var dosettings = multiSettings();      var dosettings = multiSettings();
       var haschanges = 0;
     if (dosettings == 1) {      if (dosettings == 1) {
         form.allencrypturl.value = '';          form.allencrypturl.value = '';
         form.allhiddenresource.value = '';          form.allhiddenresource.value = '';
         form.changeparms.value = 'all';           form.changeparms.value = 'all';
           var patt=new RegExp(",\$");
         var allidxlist = document.cumulativesettings.allidx.value;          var allidxlist = document.cumulativesettings.allidx.value;
         if ((allidxlist != '') && (allidxlist != null)) {          if ((allidxlist != '') && (allidxlist != null)) {
             var allidxs = allidxlist.split(',');              var allidxs = allidxlist.split(',');
Line 6029  function checkSubmits() { Line 6520  function checkSubmits() {
                         }                          }
                     }                      }
                 }                  }
                   form.allhiddenresource.value = form.allhiddenresource.value.replace(patt,"");
                   form.allencrypturl.value = form.allencrypturl.value.replace(patt,"");
             }              }
         }          }
         form.allrandompick.value = '';          form.allrandompick.value = '';
Line 6047  function checkSubmits() { Line 6540  function checkSubmits() {
                     form.allrandomorder.value += allmapidxs[i]+',';                      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 ((numchanges > 0) || (dosettings == 1)) {      if (doactions == 1) {
         if (numchanges > 0) {          if (numchanges > 0) {
             if ((cutwarnings > 0) || (remwarnings > 0)) {              if ((cutwarnings > 0) || (remwarnings > 0)) {
                 if (remwarnings > 0) {                  if (remwarnings > 0) {
Line 6065  function checkSubmits() { Line 6572  function checkSubmits() {
             }              }
             form.submit();              form.submit();
             return true;              return true;
         } else {          }
       }
       if (dosettings == 1) {
           if (haschanges == 1) {
             form.submit();              form.submit();
             return true;              return true;
         }          }
     }       }
       if ((dosettings == 1) && (doactions == 1)) {
           alert("$lt{'noor'}");
       } else {
           if (dosettings == 1) {
               alert("$lt{'noch'}");
           } else {
               alert("$lt{'noac'}");
           }
       }
     return false;      return false;
 }  }
   
Line 6183  ENDINJECT Line 6702  ENDINJECT
 sub dump_switchserver_js {  sub dump_switchserver_js {
     my @hosts = @_;      my @hosts = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         dump => 'Dumping to Authoring Space requires switching server.',          dump => 'Copying content to Authoring Space requires switching server.',
         swit => 'Switch server?',          swit => 'Switch server?',
         duco => 'Dump content to Authoring Space',          duco => 'Copying Content to Authoring Space',
         yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',          yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
         chos => 'Choose server',          chos => 'Choose server',
     );      );

Removed from v.1.542  
changed lines
  Added in v.1.583


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