Diff for /loncom/interface/londocs.pm between versions 1.484.2.85.2.3 and 1.554

version 1.484.2.85.2.3, 2020/07/19 14:25:35 version 1.554, 2013/07/17 14:18:36
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 Apache::loncourserespicker();  
 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 60  my $hashtied; Line 56  my $hashtied;
 my %alreadyseen=();  my %alreadyseen=();
   
 my $hadchanges;  my $hadchanges;
 my $suppchanges;  
   
   
 my %help=();  my %help=();
Line 84  sub storemap { Line 79  sub storemap {
       $map,1,$report);        $map,1,$report);
     if ($errtext) { return ($errtext,2); }      if ($errtext) { return ($errtext,2); }
   
     if ($map =~ /^default/) {      $hadchanges=1;
         $hadchanges=1;  
     } else {  
         $suppchanges=1;  
     }  
     return ($errtext,0);      return ($errtext,0);
 }  }
   
Line 140  sub clean { Line 131  sub clean {
     return $title;      return $title;
 }  }
   
 sub default_folderpath {  
     my ($coursenum,$coursedom,$navmapref) = @_;  
     return unless ($coursenum && $coursedom && ref($navmapref));  
 # Check if entire course is hidden and/or encrypted  
     my ($hiddenmap,$encryptmap,$folderpath,$hiddentop);  
     my $toplevel = "uploaded/$coursedom/$coursenum/default.sequence";  
     unless (ref($$navmapref)) {  
         $$navmapref = Apache::lonnavmaps::navmap->new();  
     }  
     if (ref($$navmapref)) {  
         if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.hiddenresource")) eq 'yes') {  
             my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };  
             my @resources = $$navmapref->retrieveResources($toplevel,$filterFunc,1,1);  
             unless (@resources) {  
                 $hiddenmap = 1;  
                 unless ($env{'request.role.adv'}) {  
                     $hiddentop = 1;  
                     if ($env{'form.folder'}) {  
                         undef($env{'form.folder'});  
                     }  
                 }  
             }  
         }  
         if (lc($$navmapref->get_mapparam(undef,$toplevel,"0.encrypturl")) eq 'yes') {  
             $encryptmap = 1;  
         }  
     }  
     unless ($hiddentop) {  
         $folderpath='default&'.&escape(&mt('Main Content')).  
                     '::'.$hiddenmap.':'.$encryptmap.'::';  
     }  
     if (wantarray) {  
         return ($folderpath,$hiddentop);  
     } else {  
         return $folderpath;  
     }  
 }  
   
 sub dumpcourse {  sub dumpcourse {
     my ($r) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my ($starthash,$js);      $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n".
     unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {                &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n");
         $js = <<"ENDJS";  
 <script type="text/javascript">  
 // <![CDATA[  
   
 function hide_searching() {  
     if (document.getElementById('searching')) {  
         document.getElementById('searching').style.display = 'none';  
     }  
     return;  
 }  
   
 // ]]>  
 </script>  
 ENDJS  
         $starthash = {  
                          add_entries => {'onload' => "hide_searching();"},  
                      };  
     }  
     $r->print(&Apache::loncommon::start_page('Copy '.$crstype.' Content to Authoring Space',$js,$starthash)."\n".  
               &Apache::lonhtmlcommon::breadcrumbs('Copy '.$crstype.' Content to Authoring Space')."\n");  
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     unless ($home) {      unless ($home) {
Line 221  ENDJS Line 156  ENDJS
  $r->print('<h3>'.&mt('Copying Files').'</h3>');   $r->print('<h3>'.&mt('Copying Files').'</h3>');
  my $title=$env{'form.authorfolder'};   my $title=$env{'form.authorfolder'};
  $title=&clean($title);   $title=&clean($title);
         my ($navmap,$errormsg) =   my %replacehash=();
             &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');   foreach my $key (keys(%env)) {
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      if ($key=~/^form\.namefor\_(.+)/) {
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};   $replacehash{$1}=$env{$key};
         my (%maps,%resources,%titles);      }
         if (!ref($navmap)) {   }
             $r->print($errormsg.  
                       &endContentScreen());  
             return '';  
         } else {  
             &Apache::loncourserespicker::enumerate_course_contents($navmap,\%maps,\%resources,\%titles,  
                                                                    'dumpdocs',$cdom,$cnum);  
         }  
         my @todump = &Apache::loncommon::get_env_multiple('form.archive');  
         my (%tocopy,%replacehash,%lookup,%deps,%display,%result,%depresult,%simpleproblems,%simplepages,  
             %newcontent,%has_simpleprobs);  
         foreach my $item (sort {$a <=> $b} (@todump)) {  
             my $name = $env{'form.namefor_'.$item};  
             if ($resources{$item}) {  
                 my ($map,$id,$res) = &Apache::lonnet::decode_symb($resources{$item});  
                 if ($res =~ m{^uploaded/$cdom/$cnum/\E((?:docs|supplemental)/.+)$}) {  
                     $tocopy{$1} = $name;  
                     $display{$item} = $1;  
                     $lookup{$1} = $item;  
                 } elsif ($res eq 'lib/templates/simpleproblem.problem') {  
                     $simpleproblems{$item} = {  
                                                 symb => $resources{$item},  
                                                 name => $name,  
                                              };  
                     $display{$item} = 'simpleproblem_'.$name;  
                     if ($map =~ m{^\Quploaded/$cdom/$cnum/\E(.+)$}) {  
                         $has_simpleprobs{$1}{$id} = $item;  
                     }  
                 } elsif ($res =~ m{^adm/$match_domain/$match_username/(\d+)/smppg}) {  
                     my $marker = $1;  
                     my $db_name = &Apache::lonsimplepage::get_db_name($res,$marker,$cdom,$cnum);  
                     $simplepages{$item} = {  
                                             res    => $res,  
                                             title  => $titles{$item},  
                                             db     => $db_name,  
                                             marker => $marker,  
                                             symb   => $resources{$item},  
                                             name   => $name,  
                                           };  
                     $display{$item} = '/'.$res;  
                 }  
             } elsif ($maps{$item}) {  
                 if ($maps{$item} =~ m{^\Quploaded/$cdom/$cnum/\E((?:default|supplemental)_\d+\.(?:sequence|page))$}) {  
                     $tocopy{$1} = $name;  
                     $display{$item} = $1;  
                     $lookup{$1} = $item;  
                 }  
             } else {  
                 next;  
             }  
         }  
  my $crs='/uploaded/'.$env{'request.course.id'}.'/';   my $crs='/uploaded/'.$env{'request.course.id'}.'/';
  $crs=~s/\_/\//g;   $crs=~s/\_/\//g;
         my $mm = new File::MMagic;   foreach my $item (keys(%replacehash)) {
         my $prefix = "/uploaded/$cdom/$cnum/";      my $newfilename=$title.'/'.$replacehash{$item};
         %replacehash = %tocopy;      $newfilename=~s/\.(\w+)$//;
         foreach my $item (sort(keys(%simpleproblems))) {      my $ext=$1;
             my $content = &Apache::imsexport::simpleproblem($simpleproblems{$item}{'symb'});      $newfilename=&clean($newfilename);
             $newcontent{$display{$item}} = $content;      $newfilename.='.'.$ext;
         }      my @dirs=split(/\//,$newfilename);
         my $gateway = Apache::lonhtmlgateway->new('web');      my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";
         foreach my $item (sort(keys(%simplepages))) {      my $makepath=$path;
             if (ref($simplepages{$item}) eq 'HASH') {      my $fail=0;
                 my $pagetitle = $simplepages{$item}{'title'};      for (my $i=0;$i<$#dirs;$i++) {
                 my %fields = &Apache::lonnet::dump($simplepages{$item}{'db'},$cdom,$cnum);   $makepath.='/'.$dirs[$i];
                 my %contents;   unless (-e $makepath) {
                 foreach my $field (keys(%fields)) {      unless(mkdir($makepath,0777)) { $fail=1; }
                     if ($field =~ /^(?:aaa|bbb|ccc)_(\w+)$/) {   }
                         my $name = $1;      }
                         my $msg = $fields{$field};      $r->print('<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ');
                         if ($name eq 'webreferences') {      if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
                             if ($msg =~ m{^https?://}) {   if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
                                 $contents{$name} = '<a href="'.$msg.'"><tt>'.$msg.'</tt></a>';      print $fh &Apache::lonclonecourse::rewritefile(
                             }           &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),
                         } else {       (%replacehash,$crs => '')
                             $msg = &Encode::decode('utf8',$msg);      );
                             $msg = $gateway->process_outgoing_html($msg,1);   } else {
                             $contents{$name} = $msg;      print $fh
                         }           &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);
                     } elsif ($field eq 'uploaded.photourl') {         }
                         my $marker = $simplepages{$item}{marker};   $fh->close();
                         if ($fields{$field} =~ m{^\Q$prefix\E(simplepage/$marker/.+)$}) {      } else {
                             my $filepath = $1;   $fail=1;
                             my ($relpath,$fname) = ($filepath =~ m{^(.+/)([^/]+)$});      }
                             if ($fname ne '') {      if ($fail) {
                                 $fname=~s/\.(\w+)$//;   $r->print('<span class="LC_error">'.&mt('fail').'</span>');
                                 my $ext=$1;      } else {
                                 $fname = &clean($fname);   $r->print('<span class="LC_success">'.&mt('ok').'</span>');
                                 $fname.='.'.$ext;      }
                                 $contents{image} = '<img src="'.$relpath.$fname.'" alt="Image" />';   }
                                 $replacehash{$filepath} = $relpath.$fname;  
                                 $deps{$item}{$filepath} = 1;  
                             }  
                         }  
                     }  
                 }  
                 $replacehash{'/'.$simplepages{$item}{'res'}} = $simplepages{$item}{'name'};  
                 $lookup{'/'.$simplepages{$item}{'res'}} = $item;  
                 my $content = '  
 <html>  
 <head>  
 <title>'.$pagetitle.'</title>  
 </head>  
 <body bgcolor="#ffffff">';  
                 if ($contents{title}) {  
                     $content .= "\n".'<h2>'.$contents{title}.'</h2>';  
                 }  
                 if ($contents{image}) {  
                     $content .= "\n".$contents{image};  
                 }  
                 if ($contents{content}) {  
                     $content .= '  
 <div class="LC_Box">  
 <h4 class="LC_hcell">'.&mt('Content').'</h4>'.  
 $contents{content}.'  
 </div>';  
                 }  
                 if ($contents{webreferences}) {  
                     $content .= '  
 <div class="LC_Box">  
 <h4 class="LC_hcell">'.&mt('Web References').'</h4>'.  
 $contents{webreferences}.'  
 </div>';  
                 }  
                 $content .= '  
 </body>  
 </html>  
 ';  
                 $newcontent{'/'.$simplepages{$item}{res}} = $content;  
             }  
         }  
         foreach my $item (keys(%tocopy)) {  
             unless ($item=~/\.(sequence|page)$/) {  
                 my $currurlpath = $prefix.$item;  
                 my $currdirpath = &Apache::lonnet::filelocation('',$currurlpath);  
                 &recurse_html($mm,$prefix,$currdirpath,$currurlpath,$item,$lookup{$item},\%replacehash,\%deps);  
             }  
         }  
         foreach my $num (sort {$a <=> $b} (@todump)) {  
             my $src = $display{$num};  
             next if ($src eq '');  
             my @needcopy = ();  
             if ($replacehash{$src}) {  
                 push(@needcopy,$src);  
                 if (ref($deps{$num}) eq 'HASH') {  
                     foreach my $dep (sort(keys(%{$deps{$num}}))) {  
                         if ($replacehash{$dep}) {  
                             push(@needcopy,$dep);  
                         }  
                     }  
                 }  
             } elsif ($src =~ /^simpleproblem_/) {  
                 push(@needcopy,$src);  
             }  
             next if (@needcopy == 0);  
             my ($result,$depresult);  
             for (my $i=0; $i<@needcopy; $i++) {  
                 my $item = $needcopy[$i];  
                 my $newfilename;  
                 if ($simpleproblems{$num}) {  
                     $newfilename=$title.'/'.$simpleproblems{$num}{'name'};  
                 } else {  
                     $newfilename=$title.'/'.$replacehash{$item};  
                 }  
                 $newfilename=~s/\.(\w+)$//;  
                my $ext=$1;  
                 $newfilename=&clean($newfilename);  
                 $newfilename.='.'.$ext;  
                 my ($newrelpath) = ($newfilename =~ m{^\Q$title/\E(.+)$});  
                 if ($newrelpath ne $replacehash{$item}) {  
                     $replacehash{$item} = $newrelpath;  
                 }  
                 my @dirs=split(/\//,$newfilename);  
                 my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca";  
                 my $makepath=$path;  
                 my $fail;  
                 my $origin;  
                 for (my $i=0;$i<$#dirs;$i++) {  
                     $makepath.='/'.$dirs[$i];  
                     unless (-e $makepath) {  
                         unless(mkdir($makepath,0755)) {  
                             $fail = &mt('Directory creation failed.');  
                         }  
                     }  
                 }  
                 if ($i == 0) {  
                     $result = '<br /><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt>: ';  
                 } else {  
                     $depresult .= '<li><tt>'.$item.'</tt> => <tt>'.$newfilename.'</tt> '.  
                                   '<span class="LC_fontsize_small" style="font-weight: bold;">'.  
                                   &mt('(dependency)').'</span>: ';  
                 }  
                 if (-e $path.'/'.$newfilename) {  
                     $fail = &mt('Destination already exists -- not overwriting.');  
                 } else {  
                     if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {  
                         if (($item =~ m{^/adm/$match_domain/$match_username/\d+/smppg}) ||  
                             ($item =~ /^simpleproblem_/)) {  
                             print $fh $newcontent{$item};  
                         } else {  
                             my $fileloc = &Apache::lonnet::filelocation('',$prefix.$item);  
                             if (-e $fileloc) {  
                                 if ($item=~/\.(sequence|page|html|htm|xml|xhtml)$/) {  
                                     if ((($1 eq 'sequence') || ($1 eq 'page')) &&  
                                         (ref($has_simpleprobs{$item}) eq 'HASH')) {  
                                         my %changes = %{$has_simpleprobs{$item}};  
                                         my $content = &Apache::lonclonecourse::rewritefile(  
                      &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),  
                                                       (%replacehash,$crs => '')  
                                                                                           );  
                                         my $updatedcontent = '';  
                                         my $parser = HTML::TokeParser->new(\$content);  
                                         $parser->attr_encoded(1);  
                                         while (my $token = $parser->get_token) {  
                                             if ($token->[0] eq 'S') {  
                                                 if (($token->[1] eq 'resource') &&  
                                                     ($token->[2]->{'src'} eq '/res/lib/templates/simpleproblem.problem') &&  
                                                     ($changes{$token->[2]->{'id'}})) {  
                                                     my $id = $token->[2]->{'id'};  
                                                     $updatedcontent .= '<'.$token->[1];  
                                                     foreach my $attrib (@{$token->[3]}) {  
                                                        next unless ($attrib =~ /^(src|type|title|id)$/);  
                                                         if ($attrib eq 'src') {  
                                                             my ($file) = ($display{$changes{$id}} =~ /^\Qsimpleproblem_\E(.+)$/);  
                                                             if ($file) {  
                                                                 $updatedcontent .= ' '.$attrib.'="'.$file.'"';  
                                                             } else {  
                                                                 $updatedcontent .= ' '.$attrib.'="'.$token->[2]->{$attrib}.'"';  
                                                             }  
                                                         } else {  
                                                             $updatedcontent .= ' '.$attrib.'="'.$token->[2]->{$attrib}.'"';  
                                                         }  
                                                     }  
                                                     $updatedcontent .= ' />'."\n";  
                                                 } else {  
                                                     $updatedcontent .= $token->[4]."\n";  
                                                 }  
                                              } else {  
                                                  $updatedcontent .= $token->[2];  
                                              }  
                                          }  
                                          print $fh $updatedcontent;  
                                     } else {  
                                         print $fh &Apache::lonclonecourse::rewritefile(  
                      &Apache::lonclonecourse::readfile($env{'request.course.id'},$item),  
                                                       (%replacehash,$crs => '')  
                                                                                       );  
                                     }  
                                 } else {  
                                     print $fh  
                                         &Apache::lonclonecourse::readfile($env{'request.course.id'},$item);  
                                 }  
                             } else {  
                                 $fail = &mt('Source does not exist.');  
                             }  
                         }  
                         $fh->close();  
                     } else {  
                         $fail = &mt('Could not write to destination.');  
                     }  
                 }  
                 my $text;  
                 if ($fail) {  
                     $text = '<span class="LC_error">'.&mt('fail').('&nbsp;'x3).$fail.'</span>';  
                 } else {  
                     $text = '<span class="LC_success">'.&mt('ok').'</span>';  
                 }  
                 if ($i == 0) {  
                     $result .= $text;  
                 } else {  
                     $depresult .= $text.'</li>';  
                 }  
             }  
             $r->print($result);  
             if ($depresult) {  
                 $r->print('<ul>'.$depresult.'</ul>');  
             }  
         }  
     } else {      } else {
         my ($navmap,$errormsg) =          $r->print(&mt('Searching ...').'<br />');
             &Apache::loncourserespicker::get_navmap_object($crstype,'dumpdocs');          $r->rflush();
         if (!ref($navmap)) {  # Input form
             $r->print($errormsg);          $r->print('<form name="dumpdoc" action="" method="post">'."\n");
         } else {   unless ($home==1) {
             $r->print('<div id="searching">'.&mt('Searching ...').'</div>');      $r->print('<div class="LC_left_float">'.
             $r->rflush();        '<fieldset><legend>'.
             my ($preamble,$formname);                        &mt('Select the Authoring Space').
             $formname = 'dumpdoc';                        '</legend><select name="authorspace">');
             unless ($home==1) {   }
                 $preamble = '<div class="LC_left_float">'.   foreach my $key (sort(keys(%outhash))) {
                             '<fieldset><legend>'.      if ($key=~/^home_(.+)$/) {
                             &mt('Select the Authoring Space').   if ($home==1) {
                             '</legend><select name="authorspace">';      $r->print(
             }    '<input type="hidden" name="authorspace" value="'.$1.'" />');
             my @orderspaces = ();   } else {
             foreach my $key (sort(keys(%outhash))) {      $r->print('<option value="'.$1.'">'.$1.' - '.
                 if ($key=~/^home_(.+)$/) {        &Apache::loncommon::plainname(split(/\:/,$1)).'</option>');
                     if ($1 eq $env{'user.name'}.':'.$env{'user.domain'}) {   }
                         unshift(@orderspaces,$1);      }
                     } else {   }
                         push(@orderspaces,$1);   unless ($home==1) {
                     }      $r->print('</select></fieldset></div>'."\n");
                 }   }
             }   my $title=$origcrsdata{'description'};
             if ($home>1) {   $title=~s/[\/\s]+/\_/gs;
                 $preamble .= '<option value="" selected="selected">'.&mt('Select').'</option>';   $title=&clean($title);
             }   $r->print('<div class="LC_left_float">'.
             foreach my $user (@orderspaces) {                    '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
                 if ($home==1) {                    '<input type="text" size="50" name="authorfolder" value="'.
                     $preamble .= '<input type="hidden" name="authorspace" value="'.$user.'" />';                    $title.'" />'.
                 } else {                    '</fieldset></div><br clear="all" />'."\n");
                     $preamble .= '<option value="'.$user.'">'.$user.' - '.   &tiehash();
                                  &Apache::loncommon::plainname(split(/\:/,$user)).'</option>';   $r->print('<h4>'.&mt('Filenames in Authoring Space').'</h4>'
                 }                   .&Apache::loncommon::start_data_table()
             }                   .&Apache::loncommon::start_data_table_header_row()
             unless ($home==1) {                   .'<th>'.&mt('Internal Filename').'</th>'
                 $preamble .= '</select></fieldset></div>'."\n";                   .'<th>'.&mt('Title').'</th>'
             }                   .'<th>'.&mt('Save as ...').'</th>'
             my $title=$origcrsdata{'description'};                   .&Apache::loncommon::end_data_table_header_row());
             $title=~s/[\/\s]+/\_/gs;   foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
             $title=&clean($title);      $r->print(&Apache::loncommon::start_data_table_row()
             $preamble .= '<div class="LC_left_float">'.                       .'<td>'.$file.'</td>');
                          '<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.      my ($ext)=($file=~/\.(\w+)$/);
                          '<input type="text" size="50" name="authorfolder" value="'.      my $title=$hash{'title_'.$hash{
                          $title.'" />'.   'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};
                          '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";      $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
             my %uploadedfiles;      if (!$title) {
             &tiehash();   $title=$file;
             foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {      } else {
                 my ($ext)=($file=~/\.(\w+)$/);   $title=~s|/|_|g;
 # FIXME Check supplemental here      }
                 my $title=$hash{'title_'.$hash{      $title=~s/\.(\w+)$//;
                                 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$file}};      $title=&clean($title);
                 if (!$title) {      $title.='.'.$ext;
                     $title=$file;      $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"
                 } else {                       .&Apache::loncommon::end_data_table_row());
                     $title=~s|/|_|g;   }
                 }   $r->print(&Apache::loncommon::end_data_table());
                 $title=~s/\.(\w+)$//;   &untiehash();
                 $title=&clean($title);   $r->print(
                 $title.='.'.$ext;    '<p><input type="submit" name="dumpcourse" value="'.&mt("Dump $crstype Content").'" /></p></form>');
 #           $r->print("\n<td><input type='text' size='60' name='namefor_".$file."' value='".$title."' /></td>"  
                 $uploadedfiles{$file} = $title;  
             }  
             &untiehash();  
             $r->print(&Apache::loncourserespicker::create_picker($navmap,'dumpdocs',$formname,$crstype,undef,  
                                                                  undef,undef,$preamble,$home,\%uploadedfiles));  
         }  
     }      }
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
 }  }
   
 sub recurse_html {  
     my ($mm,$prefix,$currdirpath,$currurlpath,$container,$item,$replacehash,$deps) = @_;  
     return unless ((ref($replacehash) eq 'HASH') && (ref($deps) eq 'HASH'));  
     my (%allfiles,%codebase);  
     if (&Apache::lonnet::extract_embedded_items($currdirpath,\%allfiles,\%codebase) eq 'ok') {  
         if (keys(%allfiles)) {  
             foreach my $dependency (keys(%allfiles)) {  
                 next if (($dependency =~ m{^/(res|adm)/}) || ($dependency =~ m{^https?://}));  
                 my ($depurl,$relfile,$newcontainer);  
                 if ($dependency =~ m{^/}) {  
                     if ($dependency =~ m{^\Q$currurlpath/\E(.+)$}) {  
                         $relfile = $1;  
                         if ($dependency =~ m{^\Q$prefix\E(.+)$}) {  
                             $newcontainer = $1;  
                             next if ($replacehash->{$newcontainer});  
                         }  
                         $depurl = $dependency;  
                     } else {  
                         next;  
                     }  
                 } else {  
                     $relfile = $dependency;  
                     $depurl = $currurlpath;  
                     $depurl =~ s{[^/]+$}{};   
                     $depurl .= $dependency;  
                     ($newcontainer) = ($depurl =~ m{^\Q$prefix\E(.+)$});  
                 }  
                 next if ($relfile eq '');  
                 my $newname = $replacehash->{$container};  
                 $newname =~ s{[^/]+$}{};  
                 $replacehash->{$newcontainer} = $newname.$relfile;  
                 $deps->{$item}{$newcontainer} = 1;  
                 my ($newurlpath) = ($depurl =~ m{^(.*)/[^/]+$});  
                 my $depfile = &Apache::lonnet::filelocation('',$depurl);  
                 my $type = $mm->checktype_filename($depfile);  
                 if ($type eq 'text/html') {  
                     &recurse_html($mm,$prefix,$depfile,$newurlpath,$newcontainer,$item,$replacehash,$deps);  
                 }  
             }  
         }  
     }  
     return;  
 }  
   
 sub group_import {  sub group_import {
     my ($coursenum, $coursedom, $folder, $container, $caller, $ltitoolsref, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
     my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,      my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
         %removeparam,$importuploaded,$fixuperrors);          %removeparam,$importuploaded,$fixuperrors);
     $allmaps = {};      $allmaps = {};
Line 652  sub group_import { Line 298  sub group_import {
             }              }
         }          }
  if ($url) {   if ($url) {
             if ($url =~ m{^(/adm/$coursedom/$coursenum/(\d+)/ext\.tool)\:?(.*)$}) {  
                 $url = $1;  
                 my $marker = $2;  
                 my $info = $3;  
                 my ($toolid,%toolhash,%toolsettings);  
                 my @extras = ('linktext','explanation','crslabel','crstitle');  
                 my @toolinfo = split(/:/,$info);  
                 if ($residx) {  
                     %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$coursedom,$coursenum);  
                     $toolid = $toolsettings{'id'};  
                 } else {  
                     $toolid = shift(@toolinfo);  
                 }  
                 $toolid =~ s/\D//g;  
                 ($toolhash{'target'},$toolhash{'width'},$toolhash{'height'},  
                  $toolhash{'linktext'},$toolhash{'explanation'},  
                  $toolhash{'crslabel'},$toolhash{'crstitle'}) = @toolinfo;  
                 foreach my $item (@extras) {  
                     $toolhash{$item} = &unescape($toolhash{$item});  
                 }  
                 if (ref($ltitoolsref) eq 'HASH') {  
                     my @deleted;  
                     if (ref($ltitoolsref->{$toolid}) eq 'HASH') {  
                         $toolhash{'id'} = $toolid;  
                         if (($toolhash{'target'} eq 'iframe') || ($toolhash{'target'} eq 'tab') ||  
                             ($toolhash{'target'} eq 'window')) {  
                             if ($toolhash{'target'} eq 'window') {  
                                 foreach my $item ('width','height') {  
                                     $toolhash{$item} =~ s/^\s+//;  
                                     $toolhash{$item} =~ s/\s+$//;  
                                     if ($toolhash{$item} =~ /\D/) {  
                                         delete($toolhash{$item});  
                                         if ($residx) {  
                                             if ($toolsettings{$item}) {  
                                                 push(@deleted,$item);  
                                             }  
                                         }  
                                     }  
                                 }  
                             }  
                         } elsif ($residx) {  
                             $toolhash{'target'} = $toolsettings{'target'};  
                             if ($toolhash{'target'} eq 'window') {  
                                 foreach my $item ('width','height') {  
                                     $toolhash{$item} = $toolsettings{$item};  
                                 }  
                             }  
                         } elsif (ref($ltitoolsref->{$toolid}->{'display'}) eq 'HASH') {  
                             $toolhash{'target'} = $ltitoolsref->{$toolid}->{'display'}->{'target'};  
                             if ($toolhash{'target'} eq 'window') {  
                                 $toolhash{'width'} = $ltitoolsref->{$toolid}->{'display'}->{'width'};  
                                 $toolhash{'height'} = $ltitoolsref->{$toolid}->{'display'}->{'height'};  
                             }  
                         }  
                         if ($toolhash{'target'} eq 'iframe') {  
                             foreach my $item ('width','height','linktext','explanation') {  
                                 delete($toolhash{$item});  
                                 if ($residx) {  
                                     if ($toolsettings{$item}) {  
                                         push(@deleted,$item);  
                                     }  
                                 }  
                             }  
                         } elsif ($toolhash{'target'} eq 'tab') {  
                             foreach my $item ('width','height') {  
                                 delete($toolhash{$item});  
                                 if ($residx) {  
                                     if ($toolsettings{$item}) {  
                                         push(@deleted,$item);  
                                     }  
                                 }  
                             }  
                         }  
                         if (ref($ltitoolsref->{$toolid}->{'crsconf'}) eq 'HASH') {  
                             foreach my $item ('label','title','linktext','explanation') {  
                                 my $crsitem;  
                                 if (($item eq 'label') || ($item eq 'title')) {  
                                     $crsitem = 'crs'.$item;  
                                 } else {  
                                     $crsitem = $item;  
                                 }  
                                 if ($ltitoolsref->{$toolid}->{'crsconf'}->{$item}) {  
                                     $toolhash{$crsitem} =~ s/^\s+//;  
                                     $toolhash{$crsitem} =~ s/\s+$//;  
                                     if ($toolhash{$crsitem} eq '') {  
                                         delete($toolhash{$crsitem});  
                                     }  
                                 } else {  
                                     delete($toolhash{$crsitem});  
                                 }  
                                 if (($residx) && (exists($toolsettings{$crsitem}))) {  
                                     unless (exists($toolhash{$crsitem})) {  
                                         push(@deleted,$crsitem);  
                                     }  
                                 }  
                             }  
                         }  
                         my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum);  
                         if ($putres eq 'ok') {  
                             if (@deleted) {  
                                 &Apache::lonnet::del('exttool_'.$marker,\@deleted,$coursedom,$coursenum);  
                             }  
                         }  
                     }  
                 }  
             }  
             if (($caller eq 'londocs') &&              if (($caller eq 'londocs') &&
                 ($folder =~ /^default/)) {                  ($folder =~ /^default/)) {
                 if (($url =~ /\.(page|sequence)$/) && (!$donechk)) {                  if (($url =~ /\.(page|sequence)$/) && (!$donechk)) {
Line 769  sub group_import { Line 309  sub group_import {
                     $donechk = 1;                      $donechk = 1;
                 }                  }
                 if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) {                  if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) {
                     &contained_map_check($url,$folder,$coursenum,$coursedom,\%removefrommap,                      &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                                          \%removeparam,\%addedmaps,\%hierarchy,\%titles,$allmaps);                                           \%addedmaps,\%hierarchy,\%titles,$allmaps);
                     $importuploaded = 1;                      $importuploaded = 1;
                 } elsif ($url =~ m{^/res/.+\.(page|sequence)$}) {                  } elsif ($url =~ m{^/res/.+\.(page|sequence)$}) {
                     next if ($allmaps->{$url});                      next if ($allmaps->{$url});
Line 795  sub group_import { Line 335  sub group_import {
                 } else {                  } else {
                     $fname =~ s/\W/_/g;                      $fname =~ s/\W/_/g;
                 }                  }
                 if (length($fname) > 15) {                  if (length($fname > 15)) {
                     $fname = substr($fname,0,14);                      $fname = substr($fname,0,14);
                 }                  }
                 my $initialtext = &mt('Replace with your own content.');                  my $initialtext = &mt('Replace with your own content.');
Line 810  $initialtext Line 350  $initialtext
 </html>  </html>
 END  END
                 $env{'form.output'}=$newhtml;                  $env{'form.output'}=$newhtml;
                 my $result =                  my $result = 
                     &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,                      &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
                                                           'output',                                                            'output',
                                                           "$filepath/$residx/$fname.html");                                                            "$filepath/$residx/$fname.html");
Line 835  END Line 375  END
                           removefrommap => \%removefrommap,                            removefrommap => \%removefrommap,
                           removeparam   => \%removeparam,                            removeparam   => \%removeparam,
                       );                        );
         my ($result,$msgsarray,$lockerror) =          my ($result,$msgsarray,$lockerror) = 
             &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);              &apply_fixups($folder,1,$coursedom,$coursenum,\%import_errors,\%updated);
         if (keys(%import_errors) > 0) {          if (keys(%import_errors) > 0) {
             $fixuperrors =              $fixuperrors =
Line 862  END Line 402  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 934  sub log_docs { Line 467  sub log_docs {
 }  }
   
 sub docs_change_log {  sub docs_change_log {
     my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit)=@_;      my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_;
     my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
     my $navmap;     
     my $js = '<script type="text/javascript">'."\n".      my $js = '<script type="text/javascript">'."\n".
              '// <![CDATA['."\n".               '// <![CDATA['."\n".
              &Apache::loncommon::display_filter_js('docslog')."\n".               &Apache::loncommon::display_filter_js('docslog')."\n".
              &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag,               &editing_js($env{'user.domain'},$env{'user.name'},$supplementalflag)."\n".
                          $coursedom,$coursenum,'',$canedit,'',\$navmap)."\n".  
              &history_tab_js()."\n".               &history_tab_js()."\n".
              &Apache::lonratedt::editscript('simple')."\n".               &Apache::lonratedt::editscript('simple')."\n".
              '// ]]>'."\n".               '// ]]>'."\n".
Line 957  sub docs_change_log { Line 488  sub docs_change_log {
     }      }
     my $folderpath=$env{'form.folderpath'};      my $folderpath=$env{'form.folderpath'};
     if ($folderpath eq '') {      if ($folderpath eq '') {
         $folderpath = &default_folderpath($coursenum,$coursedom,\$navmap);          $folderpath = 'default&'.&escape(&mt('Main Content').':::::');
     }      }
     undef($navmap);  
     $pathitem = '<input type="hidden" name="folderpath" value="'.      $pathitem = '<input type="hidden" name="folderpath" value="'.
                 &HTML::Entities::encode($folderpath,'<>&"').'" />';                  &HTML::Entities::encode($folderpath,'<>&"').'" />';
     my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";      my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
Line 1123  sub docs_change_log { Line 653  sub docs_change_log {
   
 sub update_paste_buffer {  sub update_paste_buffer {
     my ($coursenum,$coursedom,$folder) = @_;      my ($coursenum,$coursedom,$folder) = @_;
     my (@possibles,%removals,%cuts,$output);      my (@possibles,%removals,%cuts);
     if ($env{'form.multiremove'}) {      if ($env{'form.multiremove'}) {
         $env{'form.multiremove'} =~ s/,$//;          $env{'form.multiremove'} =~ s/,$//;
         map { $removals{$_} = 1; } split(/,/,$env{'form.multiremove'});          map { $removals{$_} = 1; } split(/,/,$env{'form.multiremove'});
Line 1166  sub update_paste_buffer { Line 696  sub update_paste_buffer {
 # Construct identifiers for current contents of user's paste buffer  # Construct identifiers for current contents of user's paste buffer
     if (@currpaste) {      if (@currpaste) {
         foreach my $suffix (@currpaste) {          foreach my $suffix (@currpaste) {
             my $cid = $env{'docs.markedcopy_crs_'.$suffix};               my $cid = $env{'docs.markedcopy_crs_'.$suffix};
             my $url = $env{'docs.markedcopy_url_'.$suffix};               my $url = $env{'docs.markedcopy_url_'.$suffix};
             my $mapidx = $env{'docs.markedcopy_map_'.$suffix};               if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&
             if (($cid =~ /^$match_domain(?:_)$match_courseid$/) &&                   ($url ne '')) {
                 ($url ne '')) {                   $pasteurls{$cid.'_'.$url};
                 if ($url eq '/res/lib/templates/simpleproblem.problem') {               }
                     $pasteurls{$cid.'_'.$mapidx} = 1;  
                 } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {  
                     $pasteurls{$url} = 1;  
                 } else {  
                     $pasteurls{$cid.'_'.$url} = 1;  
                 }  
             }  
         }          }
     }      }
   
 # Mark items for copying (skip any items already in user's paste buffer)  # Mark items for copying (skip any items already in user's paste buffer)
     my %addtoenv;      my %addtoenv;
                     
     my @pathitems = split(/\&/,$env{'form.folderpath'});  
     my @folderconf = split(/\:/,$pathitems[-1]);  
     my $ispage = $folderconf[5];  
   
     foreach my $item (@possibles) {      foreach my $item (@possibles) {
         my ($orderidx,$cmd) = split(/:/,$item);          my ($orderidx,$cmd) = split(/:/,$item);
         next if ($orderidx =~ /\D/);          next if ($orderidx =~ /\D/);
         next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove'));          next unless (($cmd eq 'cut') || ($cmd eq 'copy') || ($cmd eq 'remove'));
         my $mapidx = $folder.':'.$orderidx.':'.$ispage;  
         my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]);          my ($title,$url)=split(':',$LONCAPA::map::resources[$orderidx]);
         my %denied = &action_restrictions($coursenum,$coursedom,          my %denied = &action_restrictions($coursenum,$coursedom,
                                           &LONCAPA::map::qtescape($url),                                            &LONCAPA::map::qtescape($url),
                                           $env{'form.folderpath'},\%curr_groups);                                            $env{'form.folderpath'},\%curr_groups);
         next if ($denied{'copy'});          next if ($denied{'copy'});
         $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};          $url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
         if ($url eq '/res/lib/templates/simpleproblem.problem') {          next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));
             next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));  
         } elsif ($url =~ m{^/res/$match_domain/$match_username/}) {  
             next if (exists($pasteurls{$url}));  
         } else {  
             next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$url}));  
         }  
         my ($suffix,$errortxt,$locknotfreed) =          my ($suffix,$errortxt,$locknotfreed) =
             &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');              &new_timebased_suffix($env{'user.domain'},$env{'user.name'},'paste');
         if ($suffix ne '') {          push(@newpaste,$suffix);
             push(@newpaste,$suffix);          if ($locknotfreed) {
         } else {              return $locknotfreed;
             if ($locknotfreed) {              last;
                 return $locknotfreed;  
             }  
         }          }
         if (&is_supplemental_title($title)) {          if (&is_supplemental_title($title)) {
             &Apache::lonnet::appenv({'docs.markedcopy_supplemental_'.$suffix => $title});              &Apache::lonnet::appenv({'docs.markedcopy_supplemental_'.$suffix => $title});
Line 1225  sub update_paste_buffer { Line 735  sub update_paste_buffer {
         $addtoenv{'docs.markedcopy_url_'.$suffix}   = $url,          $addtoenv{'docs.markedcopy_url_'.$suffix}   = $url,
         $addtoenv{'docs.markedcopy_cmd_'.$suffix}   = $cmd,          $addtoenv{'docs.markedcopy_cmd_'.$suffix}   = $cmd,
         $addtoenv{'docs.markedcopy_crs_'.$suffix}   = $env{'request.course.id'};          $addtoenv{'docs.markedcopy_crs_'.$suffix}   = $env{'request.course.id'};
         $addtoenv{'docs.markedcopy_map_'.$suffix}   = $mapidx;   
         if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {          if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) {
             my $prefix = $1;              my $prefix = $1;
             my $subdir =$2;              my $subdir =$2;
Line 1233  sub update_paste_buffer { Line 743  sub update_paste_buffer {
                 $subdir = $prefix;                  $subdir = $prefix;
             }              }
             my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);              my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps);
             &contained_map_check($url,$folder,$coursenum,$coursedom,\%removefrommap,              &contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps,
                                  \%removeparam,\%addedmaps,\%hierarchy,\%titles,\%allmaps);                                   \%hierarchy,\%titles,\%allmaps);
             if (ref($hierarchy{$url}) eq 'HASH') {              if (ref($hierarchy{$url}) eq 'HASH') {
                 my ($nested,$nestednames);                  my ($nested,$nestednames);
                 &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames);                  &recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames);
Line 1248  sub update_paste_buffer { Line 758  sub update_paste_buffer {
                 }                  }
             }              }
         }          }
         if ($locknotfreed) {  
             $output = $locknotfreed;  
             last;  
         }  
     }      }
     if (@newpaste) {      if (@newpaste) {
         $addtoenv{'docs.markedcopies'} = join(',',(@currpaste,@newpaste));          $addtoenv{'docs.markedcopies'} = join(',',(@currpaste,@newpaste));
     }      }
     &Apache::lonnet::appenv(\%addtoenv);      &Apache::lonnet::appenv(\%addtoenv);
     delete($env{'form.markcopy'});      delete($env{'form.markcopy'});
     return $output;  
 }  }
   
 sub recurse_uploaded_maps {  sub recurse_uploaded_maps {
Line 1296  sub print_paste_buffer { Line 801  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) {
         next if ($suffix =~ /\D/);          next if ($suffix =~ /\D/);
         my $cid = $env{'docs.markedcopy_crs_'.$suffix};          my $cid = $env{'docs.markedcopy_crs_'.$suffix};
         my $url = $env{'docs.markedcopy_url_'.$suffix};          my $url = $env{'docs.markedcopy_url_'.$suffix};
         my $mapidx = $env{'docs.markedcopy_map_'.$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,$is_exttool);                  $canpaste,$nopaste,$othercrs,$areachange);
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];              my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
             if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {              if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?:&colon;|:))//} ) {
                 $is_external = 1;                  $is_external = 1;
             } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {  
                 $is_exttool = 1;  
             }              }
             if ($folder =~ /^supplemental/) {              if ($folder =~ /^supplemental/) {
                 $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});                  $canpaste = &supp_pasteable($env{'docs.markedcopy_url_'.$suffix});
Line 1331  sub print_paste_buffer { Line 831  sub print_paste_buffer {
                     if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {                      if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) {
                         $othercourse = 1;                          $othercourse = 1;
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {                          if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {
                             $othercrs = '<br />'.&mt('(from another course)');                              if ($canpaste) {
                                   $othercrs = '<br />'.&mt('(from another course)');
                               }
                         } else {                          } else {
                             $canpaste = 0;                              $canpaste = 0;
                             $nopaste = &mt('Paste from another course unavailable.');                               $nopaste = &mt('Paste from another course unavailable.'); 
Line 1345  sub print_paste_buffer { Line 847  sub print_paste_buffer {
                         }                          }
                         $is_uploaded_map = 1;                          $is_uploaded_map = 1;
                     }                      }
                 } elsif (($url =~ m{^/res/lib/templates/\w+\.problem$}) ||  
                          ($url =~ m{^/adm/($match_domain)/($match_username)/\d+/(bulletinboard|smppg|ext\.tool)$})) {  
                     if ($cid ne $env{'request.course.id'}) {  
                         my ($srcdom,$srcnum) = split(/_/,$cid);  
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {  
                             if (($is_exttool) && ($srcdom ne $coursedom)) {  
                                 $canpaste = 0;  
                                 $nopaste = &mt('Paste from another domain unavailable.');  
                             } else {  
                                 $othercrs = '<br />'.&mt('(from another course)');  
                             }  
                         } else {  
                             $canpaste = 0;  
                             $nopaste = &mt('Paste from another course unavailable.');  
                         }  
                     }  
                 }  
                 if ($canpaste) {  
                     push(@pasteable,$suffix);  
                 }                  }
             }              }
               if ($canpaste) {
                  push(@pasteable,$suffix);
               }
             my $buffer;              my $buffer;
             if ($is_external) {              if ($is_external) {
                 $buffer = &mt('External Resource').': '.                  $buffer = &mt('External Resource').': '.
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.                      &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}).' ('.
                     &LONCAPA::map::qtescape($url).')';                      &LONCAPA::map::qtescape($url).')';
             } elsif ($is_exttool) {  
                 $buffer = &mt('External Tool').': '.  
                     &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});  
             } else {              } else {
                 my $icon = &Apache::loncommon::icon($extension);                  my $icon = &Apache::loncommon::icon($extension);
                 if ($extension eq 'sequence' &&                  if ($extension eq 'sequence' &&
Line 1381  sub print_paste_buffer { Line 864  sub print_paste_buffer {
                     $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));                      $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
                     $icon .= '/navmap.folder.closed.gif';                      $icon .= '/navmap.folder.closed.gif';
                 }                  }
                 my $title = $env{'docs.markedcopy_title_'.$suffix};  
                 if ($title eq '') {  
                     ($title) = ($url =~ m{/([^/]+)$});  
                 }  
                 $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'.                  $buffer = '<img src="'.$icon.'" alt="" class="LC_icon" />'.
                           ': '.                            ': '.
                           &Apache::loncommon::parse_supplemental_title(                            &Apache::loncommon::parse_supplemental_title(
                              &LONCAPA::map::qtescape($title));                               &LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix}));
             }              }
             $pasteitems .= '<div class="LC_left_float">';              $pasteitems .= '<div class="LC_left_float">';
             my ($options,$onclick);              my ($options,$onclick);
Line 1423  sub print_paste_buffer { Line 902  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) {
             my $value = &mt('Paste to current folder');              $buttons = '<input type="submit" name="pastemarked" value="'.&mt('Paste selected').'" />'.('&nbsp;'x2);
             if ($container eq 'page') {  
                 $value = &mt('Paste to current page');  
             }  
             $buttons = '<input type="submit" name="pastemarked" value="'.$value.'" />'.('&nbsp;'x2);  
         }  
         $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Remove from clipboard').'" />'.('&nbsp;'x2);  
         if ($clipboardcount > 1) {  
             $buttons .=  
                 '<span style="text-decoration:line-through">'.('&nbsp;'x20).'</span>'.('&nbsp;'x2).  
                 '<input type="button" name="checkallclip" value="'.&mt('Check all').'" style="height:20px;" onclick="checkClipboard();" />'.  
                 ('&nbsp;'x2).  
                 '<input type="button" name="uncheckallclip" value="'.&mt('Uncheck all').'" style="height:20px;" onclick="uncheckClipboard();" />'.  
                 ('&nbsp;'x2);  
         }          }
         $form_end = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'.          $buttons .= '<input type="submit" name="clearmarked" value="'.&mt('Clear selected').'" />'.
                     '</form>';                      '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />';
           $form_end = '</form>';
     } else {      } else {
         $pasteitems = &mt('Clipboard is empty');          $pasteitems = &mt('Clipboard is empty');
     }      }
Line 1530  sub supp_pasteable { Line 997  sub supp_pasteable {
         (($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) ||          (($url =~ /\.sequence$/) && ($url =~ m{^/uploaded/})) ||
         ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) ||          ($url =~ m{^/uploaded/$match_domain/$match_courseid/(docs|supplemental)/(default|\d+)/\d+/}) ||
         ($url =~ m{^/adm/$match_domain/$match_username/aboutme}) ||          ($url =~ m{^/adm/$match_domain/$match_username/aboutme}) ||
         ($url =~ m{^/public/$match_domain/$match_courseid/syllabus}) ||          ($url =~ m{^/public/$match_domain/$match_courseid/syllabus})) {
         ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$})) {  
         return 1;          return 1;
     }      }
     return;      return;
 }  }
   
 sub paste_popup_js {  sub paste_popup_js {
     my %html_js_lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           show => 'Show Options',                                            show => 'Show Options',
                                           hide => 'Hide Options',                                            hide => 'Hide Options',
                                         );  
     my %js_lt = &Apache::lonlocal::texthash(  
                                           none => 'No items selected from clipboard.',                                            none => 'No items selected from clipboard.',
                                         );                                          );
     &html_escape(\%html_js_lt);  
     &js_escape(\%html_js_lt);  
     &js_escape(\%js_lt);  
     return <<"END";      return <<"END";
   
 function showPasteOptions(suffix) {  function showPasteOptions(suffix) {
     document.getElementById('pasteoptions_'+suffix).style.display='block';      document.getElementById('pasteoptions_'+suffix).style.display='block';
     document.getElementById('pasteoptionstext_'+suffix).innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:hidePasteOptions(\\''+suffix+'\\');" class="LC_menubuttons_link">$html_js_lt{'hide'}</a>';      document.getElementById('pasteoptionstext_'+suffix).innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:hidePasteOptions(\\''+suffix+'\\');" class="LC_menubuttons_link">$lt{'hide'}</a>';
     return;      return;
 }  }
   
 function hidePasteOptions(suffix) {  function hidePasteOptions(suffix) {
     document.getElementById('pasteoptions_'+suffix).style.display='none';      document.getElementById('pasteoptions_'+suffix).style.display='none';
     document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$html_js_lt{'show'}</a>';      document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$lt{'show'}</a>';
     return;      return;
 }  }
   
 function showOptions(caller,suffix) {  function showOptions(caller,suffix) {
     if (document.getElementById('pasteoptionstext_'+suffix)) {      if (document.getElementById('pasteoptionstext_'+suffix)) {
         if (caller.checked) {          if (caller.checked) {
             document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$html_js_lt{'show'}</a>';              document.getElementById('pasteoptionstext_'+suffix).innerHTML ='&nbsp;&nbsp;&nbsp;&nbsp;<a href="javascript:showPasteOptions(\\''+suffix+'\\')" class="LC_menubuttons_link">$lt{'show'}</a>';
         } else {          } else {
             document.getElementById('pasteoptionstext_'+suffix).innerHTML ='';              document.getElementById('pasteoptionstext_'+suffix).innerHTML ='';
         }          }
Line 1594  function validateClipboard() { Line 1055  function validateClipboard() {
     if (numchk > 0) {       if (numchk > 0) { 
         return true;          return true;
     } else {      } else {
         alert("$js_lt{'none'}");          alert("$lt{'none'}");
         return false;          return false;
     }      }
 }  }
   
 function checkClipboard() {  
     if (document.pasteform.pasting.length > 1) {  
         for (var i=0; i<document.pasteform.pasting.length; i++) {  
             document.pasteform.pasting[i].checked = true;  
         }  
     }  
     return;  
 }  
   
 function uncheckClipboard() {  
     if (document.pasteform.pasting.length >1) {  
         for (var i=0; i<document.pasteform.pasting.length; i++) {  
             document.pasteform.pasting[i].checked = false;  
         }  
     }  
     return;  
 }  
   
 END  END
   
 }  }
Line 1653  sub do_paste_from_buffer { Line 1096  sub do_paste_from_buffer {
         return();          return();
     }      }
   
     my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom,%duplicate,      my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,
         %prefixchg,%srcdom,%srcnum,%srcmapidx,%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});
         my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});  
         my $mapidx=&LONCAPA::map::qtescape($env{'docs.markedcopy_map_'.$suffix});    
 # Supplemental content may only include certain types of content  # Supplemental content may only include certain types of content
 # Early out if pasted content is not supported in Supplemental area  # Early out if pasted content is not supported in Supplemental area
         if ($folder =~ /^supplemental/) {          if ($folder =~ /^supplemental/) {
Line 1681  sub do_paste_from_buffer { Line 1123  sub do_paste_from_buffer {
             }              }
             $srcdom{$suffix} = $srcd;              $srcdom{$suffix} = $srcd;
             $srcnum{$suffix} = $srcn;              $srcnum{$suffix} = $srcn;
         } elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) {  
             my ($srcd,$srcn) = split(/_/,$cid);  
 # When paste buffer was populated using an active role in a different course  
 # check for mdc privilege in the course from which the resource was pasted  
             if (($srcd ne $coursedom) || ($srcn ne $coursenum)) {  
                 unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {  
                     $notincrs{$suffix} = 1;  
                     next;  
                 }  
             }  
 # When buffer was populated using an active role in a different course  
 # disallow pasting of External Tool if course is in a different domain.  
             if ($srcd ne $coursedom) {  
                 $notindom{$suffix} = 1;  
                 next;  
             }  
             $srcdom{$suffix} = $srcd;  
             $srcnum{$suffix} = $srcn;  
         } elsif (($url =~ m{^/res/lib/templates/\w+\.problem$}) ||  
                  ($url =~ m{^/adm/$match_domain/$match_username/\d+/(bulletinboard|smppg)$})) {  
             my ($srcd,$srcn) = split(/_/,$cid);  
 # When paste buffer was populated using an active role in a different course  
 # check for mdc privilege in the course from which the resource was pasted  
             if (($srcd ne $coursedom) || ($srcn ne $coursenum)) {  
                 unless ($env{"user.priv.cm./$srcd/$srcn"} =~ /\Q:mdc&F\E/) {  
                     $notincrs{$suffix} = 1;  
                     next;  
                 }  
             }  
             $srcdom{$suffix} = $srcd;  
             $srcnum{$suffix} = $srcn;  
         }          }
         $srcmapidx{$suffix} = $mapidx;   
         push(@dopaste,$suffix);          push(@dopaste,$suffix);
         if ($url=~/\.(page|sequence)$/) {          if ($url=~/\.(page|sequence)$/) {
             $is_map{$suffix} = 1;               $is_map{$suffix} = 1; 
Line 1723  sub do_paste_from_buffer { Line 1134  sub do_paste_from_buffer {
             my $oldprefix = $1;              my $oldprefix = $1;
 # When pasting content from Main Content to Supplemental Content and vice versa   # When pasting content from Main Content to Supplemental Content and vice versa 
 # URLs will contain different paths (which depend on whether pasted item is  # URLs will contain different paths (which depend on whether pasted item is
 # a folder/page or a document).     # a folder/page or a document.   
             if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {              if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) {
                 $prefixchg{$suffix} = 'docstosupp';                  $prefixchg{$suffix} = 'docstosupp';
             } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {              } elsif (($folder =~ /^default/) && ($oldprefix =~ /^supplemental/)) {
Line 1763  sub do_paste_from_buffer { Line 1174  sub do_paste_from_buffer {
     %msgs = &Apache::lonlocal::texthash (      %msgs = &Apache::lonlocal::texthash (
                 notinsupp => 'Paste failed: content type is not supported within Supplemental Content',                  notinsupp => 'Paste failed: content type is not supported within Supplemental Content',
                 notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',                  notincrs  => 'Paste failed: Item is from a different course which you do not have rights to edit.',
                 notindom  => 'Paste failed: Item is an external tool from a course in a different donain.',  
                 duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',                  duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.',
             );              );
   
Line 1792  sub do_paste_from_buffer { Line 1202  sub do_paste_from_buffer {
 # Retrieve information about all course maps in main content area   # Retrieve information about all course maps in main content area 
   
     my $allmaps = {};      my $allmaps = {};
     my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk);      if ($folder =~ /^default/) {
           $allmaps =
               &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,
                                                    $env{"course.$env{'request.course.id'}.home"},
                                                    $env{'request.course.id'});
       }
   
       my (@toclear,%mapurls,%lockerrs,%msgerrs,%results);
   
 # Loop over the items to paste  # Loop over the items to paste
     foreach my $suffix (@dopaste) {      foreach my $suffix (@dopaste) {
 # Maps need to be copied first  # Maps need to be copied first
         my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,          my (%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies,
             %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir,              %dbcopies,%zombies,%params,%docmoves,%mapmoves,%mapchanges,%newsubdir,
             %newurls,%tomove,%resdatacopy);              %newurls,%tomove);
         if (ref($marktomove{$suffix}) eq 'ARRAY') {          if (ref($marktomove{$suffix}) eq 'ARRAY') {
             map { $tomove{$_} = 1; } @{$marktomove{$suffix}};              map { $tomove{$_} = 1; } @{$marktomove{$suffix}};
         }          }
         my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});          my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix});
         my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});          my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title_'.$suffix});
         my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix});  
         my $oldurl = $url;          my $oldurl = $url;
         if ($is_map{$suffix}) {          if ($is_map{$suffix}) {
 # If pasting a map, check if map contains other maps  # If pasting a map, check if map contains other maps
             my (%hierarchy,%titles);              my (%hierarchy,%titles);
             if (($folder =~ /^default/) && (!$donechk)) {              &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                 $allmaps =                                   \%addedmaps,\%hierarchy,\%titles,$allmaps);
                     &Apache::loncommon::allmaps_incourse($coursedom,$coursenum,  
                                                          $env{"course.$env{'request.course.id'}.home"},  
                                                          $env{'request.course.id'});  
                 $donechk = 1;   
             }  
             &contained_map_check($url,$folder,$coursenum,$coursedom,  
                                  \%removefrommap,\%removeparam,\%addedmaps,  
                                  \%hierarchy,\%titles,$allmaps);  
             if ($url=~ m{^/uploaded/}) {              if ($url=~ m{^/uploaded/}) {
                 my $newurl;                  my $newurl;
                 unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {                  unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
Line 1849  sub do_paste_from_buffer { Line 1257  sub do_paste_from_buffer {
                                               \%retitles,\%copies,\%dbcopies,                                                \%retitles,\%copies,\%dbcopies,
                                               \%zombies,\%params,\%mapmoves,                                                \%zombies,\%params,\%mapmoves,
                                               \%mapchanges,\%tomove,\%newsubdir,                                                \%mapchanges,\%tomove,\%newsubdir,
                                               \%newurls,\%resdatacopy)) {                                                \%newurls)) {
                         $mapmoves{$url} = 1;                          $mapmoves{$url} = 1;
                     }                      }
                     $url = $newurl;                      $url = $newurl;
Line 1858  sub do_paste_from_buffer { Line 1266  sub do_paste_from_buffer {
                                       $coursenum,$srcdom{$suffix},$srcnum{$suffix},                                        $coursenum,$srcdom{$suffix},$srcnum{$suffix},
                                       $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,                                        $allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies,
                                       \%zombies,\%params,\%mapmoves,\%mapchanges,                                        \%zombies,\%params,\%mapmoves,\%mapchanges,
                                       \%tomove,\%newsubdir,\%newurls,\%resdatacopy);                                         \%tomove,\%newsubdir,\%newurls); 
                 }                  }
             } elsif ($url=~m {^/res/}) {              } elsif ($url=~m {^/res/}) {
 # published map can only exist once, so remove from paste buffer when done  # published map can only exists once, so remove from paste buffer when done
                 push(@toclear,$suffix);                  push(@toclear,$suffix);
 # if pasting published map (main content area only) check map not already in course  # if pasting published map (main content area only) check map not already in course
                 if ($folder =~ /^default/) {                  if ($folder =~ /^default/) {
Line 1872  sub do_paste_from_buffer { Line 1280  sub do_paste_from_buffer {
                 }                  }
             }              }
         }          }
         if ($url=~ m{/(bulletinboard|smppg|ext\.tool)$}) {          if ($url=~ m{/(bulletinboard|smppg)$}) {
             my $prefix = $1;              my $prefix = $1;
             my $fromothercrs;  
             #need to copy the db contents to a new one, unless this is a move.              #need to copy the db contents to a new one, unless this is a move.
             my %info = (              my %info = (
                          src  => $url,                           src  => $url,
                          cdom => $coursedom,                           cdom => $coursedom,
                          cnum => $coursenum,                           cnum => $coursenum,
                        );              );
             if (($srcdom{$suffix} =~ /^$match_domain$/) && ($srcnum{$suffix} =~ /^$match_courseid$/)) {              unless ($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') {
                 unless (($srcdom{$suffix} eq $coursedom) && ($srcnum{$suffix} eq $coursenum)) {  
                     $fromothercrs = 1;  
                     $info{'cdom'} = $srcdom{$suffix};  
                     $info{'cnum'} = $srcnum{$suffix};  
                 }  
             }  
             unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) {  
                 my (%lockerr,$msg);                   my (%lockerr,$msg); 
                 my ($newurl,$result,$errtext) =                  my ($newurl,$result,$errtext) =
                     &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);                      &dbcopy(\%info,$coursedom,$coursenum,\%lockerr);
Line 1899  sub do_paste_from_buffer { Line 1299  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 discussion board.').' '.$errtext;                          $msg = &mt('Paste failed: An error occurred when copying the bulletin board.').' '.$errtext;
                     } elsif ($prefix eq 'ext.tool') {  
                         $msg = &mt('Paste failed: An error occurred when copying the external tool.').' '.$errtext;  
                     }                      }
                     $results{$suffix} = $result;                      $results{$suffix} = $result;
                     $msgerrs{$suffix} = $msg;                      $msgerrs{$suffix} = $msg;
Line 1909  sub do_paste_from_buffer { Line 1307  sub do_paste_from_buffer {
                     next;                      next;
         }          }
                 if ($lockerr{$prefix}) {                  if ($lockerr{$prefix}) {
                     $lockerrs{$suffix} = $lockerr{$prefix};                      $lockerrs{$suffix} = $lockerr{$prefix};  
                 }                  }
             }              }
         }          }
Line 1948  sub do_paste_from_buffer { Line 1346  sub do_paste_from_buffer {
                     if ($newdocsdir eq '') {                      if ($newdocsdir eq '') {
                         $newdocsdir = 'default';                          $newdocsdir = 'default';
                     }                      }
                     if (($prefixchg{$suffix}) ||                      if (($prefixchg{$suffix}) || 
                         ($srcdom{$suffix} ne $coursedom) ||                           ($srcdom{$suffix} ne $coursedom) || 
                         ($srcnum{$suffix} ne $coursenum) ||                          ($srcnum{$suffix} ne $coursenum) ||
                         ($env{'form.docs.markedcopy_options_'.$suffix} ne 'move')) {                          ($env{'form.docs.markedcopy_options_'.$suffix} ne 'move')) {
Line 1966  sub do_paste_from_buffer { Line 1364  sub do_paste_from_buffer {
                         }                          }
                     }                      }
                 }                  }
             } elsif ($url =~ m{^/res/lib/templates/(\w+)\.problem$}) {  
                 my $template = $1;  
                 if ($newidx) {  
                     &copy_templated_files($url,$srcdom{$suffix},$srcnum{$suffix},$srcmapidx{$suffix},  
                                           $coursedom,$coursenum,$template,$newidx,"$folder.$container");  
                 }  
             }              }
             $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url).              $LONCAPA::map::resources[$newidx]=$title.':'.&LONCAPA::map::qtunescape($url).
                                               ':'.$ext.':normal:res';                                                ':'.$ext.':normal:res';
Line 1985  sub do_paste_from_buffer { Line 1377  sub do_paste_from_buffer {
             }              }
         }          }
   
 # Apply any changes to maps, or copy dependencies for uploaded HTML pages, or update   # Apply any changes to maps, or copy dependencies for uploaded HTML pages 
 # resourcedata for simpleproblems copied from another course  
         unless ($allresult eq 'fail') {          unless ($allresult eq 'fail') {
             my %updated = (              my %updated = (
                             rewrites      => \%rewrites,                              rewrites      => \%rewrites,
Line 1994  sub do_paste_from_buffer { Line 1385  sub do_paste_from_buffer {
                             removefrommap => \%removefrommap,                              removefrommap => \%removefrommap,
                             removeparam   => \%removeparam,                              removeparam   => \%removeparam,
                             dbcopies      => \%dbcopies,                              dbcopies      => \%dbcopies,
                             resdatacopy   => \%resdatacopy,  
                             retitles      => \%retitles,                              retitles      => \%retitles,
                           );                            );
             my %info = (              my %info = (
Line 2159  sub get_newmap_url { Line 1549  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'};
     if (ref($dbref) eq 'HASH') {      if (ref($dbref) eq 'HASH') {
         $url = $dbref->{'src'};          if ($url =~ m{/(smppg|bulletinboard)$}) {
         if ($url =~ m{/(smppg|bulletinboard|ext\.tool)$}) {  
             my $prefix = $1;              my $prefix = $1;
             if ($prefix eq 'ext.tool') {              if (($dbref->{'cdom'} =~ /^$match_domain$/) && 
                 $prefix = 'exttool';  
             }  
             if (($dbref->{'cdom'} =~ /^$match_domain$/) &&  
                 ($dbref->{'cnum'} =~ /^$match_courseid$/)) {                  ($dbref->{'cnum'} =~ /^$match_courseid$/)) {
                 my $db_name;                  my $db_name;
                 my $marker = (split(m{/},$url))[4];                  my $marker = (split(m{/},$url))[4];
Line 2176  sub dbcopy { Line 1563  sub dbcopy {
                         &Apache::lonsimplepage::get_db_name($url,$marker,                          &Apache::lonsimplepage::get_db_name($url,$marker,
                                                             $dbref->{'cdom'},                                                              $dbref->{'cdom'},
                                                             $dbref->{'cnum'});                                                              $dbref->{'cnum'});
                 } elsif ($dbref->{'src'} =~ m{/ext\.tool$}) {  
                     $db_name = 'exttool_'.$marker;  
                 } else {                  } else {
                     $db_name = 'bulletinpage_'.$marker;                      $db_name = 'bulletinpage_'.$marker;
                 }                  }
Line 2188  sub dbcopy { Line 1573  sub dbcopy {
                 if (!$suffix) {                  if (!$suffix) {
                     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);
                     } elsif ($prefix eq 'exttool') {  
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying an external tool [_1].',$url);  
                     } else {                      } else {
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a discussion board [_1].',$url);                          $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a bulletin board [_1].',$url);
                     }                      }
                     if ($error) {                      if ($error) {
                         $errtext .= '<br />'.$error;                          $errtext .= '<br />'.$error;
Line 2205  sub dbcopy { Line 1588  sub dbcopy {
                         my $photo = $contents{'uploaded.photourl'};                          my $photo = $contents{'uploaded.photourl'};
                         my ($subdir,$fname) =                          my ($subdir,$fname) =
                             ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$});                              ($photo =~ m{^/uploaded/$match_domain/$match_courseid/+(bulletin|simplepage)/(?:|\d+/)([^/]+)$});
                         my $newphoto;                          my $newphoto; 
                         if ($fname ne '') {                          if ($fname ne '') {
                             my $content = &Apache::lonnet::getfile($photo);                              my $content = &Apache::lonnet::getfile($photo);
                             unless ($content eq '-1') {                              unless ($content eq '-1') {
                                 $env{'form.'.$suffix.'.photourl'} = $content;                                  $env{'form.'.$suffix.'.photourl'} = $content;
                                 $newphoto =                                  $newphoto = 
                                     &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname");                                      &Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.photourl',"$subdir/$suffix/$fname");
                                 delete($env{'form.'.$suffix.'.photourl'});                                  delete($env{'form.'.$suffix.'.photourl'});
                             }                              }
Line 2223  sub dbcopy { Line 1606  sub dbcopy {
                     $result=&Apache::lonnet::put($db_name,\%contents,                      $result=&Apache::lonnet::put($db_name,\%contents,
                                                  $coursedom,$coursenum);                                                   $coursedom,$coursenum);
                     if ($result eq 'ok') {                      if ($result eq 'ok') {
                         $url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x;                          $url =~ s{/(\d*)/(smppg|bulletinboard)$}{/$suffix/$2}x;
                     }                      }
                 }                  }
                 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.');
                     } elsif ($prefix eq 'exttool') {  
                         $lockerrorsref->{$prefix} .=  
                             ' '.&mt('This will prevent addition of more external tools to this course.');  
                     } else {                      } else {
                         $lockerrorsref->{$prefix} .= ' '.&mt('This will prevent creation of additional discussion boards in this course.');                          $lockerrorsref->{$prefix} .= &mt('This will prevent creation of additional bulletin boards in this course.');
                     }                      }
                     $lockerrorsref->{$prefix} .= ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.',                      $lockerrorsref->{$prefix} .= &mt('Please contact the domain coordinator for your LON-CAPA domain.').'</div>';
                                                      '<a href="/adm/helpdesk" target="_helpdesk">','</a>').  
                                                  '</div>';  
                 }                  }
             }              }
         } elsif ($url =~ m{/syllabus$}) {          } elsif ($url =~ m{/syllabus$}) {
Line 2261  sub dbcopy { Line 1639  sub dbcopy {
     return ($url,$result,$errtext);      return ($url,$result,$errtext);
 }  }
   
 sub copy_templated_files {  
     my ($srcurl,$srcdom,$srcnum,$srcmapinfo,$coursedom,$coursenum,$template,$newidx,$newmapname) = @_;  
     my ($srcfolder,$srcid,$srcwaspage) = split(/:/,$srcmapinfo);  
     my $srccontainer = 'sequence';  
     if ($srcwaspage) {  
         $srccontainer = 'page';  
     }  
     my $srcsymb = "uploaded/$srcdom/$srcnum/$srcfolder.$srccontainer".  
                   '___'.$srcid.'___'.&Apache::lonnet::declutter($srcurl);  
     my $srcprefix = $srcdom.'_'.$srcnum.'.'.$srcsymb;  
     my %srcparms=&Apache::lonnet::dump('resourcedata',$srcdom,$srcnum,$srcprefix);  
     my $newsymb = "uploaded/$coursedom/$coursenum/$newmapname".'___'.$newidx.'___lib/templates/'.  
                   $template.'.problem';  
     my $newprefix = $coursedom.'_'.$coursenum.'.'.$newsymb;  
     if ($template eq 'simpleproblem') {  
         $srcprefix .= '.0.';  
         my $weightprefix = $newprefix;  
         $newprefix .= '.0.';  
         my @simpleprobqtypes = qw(radio option string essay numerical);  
         my $qtype=$srcparms{$srcprefix.'questiontype'};  
         if (grep(/^\Q$qtype\E$/,@simpleprobqtypes)) {  
             my %newdata = (  
                 $newprefix.'questiontype' => $qtype,  
             );  
             foreach my $type (@simpleprobqtypes) {  
                 if ($type eq $qtype) {  
                     $newdata{"$weightprefix.$type.weight"}=1;  
                 } else {  
                     $newdata{"$weightprefix.$type.weight"}=0;  
                 }  
             }  
             $newdata{$newprefix.'hiddenparts'} = '!'.$qtype;  
             $newdata{$newprefix.'questiontext'} = $srcparms{$srcprefix.'questiontext'};  
             $newdata{$newprefix.'hinttext'} = $srcparms{$srcprefix.'hinttext'};  
             if ($qtype eq 'numerical') {  
                 $newdata{$newprefix.'numericalscript'} = $srcparms{$srcprefix.'numericalscript'};  
                 $newdata{$newprefix.'numericalanswer'} = $srcparms{$srcprefix.'numericalanswer'};  
                 $newdata{$newprefix.'numericaltolerance'} = $srcparms{$srcprefix.'numericaltolerance'};  
                 $newdata{$newprefix.'numericalsigfigs'} = $srcparms{$srcprefix.'numericalsigfigs'};  
             } elsif (($qtype eq 'option') || ($qtype eq 'radio')) {  
                 my $maxfoils=$srcparms{$srcprefix.'maxfoils'};  
                 unless (defined($maxfoils)) { $maxfoils=10; }  
                     unless ($maxfoils=~/^\d+$/) { $maxfoils=10; }  
                         if ($maxfoils<=0) { $maxfoils=10; }  
                             my $randomize=$srcparms{$srcprefix.'randomize'};  
                             unless (defined($randomize)) { $randomize='yes'; }  
                             unless ($randomize eq 'no') { $randomize='yes'; }  
                             $newdata{$newprefix.'maxfoils'} = $maxfoils;  
                             $newdata{$newprefix.'randomize'} = $randomize;  
                             if ($qtype eq 'option') {  
                                 $newdata{$newprefix.'options'} = $srcparms{$srcprefix.'options'};  
                             }  
                             for (my $i=1; $i<=10; $i++) {  
                                 $newdata{$newprefix.'value'.$i} = $srcparms{$srcprefix.'value'.$i};  
                                 $newdata{$newprefix.'position'.$i} = $srcparms{$srcprefix.'position'.$i};  
                                 $newdata{$newprefix.'text'.$i} = $srcparms{$srcprefix.'text'.$i};  
                             }  
   
             } elsif (($qtype eq 'option') || ($qtype eq 'radio')) {  
                 my $maxfoils=$srcparms{$srcprefix.'maxfoils'};  
                 unless (defined($maxfoils)) { $maxfoils=10; }  
                 unless ($maxfoils=~/^\d+$/) { $maxfoils=10; }  
                 if ($maxfoils<=0) { $maxfoils=10; }  
                 my $randomize=$srcparms{$srcprefix.'randomize'};  
                 unless (defined($randomize)) { $randomize='yes'; }  
                 unless ($randomize eq 'no') { $randomize='yes'; }  
                 $newdata{$newprefix.'maxfoils'} = $maxfoils;  
                 $newdata{$newprefix.'randomize'} = $randomize;  
                 if ($qtype eq 'option') {  
                     $newdata{$newprefix.'options'} = $srcparms{$srcprefix.'options'};  
                 }  
                 for (my $i=1; $i<=10; $i++) {  
                     $newdata{$newprefix.'value'.$i} = $srcparms{$srcprefix.'value'.$i};  
                     $newdata{$newprefix.'position'.$i} = $srcparms{$srcprefix.'position'.$i};  
                     $newdata{$newprefix.'text'.$i} = $srcparms{$srcprefix.'text'.$i};  
                 }  
             } elsif ($qtype eq 'string') {  
                 $newdata{$newprefix.'stringanswer'} = $srcparms{$srcprefix.'stringanswer'};  
                 $newdata{$newprefix.'stringtype'} = $srcparms{$srcprefix.'stringtype'};  
             }  
             if (keys(%newdata)) {  
                 my $putres = &Apache::lonnet::cput('resourcedata',\%newdata,$coursedom,  
                                                    $coursenum);  
                 if ($putres eq 'ok') {  
                     &Apache::lonnet::devalidatecourseresdata($coursenum,$coursedom);  
                 }  
             }  
         }  
     }  
 }  
   
 sub uniqueness_check {  sub uniqueness_check {
     my ($newurl) = @_;      my ($newurl) = @_;
     my $unique = 1;      my $unique = 1;
Line 2367  sub uniqueness_check { Line 1654  sub uniqueness_check {
 }  }
   
 sub contained_map_check {  sub contained_map_check {
     my ($url,$folder,$coursenum,$coursedom,$removefrommap,$removeparam,$addedmaps,      my ($url,$folder,$removefrommap,$removeparam,$addedmaps,$hierarchy,$titles,
         $hierarchy,$titles,$allmaps) = @_;          $allmaps) = @_;
     my $content = &Apache::lonnet::getfile($url);      my $content = &Apache::lonnet::getfile($url);
     unless ($content eq '-1') {      unless ($content eq '-1') {
         my $parser = HTML::TokeParser->new(\$content);          my $parser = HTML::TokeParser->new(\$content);
Line 2397  sub contained_map_check { Line 1684  sub contained_map_check {
                             $addedmaps->{$ressrc} = [$url];                              $addedmaps->{$ressrc} = [$url];
                         }                          }
                     }                      }
                     &contained_map_check($ressrc,$folder,$coursenum,$coursedom,                      &contained_map_check($ressrc,$folder,$removefrommap,$removeparam,
                                          $removefrommap,$removeparam,  
                                          $addedmaps,$hierarchy,$titles,$allmaps);                                           $addedmaps,$hierarchy,$titles,$allmaps);
                 }                  }
             } elsif ($token->[1] eq 'param') {              } elsif ($token->[1] eq 'param') {
Line 2418  sub contained_map_check { Line 1704  sub contained_map_check {
 sub url_paste_fixups {  sub url_paste_fixups {
     my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$fromcdom,$fromcnum,$allmaps,      my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$fromcdom,$fromcnum,$allmaps,
         $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,          $rewrites,$retitles,$copies,$dbcopies,$zombies,$params,$mapmoves,
         $mapchanges,$tomove,$newsubdir,$newurls,$resdatacopy) = @_;          $mapchanges,$tomove,$newsubdir,$newurls) = @_;
     my $checktitle;      my $checktitle;
     if (($prefixchg) &&      if (($prefixchg) &&
         ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {          ($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) {
Line 2450  sub url_paste_fixups { Line 1736  sub url_paste_fixups {
             }              }
             next if ($token->[2]->{'type'} eq 'external');              next if ($token->[2]->{'type'} eq 'external');
             if ($token->[2]->{'type'} eq 'zombie') {              if ($token->[2]->{'type'} eq 'zombie') {
                 next if ($skip);                  next if ($skip);  
                 $zombies->{$oldurl}{$id} = $ressrc;                  $zombies->{$oldurl}{$id} = $ressrc;
                 $changed = 1;                  $changed = 1;
             } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) {
Line 2467  sub url_paste_fixups { Line 1753  sub url_paste_fixups {
                                           $srcdom,$srcnum,$allmaps,$rewrites,                                            $srcdom,$srcnum,$allmaps,$rewrites,
                                           $retitles,$copies,$dbcopies,$zombies,                                            $retitles,$copies,$dbcopies,$zombies,
                                           $params,$mapmoves,$mapchanges,$tomove,                                            $params,$mapmoves,$mapchanges,$tomove,
                                           $newsubdir,$newurls,$resdatacopy);                                            $newsubdir,$newurls);
                         next;                          next;
                     } else {                      } else {
                         ($newurl,my $error) =                          ($newurl,my $error) =
Line 2491  sub url_paste_fixups { Line 1777  sub url_paste_fixups {
                                                   $cnum,$srcdom,$srcnum,$allmaps,                                                    $cnum,$srcdom,$srcnum,$allmaps,
                                                   $rewrites,$retitles,$copies,$dbcopies,                                                    $rewrites,$retitles,$copies,$dbcopies,
                                                   $zombies,$params,$mapmoves,$mapchanges,                                                    $zombies,$params,$mapmoves,$mapchanges,
                                                   $tomove,$newsubdir,$newurls,$resdatacopy)) {                                                    $tomove,$newsubdir,$newurls)) {
                             $mapmoves->{$ressrc} = 1;                              $mapmoves->{$ressrc} = 1;
                         }                          }
                         $changed = 1;                          $changed = 1;
Line 2520  sub url_paste_fixups { Line 1806  sub url_paste_fixups {
                     $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum;                      $dbcopies->{$oldurl}{$id}{'cnum'} = $fromcnum;
                     $changed = 1;                      $changed = 1;
                 }                  }
             } elsif ($ressrc eq '/res/lib/templates/simpleproblem.problem') {  
                 if (($fromcdom ne $cdom) || ($fromcnum ne $cnum)) {  
                     $resdatacopy->{$oldurl}{$id}{'src'} = $ressrc;  
                     $resdatacopy->{$oldurl}{$id}{'cdom'} = $fromcdom;  
                     $resdatacopy->{$oldurl}{$id}{'cnum'} = $fromcnum;  
                 }  
             } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {              } elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) {
                 next if ($skip);                  next if ($skip);
                 my $srcdom = $1;                  my $srcdom = $1;
Line 2557  sub apply_fixups { Line 1837  sub apply_fixups {
         $oldurl,$url,$caller) = @_;          $oldurl,$url,$caller) = @_;
     my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,      my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles,
         %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,          %params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs,
         %resdatacopy,%lockerrors,$lockmsg);          %lockerrors,$lockmsg);
     if (ref($updated) eq 'HASH') {      if (ref($updated) eq 'HASH') {
         if (ref($updated->{'rewrites'}) eq 'HASH') {          if (ref($updated->{'rewrites'}) eq 'HASH') {
             %rewrites = %{$updated->{'rewrites'}};              %rewrites = %{$updated->{'rewrites'}};
Line 2577  sub apply_fixups { Line 1857  sub apply_fixups {
         if (ref($updated->{'retitles'}) eq 'HASH') {          if (ref($updated->{'retitles'}) eq 'HASH') {
             %retitles = %{$updated->{'retitles'}};              %retitles = %{$updated->{'retitles'}};
         }          }
         if (ref($updated->{'resdatacopy'}) eq 'HASH') {  
             %resdatacopy = %{$updated->{'resdatacopy'}};  
         }  
     }      }
     if (ref($info) eq 'HASH') {      if (ref($info) eq 'HASH') {
         if (ref($info->{'newsubdir'}) eq 'HASH') {          if (ref($info->{'newsubdir'}) eq 'HASH') {
Line 2730  sub apply_fixups { Line 2007  sub apply_fixups {
                     }                      }
                 }                  }
             }              }
             if (ref($resdatacopy{$key}) eq 'HASH') {  
                 my ($gotnewmapname,$newmapname,$srcfolder,$srccontainer);  
                 foreach my $idx (keys(%{$resdatacopy{$key}})) {  
                     if (ref($resdatacopy{$key}{$idx}) eq 'HASH') {  
                         my $srcurl = $resdatacopy{$key}{$idx}{'src'};  
                         if ($srcurl =~ m{^/res/lib/templates/(\w+)\.problem$}) {  
                             my $template = $1;  
                             if (($resdatacopy{$key}{$idx}{'cdom'} =~ /^$match_domain$/) &&  
                                 ($resdatacopy{$key}{$idx}{'cnum'} =~ /^$match_courseid$/)) {  
                                 my $srcdom = $resdatacopy{$key}{$idx}{'cdom'};  
                                 my $srcnum = $resdatacopy{$key}{$idx}{'cnum'};  
                                 unless ($gotnewmapname) {  
                                     ($newmapname) = ($key =~ m{/([^/]+)$});  
                                     ($srcfolder,$srccontainer) = split(/\./,$newmapname);  
                                     if ($newsubdir{$key}) {  
                                         $newmapname =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir{$key}/;  
                                     }  
                                     $gotnewmapname = 1;  
                                 }  
                                 my $srcmapinfo = $srcfolder.':'.$idx;  
                                 if ($srccontainer eq 'page') {  
                                     $srcmapinfo .= ':1';  
                                 }  
                                 &copy_templated_files($srcurl,$srcdom,$srcnum,$srcmapinfo,$cdom,  
                                                       $cnum,$template,$idx,$newmapname);  
                             }  
                         }  
                     }  
                 }  
             }  
             if (ref($params{$key}) eq 'HASH') {              if (ref($params{$key}) eq 'HASH') {
                 %currparam = %{$params{$key}};                  %currparam = %{$params{$key}};
             }              }
Line 2775  sub apply_fixups { Line 2022  sub apply_fixups {
                     }                      }
                 }                  }
             }              }
             my $total = scalar(@LONCAPA::map::order) - 1;              for (my $i=0; $i<@LONCAPA::map::order; $i++) {
             for (my $i=$total; $i>=0; $i--) {  
                 my $idx = $LONCAPA::map::order[$i];                  my $idx = $LONCAPA::map::order[$i];
                 if (defined($LONCAPA::map::resources[$idx])) {                  if (defined($LONCAPA::map::resources[$idx])) {
                     my $changed;                      my $changed;
Line 2786  sub apply_fixups { Line 2032  sub apply_fixups {
                         splice(@LONCAPA::map::order,$i,1);                          splice(@LONCAPA::map::order,$i,1);
                         if (ref($currparam{$idx}) eq 'ARRAY') {                          if (ref($currparam{$idx}) eq 'ARRAY') {
                             foreach my $name (@{$currparam{$idx}}) {                              foreach my $name (@{$currparam{$idx}}) {
                                 &LONCAPA::map::delparameter($idx,$name);                                  &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                             }                              }
                         }                          }
                         next;                          next;
Line 2828  sub apply_fixups { Line 2074  sub apply_fixups {
             foreach my $idx (keys(%remparam)) {              foreach my $idx (keys(%remparam)) {
                 if (ref($remparam{$idx}) eq 'ARRAY') {                  if (ref($remparam{$idx}) eq 'ARRAY') {
                     foreach my $name (@{$remparam{$idx}}) {                         foreach my $name (@{$remparam{$idx}}) {   
                         &LONCAPA::map::delparameter($idx,$name);                          &LONCAPA::map::delparameter($idx,'parameter_'.$name);
                     }                      }
                 }                  }
             }              }
Line 2936  sub update_parameter { Line 2182  sub update_parameter {
                          'randomorder'    => {},                           'randomorder'    => {},
                       );                        );
         foreach my $which (keys(%allchecked)) {          foreach my $which (keys(%allchecked)) {
             $env{'form.all'.$which} =~ s/,$//;              $env{'form.all'.$which} =~ s/,$//;   
             if ($which eq 'randompick') {              if ($which eq 'randompick') {
                 foreach my $item (split(/,/,$env{'form.all'.$which})) {                  foreach my $item (split(/,/,$env{'form.all'.$which})) {
                     my ($res,$value) = split(/:/,$item);                      my ($res,$value) = split(/:/,$item);
Line 2963  sub update_parameter { Line 2209  sub update_parameter {
             foreach my $which (keys(%allchecked)) {              foreach my $which (keys(%allchecked)) {
                 if (($which eq 'randompick' || $which eq 'randomorder')) {                  if (($which eq 'randompick' || $which eq 'randomorder')) {
                     next if (!$is_map);                      next if (!$is_map);
                 }                  } 
                 my $oldvalue = 0;                  my $oldvalue = 0;
                 my $newvalue = 0;                  my $newvalue = 0;
                 if ($allchecked{$which}{$res}) {                  if ($allchecked{$which}{$res}) {
Line 2999  sub update_parameter { Line 2245  sub update_parameter {
         }          }
         return $haschanges;          return $haschanges;
     } else {      } else {
         my $haschanges = 0;          return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);
         return $haschanges if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/);  
   
         my $which = $env{'form.changeparms'};          my $which = $env{'form.changeparms'};
         my $idx = $env{'form.setparms'};          my $idx = $env{'form.setparms'};
         my $oldvalue = 0;  
         my $newvalue = 0;  
         my $current = (&LONCAPA::map::getparameter($idx,'parameter_'.$which))[0];  
         if ($which eq 'randompick') {  
             if ($current =~ /^(\d+)$/) {  
                 $oldvalue = $1;  
             }  
         } elsif ($current =~ /^yes$/i) {  
             $oldvalue = 1;  
         }  
         if ($env{'form.'.$which.'_'.$idx}) {          if ($env{'form.'.$which.'_'.$idx}) {
             $newvalue = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx}      my $value = ($which eq 'randompick') ? $env{'form.rpicknum_'.$idx}
                                                  : 1;                                           : 'yes';
         }      &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value,
         if ($oldvalue ne $newvalue) {            $parameter_type{$which});
             $haschanges = 1;      &remember_parms($idx,$which,'set',$value);
             if ($newvalue) {          } else {
                 my $storeval = 'yes';      &LONCAPA::map::delparameter($idx,'parameter_'.$which);
                 if ($which eq 'randompick') {  
                     $storeval = $newvalue;      &remember_parms($idx,$which,'del');
                 }  
                 &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $storeval,  
                                               $parameter_type{$which});  
                 &remember_parms($idx,$which,'set',$storeval);  
             } else {  
                 &LONCAPA::map::delparameter($idx,'parameter_'.$which);  
                 &remember_parms($idx,$which,'del');  
             }  
         }          }
         return $haschanges;          return 1;
     }      }
     return;  
 }  }
   
   
 sub handle_edit_cmd {  sub handle_edit_cmd {
     my ($coursenum,$coursedom) =@_;      my ($coursenum,$coursedom) =@_;
     if ($env{'form.cmd'} eq '') {      if ($env{'form.cmd'} eq '') {
Line 3087  sub handle_edit_cmd { Line 2314  sub handle_edit_cmd {
   
 sub editor {  sub editor {
     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,      my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype,
         $supplementalflag,$orderhash,$iconpath,$pathitem,$ltitoolsref,          $supplementalflag,$orderhash,$iconpath,$pathitem)=@_;
         $canedit,$hostname,$navmapref,$hiddentop)=@_;  
     my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container);      my ($randompick,$ishidden,$isencrypted,$plain,$is_random_order,$container);
     if ($allowed) {      if ($allowed) {
         (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,          (my $breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,
Line 3111  sub editor { Line 2337  sub editor {
         $randompick = -1;          $randompick = -1;
     }      }
   
     my ($errtext,$fatal);      my ($errtext,$fatal) = &mapread($coursenum,$coursedom,
     if (($folder eq '') && (!$supplementalflag)) {      $folder.'.'.$container);
         if (@LONCAPA::map::order) {      return $errtext if ($fatal);
             undef(@LONCAPA::map::order);  
             undef(@LONCAPA::map::resources);  
             undef(@LONCAPA::map::resparms);  
             undef(@LONCAPA::map::zombies);  
         }  
         $folder = 'default';  
         $container = 'sequence';  
     } else {  
         ($errtext,$fatal) = &mapread($coursenum,$coursedom,  
                                      $folder.'.'.$container);  
         return $errtext if ($fatal);  
     }  
   
     if ($#LONCAPA::map::order<1) {      if ($#LONCAPA::map::order<1) {
  my $idx=&LONCAPA::map::getresidx();   my $idx=&LONCAPA::map::getresidx();
Line 3137  sub editor { Line 2351  sub editor {
 # ------------------------------------------------------------ Process commands  # ------------------------------------------------------------ Process commands
   
 # ---------------- if they are for this folder and user allowed to make changes  # ---------------- if they are for this folder and user allowed to make changes
     if (($allowed && $canedit) && ($env{'form.folder'} eq $folder)) {      if (($allowed) && ($env{'form.folder'} eq $folder)) {
 # set parameters and change order  # set parameters and change order
  &snapshotbefore();   &snapshotbefore();
   
  if (&update_parameter()) {   if (&update_parameter()) {
     ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,1);      ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
     return $errtext if ($fatal);      return $errtext if ($fatal);
  }   }
   
Line 3204  sub editor { Line 2418  sub editor {
  $r->print($upload_output);   $r->print($upload_output);
   
 # Rename, cut, copy or remove a single resource  # Rename, cut, copy or remove a single resource
  if (&handle_edit_cmd($coursenum,$coursedom)) {   if (&handle_edit_cmd()) {
             my $contentchg;              my $contentchg;
             if ($env{'form.cmd'} =~ m{^(remove|cut)_}) {              if ($env{'form.cmd'} =~ m{^(del|cut)_}) {
                 $contentchg = 1;                  $contentchg = 1;
             }              }
     ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg);      ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg);
Line 3238  sub editor { Line 2452  sub editor {
                     my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);                      my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
                     $name=&LONCAPA::map::qtescape($name);                      $name=&LONCAPA::map::qtescape($name);
                     $url=&LONCAPA::map::qtescape($url);                      $url=&LONCAPA::map::qtescape($url);
                     next unless $url;                      next unless ($name && $url);
                     my %denied =                      my %denied =
                         &action_restrictions($coursenum,$coursedom,$url,                          &action_restrictions($coursenum,$coursedom,$url,
                                              $env{'form.folderpath'},\%curr_groups);                                               $env{'form.folderpath'},\%curr_groups);
Line 3299  sub editor { Line 2513  sub editor {
                         } else {                          } else {
                             return $errortxt;                              return $errortxt;
                         }                          }
                     } elsif ($url =~ m{^/adm/$coursedom/$coursenum/new/ext\.tool}) {  
                         my ($suffix,$errortxt,$locknotfreed) =  
                             &new_timebased_suffix($coursedom,$coursenum,'exttool');  
                         if ($locknotfreed) {  
                             $r->print($locknotfreed);  
                         }  
                         if ($suffix) {  
                             $url =~ s{^(/adm/$coursedom/$coursenum)/new}{$1/$suffix};  
                         } else {  
                             return $errortxt;  
                         }  
                     } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) {                      } elsif ($url =~ m{^/uploaded/$coursedom/$coursenum/(docs|supplemental)/(default|\d+)/new.html$}) {
                         if ($supplementalflag) {                          if ($supplementalflag) {
                             next unless ($1 eq 'supplemental');                              next unless ($1 eq 'supplemental');
Line 3332  sub editor { Line 2535  sub editor {
     }      }
             ($errtext,$fatal,my $fixuperrors) =              ($errtext,$fatal,my $fixuperrors) =
                 &group_import($coursenum, $coursedom, $folder,$container,                  &group_import($coursenum, $coursedom, $folder,$container,
                               'londocs',$ltitoolsref,@imports);                                'londocs',@imports);
     return $errtext if ($fatal);      return $errtext if ($fatal);
             if ($fixuperrors) {              if ($fixuperrors) {
                 $r->print($fixuperrors);                  $r->print($fixuperrors);
Line 3414  sub editor { Line 2617  sub editor {
         if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {          if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
             push(@allmapidx,$res);              push(@allmapidx,$res);
         }          }
   
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,          $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
                               $coursenum,$coursedom,$crstype,                                $coursenum,$coursedom,$crstype,
                               $pathitem,$supplementalflag,$container,                                $pathitem,$supplementalflag,$container,
                               \%filters,\%curr_groups,$ltitoolsref,$canedit,                                \%filters,\%curr_groups);
                               $isencrypted,$navmapref,$hostname);  
         $idx++;          $idx++;
         $shown++;          $shown++;
     }      }
     &Apache::loncommon::end_data_table_count();      &Apache::loncommon::end_data_table_count();
   
     my $need_save;      my $need_save;
     if ($allowed || ($supplementalflag && $folder eq 'supplemental')) {      if (($allowed) || ($supplementalflag && $folder eq 'supplemental')) {
         my $toolslink;          my $toolslink;
         if ($allowed) {          if ($allowed || &Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
             $toolslink = '<table><tr><td>'              $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')
Line 3467  sub editor { Line 2668  sub editor {
                     if (@allidx > 0) {                      if (@allidx > 0) {
                         my $path;                          my $path;
                         if ($env{'form.folderpath'}) {                          if ($env{'form.folderpath'}) {
                             $path =                              $path = 
                                 &HTML::Entities::encode($env{'form.folderpath'},'<>&"');                                  &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
                         }                          }
                         if (@allidx > 1) {                          if (@allidx > 1) {
                             $to_show .=                              $to_show .= 
                                 &Apache::loncommon::continue_data_table_row().                                  &Apache::loncommon::continue_data_table_row().
                                 '<td colspan="2">&nbsp;</td>'.                                  '<td colspan="2">&nbsp;</td>'.
                                 '<td>'.                                  '<td>'.
                                 &multiple_check_form('actions',\%lists,$canedit).                                  &multiple_check_form('actions',\%lists).
                                 '</td>'.                                  '</td>'.
                                 '<td>&nbsp;</td>'.                                  '<td>&nbsp;</td>'.
                                 '<td>&nbsp;</td>'.                                  '<td>&nbsp;</td>'.
                                 '<td colspan="4">'.                                  '<td colspan="4">'.
                                 &multiple_check_form('settings',\%lists,$canedit).                                  &multiple_check_form('settings',\%lists).
                                 '</td>'.                                  '</td>'.
                                 &Apache::loncommon::end_data_table_row();                                  &Apache::loncommon::end_data_table_row();
                              $need_save = 1;                               $need_save = 1;
Line 3501  sub editor { Line 2702  sub editor {
             if (!$allowed) {              if (!$allowed) {
                 $to_show .= $toolslink;                  $to_show .= $toolslink;
             }              }
             my $noresmsg;  
             if ($allowed && $hiddentop && !$supplementalflag) {  
                 $noresmsg = &mt('Main Content Hidden');  
             } else {  
                 $noresmsg = &mt('Currently empty');  
             }  
             $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')              $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll')
                        .'<div class="LC_info" id="contentlist">'                         .'<div class="LC_info" id="contentlist">'
                        .$noresmsg                         .&mt('Currently empty')
                        .'</div>'                         .'</div>'
                        .&Apache::loncommon::end_scrollbox();                         .&Apache::loncommon::end_scrollbox();
         }          }
Line 3533  sub editor { Line 2728  sub editor {
     if ($allowed) {      if ($allowed) {
         my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";          my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container";
         $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,          $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,
                                        $jumpto,$readfile,$need_save,"$folder.$container",$canedit));                                         $jumpto,$readfile,$need_save,"$folder.$container"));
         if ($canedit) {          &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);
             &print_paste_buffer($r,$container,$folder,$coursedom,$coursenum);  
         }  
     } else {      } else {
         $r->print($to_show);          $r->print($to_show);
     }      }
Line 3544  sub editor { Line 2737  sub editor {
 }  }
   
 sub multiple_check_form {  sub multiple_check_form {
     my ($caller,$listsref,$canedit) = @_;      my ($caller,$listsref) = @_;
     return unless (ref($listsref) eq 'HASH');      return unless (ref($listsref) eq 'HASH');
     my $disabled;  
     unless ($canedit) {  
         $disabled = 'disabled="disabled"';  
     }  
     my $output =      my $output =
     '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'.      '<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'.
     '<span class="LC_nobreak" style="font-size:x-small;font-weight:bold;">'.      '<span class="LC_nobreak" style="font-size:x-small;font-weight:bold;">'.
Line 3562  sub multiple_check_form { Line 2751  sub multiple_check_form {
             '<table><tr>'.              '<table><tr>'.
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak"><label>'.              '<span class="LC_nobreak"><label>'.
             '<input type="checkbox" name="hiddenresourceall" id="hiddenresourceall" onclick="propagateState(this.form,'."'hiddenresource'".')"'.$disabled.' />'.&mt('Hidden').              '<input type="checkbox" name="hiddenresourceall" id="hiddenresourceall" onclick="propagateState(this.form,'."'hiddenresource'".')" />'.&mt('Hidden').
             '</label></span></td>'.              '</label></span></td>'.
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak"><label><input type="checkbox" name="randompickall" id="randompickall" onclick="updatePick(this.form,'."'all','check'".');propagateState(this.form,'."'randompick'".');propagateState(this.form,'."'rpicknum'".');"'.$disabled.' />'.&mt('Randomly Pick').'</label><span id="rpicktextall"></span><input type="hidden" name="rpicknumall" id="rpicknumall" value="" />'.              '<span class="LC_nobreak"><label><input type="checkbox" name="randompickall" id="randompickall" onclick="updatePick(this.form,'."'all','check'".');propagateState(this.form,'."'randompick'".');propagateState(this.form,'."'rpicknum'".');" />'.&mt('Randomly Pick').'</label><span id="rpicktextall"></span><input type="hidden" name="rpicknumall" id="rpicknumall" value="" />'.
             '</span></td>'.              '</span></td>'.
             '</tr>'."\n".              '</tr>'."\n".
             '<tr>'.              '<tr>'.
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak"><label><input type="checkbox" name="encrypturlall" id="encrypturlall" onclick="propagateState(this.form,'."'encrypturl'".')"'.$disabled.' />'.&mt('URL hidden').'</label></span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><label><input type="checkbox" name="randomorderall" id="randomorderall" onclick="propagateState(this.form,'."'randomorder'".')"'.$disabled.' />'.&mt('Random Order').              '<span class="LC_nobreak"><label><input type="checkbox" name="encrypturlall" id="encrypturlall" onclick="propagateState(this.form,'."'encrypturl'".')" />'.&mt('URL hidden').'</label></span></td><td class="LC_docs_entry_parameter"><span class="LC_nobreak"><label><input type="checkbox" name="randomorderall" id="randomorderall" onclick="propagateState(this.form,'."'randomorder'".')" />'.&mt('Random Order').
             '</label></span>'.              '</label></span>'.
             '</td></tr></table>'."\n";              '</td></tr></table>'."\n";
     } else {      } else {
Line 3578  sub multiple_check_form { Line 2767  sub multiple_check_form {
             '<table><tr>'.              '<table><tr>'.
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak LC_docs_remove">'.              '<span class="LC_nobreak LC_docs_remove">'.
             '<label><input type="checkbox" name="removeall" id="removeall" onclick="propagateState(this.form,'."'remove'".')"'.$disabled.' />'.&mt('Remove').              '<label><input type="checkbox" name="removeall" id="removeall" onclick="propagateState(this.form,'."'remove'".')" />'.&mt('Remove').
             '</label></span></td>'.              '</label></span></td>'.
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak LC_docs_cut">'.              '<span class="LC_nobreak LC_docs_cut">'.
             '<label><input type="checkbox" name="cut" id="cutall" onclick="propagateState(this.form,'."'cut'".');"'.$disabled.' />'.&mt('Cut').              '<label><input type="checkbox" name="cut" id="cutall" onclick="propagateState(this.form,'."'cut'".');" />'.&mt('Cut').
             '</label></span></td>'."\n".              '</label></span></td>'."\n".
             '<td class="LC_docs_entry_parameter">'.              '<td class="LC_docs_entry_parameter">'.
             '<span class="LC_nobreak LC_docs_copy">'.              '<span class="LC_nobreak LC_docs_copy">'.
             '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')"'.$disabled.' />'.&mt('Copy').              '<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')" />'.&mt('Copy').
             '</label></span></td>'.              '</label></span></td>'.
             '</tr></table>'."\n";              '</tr></table>'."\n";
     }      }
Line 3627  sub process_file_upload { Line 2816  sub process_file_upload {
     }      }
     my $quotatype = 'unofficial';      my $quotatype = 'unofficial';
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $quotatype = 'community';          $quotatype = 'community';    
     } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.coursecode'}) {      } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.instcode'}) {
         $quotatype = 'official';          $quotatype = 'official';
     } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.textbook'}) {  
         $quotatype = 'textbook';  
     }      }
     if (&Apache::loncommon::get_user_quota($coursenum,$coursedom,'course',$quotatype)) {      if (&Apache::loncommon::get_user_quota($coursenum,$coursedom,'course',$quotatype)) {
         $filesize = int($filesize/1000); #expressed in kb          $filesize = int($filesize/1000); #expressed in kb
         $$upload_output = &Apache::loncommon::excess_filesize_warning($coursenum,$coursedom,'course',          $$upload_output = &Apache::loncommon::excess_filesize_warning($coursenum,$coursedom,'course',
                                                                       $env{'form.uploaddoc.filename'},$filesize,                                                                        $env{'form.uploaddoc.filename'},$filesize,'upload');
                                                                       'upload',$quotatype);  
         return if ($$upload_output);          return if ($$upload_output);
     }      }
     my ($parseaction,$showupload,$nextphase,$mimetype);      my ($parseaction,$showupload,$nextphase,$mimetype);
Line 3735  sub process_file_upload { Line 2921  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 3797  sub is_supplemental_title { Line 2982  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)=@_;
         $ltitoolsref,$canedit,$isencrypted,$navmapref,$hostname)=@_;      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 3808  sub entryline { Line 2992  sub entryline {
  $foldertitle=$title;   $foldertitle=$title;
     }      }
   
     my ($disabled,$readonly,$js_lt);  
     unless ($canedit) {  
         $disabled = 'disabled="disabled"';  
         $readonly = 1;  
     }  
   
     my $orderidx=$LONCAPA::map::order[$index];      my $orderidx=$LONCAPA::map::order[$index];
   
     $renametitle=~s/\\/\\\\/g;      $renametitle=~s/\\/\\\\/g;
     $renametitle=~s/\&quot\;/\\\"/g;      $renametitle=~s/\&quot\;/\\\"/g;
     $renametitle=~s/"/%22/g;  
     $renametitle=~s/ /%20/g;      $renametitle=~s/ /%20/g;
     $oldtitle = $renametitle;  
     $renametitle=~s/\&#39\;/\\\'/g;  
     my $line=&Apache::loncommon::start_data_table_row();      my $line=&Apache::loncommon::start_data_table_row();
     my ($form_start,$form_end,$form_common,$form_param);      my ($form_start,$form_end,$form_common,$form_param);
 # Edit commands  # Edit commands
Line 3877  END Line 3052  END
      ne '')) {       ne '')) {
     $selectbox=      $selectbox=
  '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.   '<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
  '<select name="newpos" onchange="this.form.submit()"'.$disabled.'>';   '<select name="newpos" onchange="this.form.submit()">';
     for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {      for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
  if ($i==$incindex) {   if ($i==$incindex) {
     $selectbox.='<option value="" selected="selected">('.$i.')</option>';      $selectbox.='<option value="" selected="selected">('.$i.')</option>';
Line 3895  END Line 3070  END
  'rn' => 'Rename',   'rn' => 'Rename',
  'cp' => 'Copy',   'cp' => 'Copy',
                 'ex' => 'External Resource',                  'ex' => 'External Resource',
                 'et' => 'External Tool',  
                 'ed' => 'Edit',                  'ed' => 'Edit',
                 'pr' => 'Preview',                  'pr' => 'Preview',
                 'sv' => 'Save',                  'sv' => 'Save',
                 'ul' => 'URL',                  'ul' => 'URL',
                 'ti' => 'Title',                  'ti' => 'Title', 
                 'er' => 'Editing rights unavailable for your current role.',    
                 );                  );
  my %denied = &action_restrictions($coursenum,$coursedom,$url,   my %denied = &action_restrictions($coursenum,$coursedom,$url,
                                           $env{'form.folderpath'},                                            $env{'form.folderpath'},
                                           $currgroups);                                            $currgroups);
         my ($copylink,$cutlink,$removelink);          my ($copylink,$cutlink,$removelink);
  my $skip_confirm = 0;   my $skip_confirm = 0;
         my $confirm_removal = 0;  
  if ( $folder =~ /^supplemental/   if ( $folder =~ /^supplemental/
      || ($url =~ m{( /smppg$       || ($url =~ m{( /smppg$
     |/syllabus$      |/syllabus$
     |/aboutme$      |/aboutme$
     |/navmaps$      |/navmaps$
     |/bulletinboard$      |/bulletinboard$
                             |/ext\.tool$  
     |\.html$)}x)      |\.html$)}x)
              || $isexternal) {               || $isexternal) {
     $skip_confirm = 1;      $skip_confirm = 1;
  }   }
         if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&  
             ($url!~/$LONCAPA::assess_page_seq_re/)) {  
             $confirm_removal = 1;  
         }  
   
  if ($denied{'copy'}) {   if ($denied{'copy'}) {
             $copylink=(<<ENDCOPY)              $copylink=(<<ENDCOPY)
Line 3935  ENDCOPY Line 3102  ENDCOPY
     $copylink=(<<ENDCOPY);      $copylink=(<<ENDCOPY);
 <form name="$formname" method="post" action="/adm/coursedocs">  <form name="$formname" method="post" action="/adm/coursedocs">
 $form_common  $form_common
 <input type="checkbox" name="copy" id="copy_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','copy');" class="LC_hidden" $disabled /><a href="$js" class="LC_docs_copy">$lt{'cp'}</a>  <input type="checkbox" name="copy" id="copy_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','copy');" class="LC_hidden" /><a href="$js" class="LC_docs_copy">$lt{'cp'}</a>
 $form_end  $form_end
 ENDCOPY  ENDCOPY
             if (($ishash) && (ref($filtersref->{'cancopy'}) eq 'ARRAY')) {              if (($ishash) && (ref($filtersref->{'cancopy'}) eq 'ARRAY')) {
Line 3953  ENDCUT Line 3120  ENDCUT
 <form name="$formname" method="post" action="/adm/coursedocs">  <form name="$formname" method="post" action="/adm/coursedocs">
 $form_common  $form_common
 <input type="hidden" name="skip_$orderidx" id="skip_cut_$orderidx" value="$skip_confirm" />  <input type="hidden" name="skip_$orderidx" id="skip_cut_$orderidx" value="$skip_confirm" />
 <input type="checkbox" name="cut" id="cut_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','cut');" class="LC_hidden" $disabled /><a href="$js" class="LC_docs_cut">$lt{'ct'}</a>  <input type="checkbox" name="cut" id="cut_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','cut');" class="LC_hidden" /><a href="$js" class="LC_docs_cut">$lt{'ct'}</a>
 $form_end  $form_end
 ENDCUT  ENDCUT
             if (($ishash) && (ref($filtersref->{'cancut'}) eq 'ARRAY')) {              if (($ishash) && (ref($filtersref->{'cancut'}) eq 'ARRAY')) {
Line 3966  ENDCUT Line 3133  ENDCUT
 ENDREM  ENDREM
         } else {          } else {
             my $formname = 'edit_remove_'.$orderidx;              my $formname = 'edit_remove_'.$orderidx;
             my $js = "javascript:checkForSubmit(document.forms.renameform,'remove','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm,'$container','$folder',$confirm_removal);";              my $js = "javascript:checkForSubmit(document.forms.renameform,'remove','actions','$orderidx','$esc_path','$index','$renametitle',$skip_confirm);";
             $removelink=(<<ENDREM);              $removelink=(<<ENDREM);
 <form name="$formname" method="post" action="/adm/coursedocs">  <form name="$formname" method="post" action="/adm/coursedocs">
 $form_common  $form_common
 <input type="hidden" name="skip_$orderidx" id="skip_remove_$orderidx" value="$skip_confirm" />  <input type="hidden" name="skip_$orderidx" id="skip_remove_$orderidx" value="$skip_confirm" />
 <input type="hidden" name="confirm_rem_$orderidx" id="confirm_removal_$orderidx" value="$confirm_removal" />  <input type="checkbox" name="remove" id="remove_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','remove');" class="LC_hidden" /><a href="$js" class="LC_docs_remove">$lt{'rm'}</a>
 <input type="checkbox" name="remove" id="remove_$orderidx" value="$orderidx" onclick="javascript:singleCheck(this,'$orderidx','remove');" class="LC_hidden" $disabled /><a href="$js" class="LC_docs_remove">$lt{'rm'}</a>  
 $form_end  $form_end
 ENDREM  ENDREM
             if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) {              if (($ishash) && (ref($filtersref->{'canremove'}) eq 'ARRAY')) {
Line 3980  ENDREM Line 3146  ENDREM
             }              }
         }          }
         $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
         my ($uplink,$downlink);  
         if ($canedit) {  
             $uplink = "/adm/coursedocs?cmd=up_$index&amp;folderpath=$esc_path&amp;symb=$symb";  
             $downlink = "/adm/coursedocs?cmd=down_$index&amp;folderpath=$esc_path&amp;symb=$symb";  
         } else {  
             $uplink = "javascript:alert('".&js_escape($lt{'er'})."');";  
             $downlink = $uplink;  
         }  
  $line.=(<<END);   $line.=(<<END);
 <td>  <td>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href="$uplink">    <a href='/adm/coursedocs?cmd=up_$index&amp;folderpath=$esc_path&amp;symb=$symb'>
     <img src="${iconpath}move_up.gif" alt="$lt{'up'}" class="LC_icon" />      <img src="${iconpath}move_up.gif" alt="$lt{'up'}" class="LC_icon" />
   </a>    </a>
 </div>  </div>
 <div class="LC_docs_entry_move">  <div class="LC_docs_entry_move">
   <a href="$downlink">    <a href='/adm/coursedocs?cmd=down_$index&amp;folderpath=$esc_path&amp;symb=$symb'>
     <img src="${iconpath}move_down.gif" alt="$lt{'dw'}" class="LC_icon" />      <img src="${iconpath}move_down.gif" alt="$lt{'dw'}" class="LC_icon" />
   </a>    </a>
 </div>  </div>
Line 4024  END Line 3182  END
     my $isfolder;      my $isfolder;
     my $ispage;      my $ispage;
     my $containerarg;      my $containerarg;
     my $folderurl;  
     if ($uploaded) {      if ($uploaded) {
         if (($extension eq 'sequence') || ($extension eq 'page')) {          if (($extension eq 'sequence') || ($extension eq 'page')) {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;              $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
Line 4036  END Line 3193  END
                 $icon=$iconpath.'page.gif';                  $icon=$iconpath.'page.gif';
                 $ispage=1;                  $ispage=1;
             }              }
             $folderurl = &Apache::lonnet::declutter($url);  
             if ($allowed) {              if ($allowed) {
                 $url='/adm/coursedocs?';                  $url='/adm/coursedocs?';
             } else {              } else {
Line 4047  END Line 3203  END
  }   }
     }      }
   
     my ($editlink,$extresform,$anchor,$hiddenres,$nomodal);      my ($editlink,$extresform);
     my $orig_url = $url;      my $orig_url = $url;
     $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};      $orig_url=~s{http(&colon;|:)//https(&colon;|:)//}{https$2//};
     if ($container eq 'page') {      $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
         $url=~s{^http(|s)(&colon;|:)//}{/ext/};  
     } else {  
         $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};  
     }  
     if (!$supplementalflag && $residx && $symb) {      if (!$supplementalflag && $residx && $symb) {
         if ((!$isfolder) && (!$ispage)) {          if ((!$isfolder) && (!$ispage)) {
     (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);      (undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
             if (($url =~ m{^ext/}) && ($container eq 'page')) {      $url=&Apache::lonnet::clutter($url);
                 $url=&Apache::lonnet::clutter_with_no_wrapper($url);  
             } else {  
                 $url=&Apache::lonnet::clutter($url);  
             }  
     if ($url=~/^\/*uploaded\//) {      if ($url=~/^\/*uploaded\//) {
         $url=~/\.(\w+)$/;          $url=~/\.(\w+)$/;
         my $embstyle=&Apache::loncommon::fileembstyle($1);          my $embstyle=&Apache::loncommon::fileembstyle($1);
Line 4073  END Line 3221  END
         } elsif ($url!~/\.(sequence|page)$/) {          } elsif ($url!~/\.(sequence|page)$/) {
     $url='/adm/coursedocs/showdoc'.$url;      $url='/adm/coursedocs/showdoc'.$url;
         }          }
             } elsif ($url=~m{^(|/adm/wrapper)/ext/([^#]+)}) {      } elsif ($url=~m|^/ext/|) {
                 my $wrapped = $1;          $url='/adm/wrapper'.$url;
                 my $exturl = $2;  
                 if (($wrapped eq '') && ($container ne 'page')) {  
                     $url='/adm/wrapper'.$url;  
                 }  
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {  
                     $nomodal = 1;  
                 }  
             } elsif ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {  
                 $url='/adm/wrapper'.$url;  
             } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {  
                 if (($ENV{'SERVER_PORT'} == 443) &&  
                     ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                     unless (&Apache::lonnet::uses_sts()) {  
                         $url .= '?usehttp=1';  
                     }  
                     $nomodal = 1;  
                 }  
     }      }
             if (&Apache::lonnet::symbverify($symb,$url)) {              if (&Apache::lonnet::symbverify($symb,$url)) {
                 my $shownsymb = $symb;          $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                 if ($isexternal) {  
                     $url =~ s/\#[^#]+$//;  
                     if ($container eq 'page') {  
                         $url = &Apache::lonnet::clutter($url);  
                     }  
                 }  
                 unless ($env{'request.role.adv'}) {  
                     if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {  
                         $url = '';  
                     }  
                     if (&Apache::lonnet::EXT('resource.0.hiddenresource',$symb) =~ /^yes$/i) {  
                         $url = '';  
                         $hiddenres = 1;  
                     }  
                 }  
                 if ($url ne '') {  
                     $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);  
                 }  
             } elsif (!$env{'request.role.adv'}) {  
                 my $checkencrypt;  
                 if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||  
                       $isencrypted || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {  
                     $checkencrypt = 1;  
                 } elsif (ref($navmapref)) {  
                     unless (ref($$navmapref)) {  
                         $$navmapref = Apache::lonnavmaps::navmap->new();  
                     }  
                     if (ref($$navmapref)) {  
                         if (lc($$navmapref->get_mapparam($symb,undef,"0.encrypturl")) eq 'yes') {  
                             $checkencrypt = 1;  
                         }  
                     }  
                 }  
                 if ($checkencrypt) {  
                     my $shownsymb = &Apache::lonenc::encrypted($symb);  
                     my $shownurl = &Apache::lonenc::encrypted($url);  
                     if (&Apache::lonnet::symbverify($shownsymb,$shownurl)) {  
                         $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);  
                         if ($env{'request.enc'} ne '') {  
                             delete($env{'request.enc'});  
                         }  
                     } else {  
                         $url='';  
                     }  
                 } else {  
                     $url='';  
                 }  
             } else {              } else {
                 $url='';                  $url='';
             }              }
  }   }
     } elsif ($supplementalflag) {  
         if ($isexternal) {  
             if ($url =~ /^([^#]+)#([^#]+)$/) {  
                 $url = $1;  
                 $anchor = $2;  
                 if (($url =~ m{^(|/adm/wrapper)/ext/(?!https:)}) && ($ENV{'SERVER_PORT'} == 443)) {  
                     unless (&Apache::lonnet::uses_sts()) {  
                         if ($hostname ne '') {  
                             $url = 'http://'.$hostname.$url;  
                         }  
                         $url .= (($url =~ /\?/) ? '&amp;':'?').'usehttp=1';  
                     }  
                     $nomodal = 1;  
                 }  
             }  
         } elsif ($url =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {  
             if (($ENV{'SERVER_PORT'} == 443) &&  
                 ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                 unless (&Apache::lonnet::uses_sts()) {  
                     if ($hostname ne '') {  
                         $url = 'http://'.$hostname.$url;  
                     }  
                     $url .= (($url =~ /\?/) ? '&amp;':'?').'usehttp=1';  
                 }  
                 $nomodal = 1;  
             }  
         }  
     }      }
     my ($rand_pick_text,$rand_order_text,$hiddenfolder);      my ($rand_pick_text,$rand_order_text);
     my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };  
     if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') {      if ($isfolder || $ispage || $extension eq 'sequence' || $extension eq 'page') {
  my $foldername=&escape($foldertitle);   my $foldername=&escape($foldertitle);
  my $folderpath=$env{'form.folderpath'};   my $folderpath=$env{'form.folderpath'};
Line 4184  END Line 3240  END
             $folderpath.=$containerarg.'&'.$foldername;              $folderpath.=$containerarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);              $url.='folderpath='.&escape($folderpath);
         } else {          } else {
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,  
                                                         'parameter_randompick'))[0];  
             my $randorder = ((&LONCAPA::map::getparameter($orderidx,  
                                               'parameter_randomorder'))[0]=~/^yes$/i);  
             my $hiddenmap = ((&LONCAPA::map::getparameter($orderidx,  
                                               'parameter_hiddenresource'))[0]=~/^yes$/i);  
             my $encryptmap = ((&LONCAPA::map::getparameter($orderidx,  
                                               'parameter_encrypturl'))[0]=~/^yes$/i);  
             unless ($hiddenmap) {  
                 if (ref($navmapref)) {  
                     unless (ref($$navmapref)) {  
                         $$navmapref = Apache::lonnavmaps::navmap->new();  
                     }  
                     if (ref($$navmapref)) {  
                         if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {  
                             my @resources = $$navmapref->retrieveResources($folderurl,$filterFunc,1,1);  
                             unless (@resources) {  
                                 $hiddenmap = 1;  
                                 unless ($env{'request.role.adv'}) {  
                                     $url = '';  
                                     $hiddenfolder = 1;  
                                 }  
                             }  
                         }  
                     }  
                 }  
             }  
             unless ($encryptmap) {  
                 if ((ref($navmapref)) && (ref($$navmapref))) {  
                     if (lc($$navmapref->get_mapparam(undef,$folderurl,"0.encrypturl")) eq 'yes') {  
                         $encryptmap = 1;  
                     }  
                 }  
             }  
   
 # Append randompick number, hidden, and encrypted with ":" to foldername,  # Append randompick number, hidden, and encrypted with ":" to foldername,
 # so it gets transferred between levels  # so it gets transferred between levels
             $folderpath.=$containerarg.'&'.$foldername.      $folderpath.=$containerarg.'&'.$foldername.
                          ':'.$rpicknum.':'.$hiddenmap.':'.$encryptmap.':'.$randorder.':'.$ispage;                                                ':'.(&LONCAPA::map::getparameter($orderidx,
             unless ($url eq '') {                                                'parameter_randompick'))[0]
                 $url.='folderpath='.&escape($folderpath);                                                 .':'.((&LONCAPA::map::getparameter($orderidx,
             }                                                'parameter_hiddenresource'))[0]=~/^yes$/i)
                                                  .':'.((&LONCAPA::map::getparameter($orderidx,
                                                 'parameter_encrypturl'))[0]=~/^yes$/i)
                                                  .':'.((&LONCAPA::map::getparameter($orderidx,
                                                 'parameter_randomorder'))[0]=~/^yes$/i)
                                                  .':'.$ispage;
       $url.='folderpath='.&escape($folderpath);
               my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
                                                           'parameter_randompick'))[0];
             my $rpckchk;              my $rpckchk;
             if ($rpicknum) {              if ($rpicknum) {
                 $rpckchk = ' checked="checked"';                  $rpckchk = ' checked="checked"';
Line 4238  END Line 3267  END
 '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".  '<form action="/adm/coursedocs" method="post" name="'.$formname.'">'."\n".
 $form_param."\n".  $form_param."\n".
 $form_common."\n".  $form_common."\n".
 '<span class="LC_nobreak"><label><input type="checkbox" name="randompick_'.$orderidx.'" id="randompick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.$disabled.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="rpicknum_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" /><span id="randompicknum_'.$orderidx.'">';  '<span class="LC_nobreak"><label><input type="checkbox" name="randompick_'.$orderidx.'" id="randompick_'.$orderidx.'" onclick="'."updatePick(this.form,'$orderidx','check');".'"'.$rpckchk.' /> '.&mt('Randomly Pick').'</label><input type="hidden" name="rpicknum_'.$orderidx.'" id="rpicknum_'.$orderidx.'" value="'.$rpicknum.'" /><span id="randompicknum_'.$orderidx.'">';
             if ($rpicknum ne '') {              if ($rpicknum ne '') {
                 $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';                  $rand_pick_text .= ':&nbsp;<a href="javascript:updatePick('."document.$formname,'$orderidx','link'".')">'.$rpicknum.'</a>';
             }              }
             $rand_pick_text .= '</span></span>'.              $rand_pick_text .= '</span></span>'.
                                $form_end;                                 $form_end;
             my $ro_set;              my $ro_set;
             if ($randorder) {              if ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i) {
                 $ro_set = 'checked="checked"';                  $ro_set = 'checked="checked"';
                 if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {                  if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
                     push(@{$filtersref->{'randomorder'}},$orderidx);                      push(@{$filtersref->{'randomorder'}},$orderidx);
                 }                  }
             }              }
             $formname = 'edit_rorder_'.$orderidx;              my $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".
 $form_common."\n".  $form_common."\n".
 '<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.$disabled.' /> '.&mt('Random Order').' </label></span>'.  '<span class="LC_nobreak"><label><input type="checkbox" name="randomorder_'.$orderidx.'" id="randomorder_'.$orderidx.'" onclick="checkForSubmit(this.form,'."'randomorder','settings'".');" '.$ro_set.' /> '.&mt('Random Order').' </label></span>'.
 $form_end;  $form_end; 
         }          }
     } elsif ($supplementalflag && !$allowed) {      } elsif ($supplementalflag && !$allowed) {
         my $isexttool;  
         if ($url=~m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {  
             $url='/adm/wrapper'.$url;  
             $isexttool = 1;  
         }  
         $url .= ($url =~ /\?/) ? '&amp;':'?';          $url .= ($url =~ /\?/) ? '&amp;':'?';
         $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');          $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');
         if ($title) {          if ($title) {
             $url .= '&amp;title='.&HTML::Entities::encode($renametitle,'<>&"');              $url .= '&amp;title='.&HTML::Entities::encode($renametitle,'<>&"');
         }          }
         if ((($isexternal) || ($isexttool)) && $orderidx) {          if ($isexternal && $orderidx) {
             $url .= '&amp;idx='.$orderidx;              $url .= '&amp;idx='.$orderidx;
         }          }
         if ($anchor ne '') {  
             $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');  
         }  
     }      }
     my ($tdalign,$tdwidth);      my ($tdalign,$tdwidth);
     if ($allowed) {      if ($allowed) {
Line 4283  $form_end; Line 3304  $form_end;
             &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));              &Apache::lonnet::declutter(&Apache::lonnet::filelocation('',$orig_url));
         if ($isexternal) {          if ($isexternal) {
             ($editlink,$extresform) =               ($editlink,$extresform) = 
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,                  &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem);
                                                      undef,undef,undef,undef,undef,undef,  
                                                      undef,$disabled);  
         } elsif ($orig_url =~ m{^/adm/$coursedom/$coursenum/\d+/ext\.tool$}) {  
             ($editlink,$extresform) =  
                 &Apache::lonextresedit::extedit_form(0,$residx,$orig_url,$title,$pathitem,  
                                                      undef,undef,undef,'tool',$coursedom,  
                                                      $coursenum,$ltitoolsref,$disabled);  
         } elsif (!$isfolder && !$ispage) {          } elsif (!$isfolder && !$ispage) {
             my ($cfile,$home,$switchserver,$forceedit,$forceview) =               my ($cfile,$home,$switchserver,$forceedit,$forceview) = 
                 &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);                  &Apache::lonnet::can_edit_resource($fileloc,$coursenum,$coursedom,$orig_url);
             if (($cfile ne '') && ($symb ne '' || $supplementalflag)) {              if (($cfile ne '') && ($symb ne '' || $supplementalflag)) {
                 my $suppanchor;  
                 if ($supplementalflag) {  
                     $suppanchor = $anchor;  
                 }  
                 my $jscall =                   my $jscall = 
                     &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,                      &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,
                                                             $switchserver,                                                              $switchserver,
                                                             $forceedit,                                                              $forceedit,
                                                             undef,$symb,                                                              undef,$symb,
                                                             &escape($env{'form.folderpath'}),                                                              &escape($env{'form.folderpath'}),
                                                             $renametitle,$hostname,                                                              $renametitle,'','',1);
                                                             '','',1,$suppanchor);  
                 if ($jscall) {                  if ($jscall) {
                     $editlink = '<a class="LC_docs_ext_edit" href="javascript:'.                      $editlink = '<a class="LC_docs_ext_edit" href="javascript:'.
                                 $jscall.'" >'.&mt('Edit').'</a>&nbsp;'."\n";                                  $jscall.'" >'.&mt('Edit').'</a>&nbsp;'."\n";
Line 4323  $form_end; Line 3332  $form_end;
         $reinit = &mt('(re-initialize course to access)');          $reinit = &mt('(re-initialize course to access)');
     }      }
     $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;      $line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink;
     my $link;  
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';         $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
     } elsif ($url) {      } elsif ($url) {
        if ($anchor ne '') {         $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes',
            if ($supplementalflag) {                                               '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500);
                $anchor = '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');  
            } else {  
                $anchor = '#'.&HTML::Entities::encode($anchor,'"<>&');  
            }  
        }  
   
        if ((!$supplementalflag) && ($nomodal) && ($hostname ne '')) {  
            $link = 'http://'.$hostname.$url;  
        } else {  
            $link = $url;  
        }  
        $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.$anchor);  
        if ($nomodal) {  
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.  
                   '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>';  
        } else {  
            $line.=&Apache::loncommon::modal_link($link,  
                                                  '<img src="'.$icon.'" alt="" class="LC_icon" />',600,500);  
        }  
     } else {      } else {
        $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';         $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
     }      }
Line 4355  $form_end; Line 3344  $form_end;
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {      if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
        $line.='<a href="'.$url.'">'.$title.'</a>';         $line.='<a href="'.$url.'">'.$title.'</a>';
     } elsif ($url) {      } elsif ($url) {
        if ($nomodal) {         $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes',
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.                                               $title,600,500);
                   $title.'</a>';  
        } else {  
            $line.=&Apache::loncommon::modal_link($link,$title,600,500);  
        }  
     } elsif (($hiddenfolder) || ($hiddenres)) {  
        $line.=$title.' <span class="LC_warning LC_docs_reinit_warn">('.&mt('Hidden').')</span>';  
     } else {      } else {
        $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';         $line.=$title.' <span class="LC_docs_reinit_warn">'.$reinit.'</span>';
     }      }
Line 4393  $form_end; Line 3376  $form_end;
     <form action="/adm/coursedocs" method="post" name="$formhidden">      <form action="/adm/coursedocs" method="post" name="$formhidden">
     $form_param      $form_param
     $form_common      $form_common
     <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext $disabled /> $lt{'hd'}</label>      <label><input type="checkbox" name="hiddenresource_$orderidx" id="hiddenresource_$orderidx" onclick="checkForSubmit(this.form,'hiddenresource','settings');" $hidtext /> $lt{'hd'}</label>
     $form_end      $form_end
     <br />      <br />
     <form action="/adm/coursedocs" method="post" name="$formurlhidden">      <form action="/adm/coursedocs" method="post" name="$formurlhidden">
     $form_param      $form_param
     $form_common      $form_common
     <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'encrypturl','settings');" $enctext $disabled /> $lt{'ec'}</label>      <label><input type="checkbox" name="encrypturl_$orderidx" id="encrypturl_$orderidx" onclick="checkForSubmit(this.form,'encrypturl','settings');" $enctext /> $lt{'ec'}</label>
     $form_end      $form_end
   </td>    </td>
   <td class="LC_docs_entry_parameter">$rand_pick_text<br />    <td class="LC_docs_entry_parameter">$rand_pick_text<br />
Line 4420  sub action_restrictions { Line 3403  sub action_restrictions {
     if ($url=~ m{^/res/.+\.(page|sequence)$}) {      if ($url=~ m{^/res/.+\.(page|sequence)$}) {
         # no copy for published maps          # no copy for published maps
         $denied{'copy'} = 1;          $denied{'copy'} = 1;
     } elsif ($url=~m{^/res/lib/templates/([^/]+)\.problem$}) {      } elsif ($url=~m{^/res/lib/templates/}) {
         unless ($1 eq 'simpleproblem') {         $denied{'copy'} = 1;
             $denied{'copy'} = 1;         $denied{'cut'} = 1;
         }  
         $denied{'cut'} = 1;  
     } elsif ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {      } elsif ($url eq "/uploaded/$cdom/$cnum/group_allfolders.sequence") {
         if ($folderpath =~ /^default&[^\&]+$/) {          if ($folderpath =~ /^default&[^\&]+$/) {
             if ((ref($currgroups) eq 'HASH') && (keys(%{$currgroups}) > 0)) {              if ((ref($currgroups) eq 'HASH') && (keys(%{$currgroups}) > 0)) {
Line 4480  sub new_timebased_suffix { Line 3461  sub new_timebased_suffix {
     if ($type eq 'paste') {      if ($type eq 'paste') {
         $prefix = $type;          $prefix = $type;
         $namespace = 'courseeditor';          $namespace = 'courseeditor';
         $idtype = 'addcode';  
     } elsif ($type eq 'map') {      } elsif ($type eq 'map') {
         $prefix = 'docs';          $prefix = 'docs';
         if ($area eq 'supplemental') {          if ($area eq 'supplemental') {
Line 4492  sub new_timebased_suffix { Line 3472  sub new_timebased_suffix {
         $prefix = $type;          $prefix = $type;
         $namespace = 'templated';          $namespace = 'templated';
     }      }
       $idtype = 'concat';
     my ($suffix,$freedlock,$error) =      my ($suffix,$freedlock,$error) =
         &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num,$idtype);          &Apache::lonnet::get_timebased_id($prefix,'num',$namespace,$dom,$num);
     if (!$suffix) {      if (!$suffix) {
         if ($type eq 'paste') {          if ($type eq 'paste') {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.');              $errtext = &mt('Failed to acquire a unique timestamp-based suffix when adding to the paste buffer.');
Line 4501  sub new_timebased_suffix { Line 3482  sub new_timebased_suffix {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');              $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new folder/page.');
         } 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.');
         } elsif ($type eq 'exttool') {  
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new external tool.');  
         } else {          } else {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new discussion board.');              $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new bulletin board.');
         }          }
         if ($error) {          if ($error) {
             $errtext .= '<br />'.$error;              $errtext .= '<br />'.$error;
         }          }
     }      }
     if ($freedlock ne 'ok') {      if ($freedlock ne 'ok') {
         $locknotfreed =          $locknotfreed = 
             '<div class="LC_error">'.              '<div class="LC_error">'.
             &mt('There was a problem removing a lockfile.').' ';              &mt('There was a problem removing a lockfile.').' ';
         if ($type eq 'paste') {          if ($type eq 'paste') {
             if ($freedlock eq 'nolock') {              &mt('This will prevent use of the paste buffer until th next log-in.');
                 $locknotfreed =  
                     '<div class="LC_error">'.  
                     &mt('A lockfile was not released when you added content to the clipboard earlier in this session.').' '.  
   
                     &mt('As a result addition of items to the clipboard will be unavailable until your next log-in.');  
             } else {  
                 $locknotfreed .=  
                     &mt('This will prevent addition of items to the clipboard until your next log-in.');  
             }  
         } elsif ($type eq 'map') {          } elsif ($type eq 'map') {
             $locknotfreed .=              &mt('This will prevent creation of additional folders or composite pages in this course.');
                 &mt('This will prevent creation of additional folders or composite pages in this course.');  
         } elsif ($type eq 'smppg') {          } elsif ($type eq 'smppg') {
             $locknotfreed .=              $locknotfreed .=
                 &mt('This will prevent creation of additional simple pages in this course.');                  &mt('This will prevent creation of additional simple pages in this course.');
         } elsif ($type eq 'exttool') {  
             $locknotfreed .=  
                 &mt('This will prevent creation of additional external tools in this course.');  
         } else {          } else {
             $locknotfreed .=              $locknotfreed .=
                 &mt('This will prevent creation of additional discussion boards in this course.');                  &mt('This will prevent creation of additional bulletin boards in this course.');
         }          }
         unless ($type eq 'paste') {          unless ($type eq 'paste') {
             $locknotfreed .=              $locknotfreed .=
                 ' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.',                  ' '.&mt('Please contact the domain coordinator for your LON-CAPA domain.');
                         '<a href="/adm/helpdesk" target="_helpdesk">','</a>');  
         }          }
         $locknotfreed .= '</div>';          $locknotfreed .= '</div>';
     }      }
Line 4584  sub untiehash { Line 3549  sub untiehash {
   
   
 sub checkonthis {  sub checkonthis {
     my ($r,$url,$level,$title,$checkstale)=@_;      my ($r,$url,$level,$title)=@_;
     $url=&unescape($url);      $url=&unescape($url);
     $alreadyseen{$url}=1;      $alreadyseen{$url}=1;
     $r->rflush();      $r->rflush();
Line 4599  sub checkonthis { Line 3564  sub checkonthis {
        $r->print('<a href="'.$url.'" target="cat">'.         $r->print('<a href="'.$url.'" target="cat">'.
  ($title?$title:$url).'</a> ');   ($title?$title:$url).'</a> ');
        if ($url=~/^\/res\//) {         if ($url=~/^\/res\//) {
           my $updated;  
           if (($checkstale) && ($url !~ m{^/res/lib/templates/}) &&  
               ($url !~ /\.\d+\.\w+$/)) {  
               $updated = &Apache::lonnet::remove_stale_resfile($url);  
           }  
   my $result=&Apache::lonnet::repcopy(    my $result=&Apache::lonnet::repcopy(
                               &Apache::lonnet::filelocation('',$url));                                &Apache::lonnet::filelocation('',$url));
           if ($result eq 'ok') {            if ($result eq 'ok') {
              $r->print('<span class="LC_success">'.&mt('ok').'</span>');               $r->print('<span class="LC_success">'.&mt('ok').'</span>');
              if ($updated) {  
                  $r->print('<br />');  
                  for (my $i=0;$i<=$level*5;$i++) {  
                      $r->print('&nbsp;');  
                  }  
                  $r->print('- '.&mt('Outdated copy removed'));  
              }  
              $r->rflush();               $r->rflush();
              &Apache::lonnet::countacc($url);               &Apache::lonnet::countacc($url);
              $url=~/\.(\w+)$/;               $url=~/\.(\w+)$/;
Line 4648  sub checkonthis { Line 3601  sub checkonthis {
                 &Apache::lonnet::metadata($url,'dependencies');                  &Apache::lonnet::metadata($url,'dependencies');
              foreach my $dep (split(/\,/,$dependencies)) {               foreach my $dep (split(/\,/,$dependencies)) {
  if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) {   if (($dep=~/^\/res\//) && (!$alreadyseen{$dep})) {
                     &checkonthis($r,$dep,$level+1,'',$checkstale);                      &checkonthis($r,$dep,$level+1);
                  }                   }
              }               }
           } elsif ($result eq 'unavailable') {            } elsif ($result eq 'unavailable') {
Line 4662  sub checkonthis { Line 3615  sub checkonthis {
           } else {            } else {
              $r->print('<span class="LC_error">'.&mt('access denied').'</span>');               $r->print('<span class="LC_error">'.&mt('access denied').'</span>');
           }            }
           if (($updated) && ($result ne 'ok')) {  
               $r->print('<br />'.&mt('Outdated copy removed'));  
           }  
        }         }
     }      }
 }  }
Line 4717  sub list_symbs { Line 3667  sub list_symbs {
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
 }  }
   
 sub short_urls {  
     my ($r,$canedit) = @_;  
     my $crstype = &Apache::loncommon::course_type();  
     my $formname = 'shortenurl';  
     $r->print(&Apache::loncommon::start_page('Display/Set Shortened URLs'));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Shortened URLs'));  
     $r->print(&startContentScreen('tools'));  
     my ($navmap,$errormsg) =  
         &Apache::loncourserespicker::get_navmap_object($crstype,'shorturls');  
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
     my (%maps,%resources,%titles);  
     if (!ref($navmap)) {  
         $r->print($errormsg.  
                   &endContentScreen());  
         return '';  
     } else {  
         $r->print('<h4 class="LC_info">'.&mt('Tiny URLs for deep-linking into course').'</h4>'."\n");  
         $r->rflush();  
         my $readonly;  
         if ($canedit) {  
             my ($numnew,$errors) = &Apache::loncommon::make_short_symbs($cdom,$cnum,$navmap);  
             if ($numnew) {  
                 $r->print('<p class="LC_info">'.&mt('Created [quant,_1,URL]',$numnew).'</p>');  
             }  
             if ((ref($errors) eq 'ARRAY') && (@{$errors} > 0)) {  
                 $r->print(&mt('The following errors occurred when processing your request to create shortened URLs:').'<br /><ul>');  
                 foreach my $error (@{$errors}) {  
                     $r->print('<li>'.$error.'</li>');  
                 }  
                 $r->print('</ul><br />');  
             }  
         } else {  
             $readonly = 1;  
         }  
         my %currtiny = &Apache::lonnet::dump('tiny',$cdom,$cnum);  
         $r->print(&Apache::loncourserespicker::create_picker($navmap,'shorturls',$formname,$crstype,undef,  
                                                              undef,undef,undef,undef,undef,\%currtiny,$readonly));  
     }  
     $r->print(&endContentScreen());  
 }  
   
 sub contentverifyform {  
     my ($r) = @_;  
     my $crstype = &Apache::loncommon::course_type();  
     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content'));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));  
     $r->print(&startContentScreen('tools'));  
     $r->print('<h4 class="LC_info">'.&mt($crstype.' content verification').'</h4>');  
     $r->print('<form method="post" action="/adm/coursedocs"><p>'.  
               &mt('Include a check if files copied from elsewhere are up to date (will increase verification time)?').  
               '&nbsp;<span class="LC_nobreak">'.  
               '<label><input type="radio" name="checkstale" value="0" checked="checked" />'.  
               &mt('No').'</label>'.('&nbsp;'x2).  
               '<label><input type="radio" name="checkstale" value="1" />'.  
               &mt('Yes').'</label></span></p><p>'.  
               '<input type="submit" value="'.&mt('Verify content').' "/>'.  
               '<input type="hidden" value="1" name="tools" />'.  
               '<input type="hidden" value="1" name="verify" /></p></form>');  
     $r->print(&endContentScreen());  
     return;  
 }  
   
 sub verifycontent {  sub verifycontent {
     my ($r,$checkstale) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content'));      $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Content'));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));      $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Content'));
Line 4802  sub verifycontent { Line 3690  sub verifycontent {
    }     }
        }         }
        if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {         if (($key=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$key})})) {
            &checkonthis($r,$hash{$key},0,$hash{'title_'.$1},$checkstale);             &checkonthis($r,$hash{$key},0,$hash{'title_'.$1});
        }         }
    }     }
    &untiehash();     &untiehash();
Line 4818  sub devalidateversioncache { Line 3706  sub devalidateversioncache {
 }  }
   
 sub checkversions {  sub checkversions {
     my ($r,$canedit) = @_;      my ($r) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $crstype Resource Versions"));      $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions"));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Resource Versions"));      $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions"));
     $r->print(&startContentScreen('tools'));      $r->print(&startContentScreen('tools'));
   
     my $header='';      my $header='';
Line 4839  sub checkversions { Line 3727  sub checkversions {
   
     $hashtied=0;      $hashtied=0;
     &tiehash();      &tiehash();
     if ($canedit) {      my %newsetversions=();
         my %newsetversions=();      if ($env{'form.setmostrecent'}) {
         if ($env{'form.setmostrecent'}) {   $haschanged=1;
     $haschanged=1;   foreach my $key (keys(%hash)) {
     foreach my $key (keys(%hash)) {      if ($key=~/^ids\_(\/res\/.+)$/) {
         if ($key=~/^ids\_(\/res\/.+)$/) {   $newsetversions{$1}='mostrecent';
     $newsetversions{$1}='mostrecent';                  &devalidateversioncache($1);
                     &devalidateversioncache($1);  
         }  
     }  
         } elsif ($env{'form.setcurrent'}) {  
     $haschanged=1;  
     foreach my $key (keys(%hash)) {  
         if ($key=~/^ids\_(\/res\/.+)$/) {  
     my $getvers=&Apache::lonnet::getversion($1);  
     if ($getvers>0) {  
         $newsetversions{$1}=$getvers;  
         &devalidateversioncache($1);  
     }  
         }  
     }      }
         } elsif ($env{'form.setversions'}) {   }
     $haschanged=1;      } elsif ($env{'form.setcurrent'}) {
     foreach my $key (keys(%env)) {   $haschanged=1;
         if ($key=~/^form\.set_version_(.+)$/) {   foreach my $key (keys(%hash)) {
     my $src=$1;      if ($key=~/^ids\_(\/res\/.+)$/) {
     if (($env{$key}) && ($env{$key} ne $setversions{$src})) {   my $getvers=&Apache::lonnet::getversion($1);
         $newsetversions{$src}=$env{$key};   if ($getvers>0) {
         &devalidateversioncache($src);      $newsetversions{$1}=$getvers;
     }      &devalidateversioncache($1);
         }   }
     }      }
         }   }
         if ($haschanged) {      } elsif ($env{'form.setversions'}) {
             if (&Apache::lonnet::put('resourceversions',\%newsetversions,   $haschanged=1;
       $env{'course.'.$env{'request.course.id'}.'.domain'},   foreach my $key (keys(%env)) {
       $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {      if ($key=~/^form\.set_version_(.+)$/) {
         $r->print(&Apache::loncommon::confirmwrapper(   my $src=$1;
                     &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved'))));   if (($env{$key}) && ($env{$key} ne $setversions{$src})) {
     } else {      $newsetversions{$src}=$env{$key};
         $r->print(&Apache::loncommon::confirmwrapper(      &devalidateversioncache($src);
                     &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1)));   }
     }      }
     &mark_hash_old();   }
         }  
         &changewarning($r,'');  
     }      }
       if ($haschanged) {
           if (&Apache::lonnet::put('resourceversions',\%newsetversions,
     $env{'course.'.$env{'request.course.id'}.'.domain'},
     $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
       $r->print(&Apache::loncommon::confirmwrapper(
                   &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved'))));
    } else {
       $r->print(&Apache::loncommon::confirmwrapper(
                   &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1)));
    }
    &mark_hash_old();
       }
       &changewarning($r,'');
     if ($env{'form.timerange'} eq 'all') {      if ($env{'form.timerange'} eq 'all') {
 # show all documents  # show all documents
  $header=&mt('All content in '.$crstype);   $header=&mt('All content in '.$crstype);
Line 4952  sub checkversions { Line 3838  sub checkversions {
        'save' => 'Save changes',         'save' => 'Save changes',
                'vers' => 'Version choice(s) for specific resources',                  'vers' => 'Version choice(s) for specific resources', 
        'act' => 'Actions');         'act' => 'Actions');
     my ($disabled,$readonly);  
     unless ($canedit) {  
         $disabled = 'disabled="disabled"';  
         $readonly = 1;  
     }  
     $r->print(<<ENDHEADERS);      $r->print(<<ENDHEADERS);
 <h4 class="LC_info">$header</h4>  <h4 class="LC_info">$header</h4>
 <form action="/adm/coursedocs" method="post">  <form action="/adm/coursedocs" method="post">
Line 4977  sub checkversions { Line 3858  sub checkversions {
 <div class="LC_left_float">  <div class="LC_left_float">
 <fieldset>  <fieldset>
 <legend>$lt{'act'}</legend>  <legend>$lt{'act'}</legend>
 $lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" $disabled /><br />  $lt{'sm'}: <input type="submit" name="setmostrecent" value="Go" /><br />
 $lt{'sc'}: <input type="submit" name="setcurrent" value="Go" $disabled />  $lt{'sc'}: <input type="submit" name="setcurrent" value="Go" />
 </fieldset>  </fieldset>
 </div>  </div>
 <br clear="all" />  <br clear="all" />
 <hr />  <hr />
 <h4>$lt{'vers'}</h4>  <h4>$lt{'vers'}</h4>
   <input type="submit" name="setversions" value="$lt{'save'}" />
 ENDHEADERS  ENDHEADERS
     #number of columns for version history      #number of columns for version history
     my %changedbytime;  
     foreach my $key (keys(%changes)) {  
         #excludes not versionable problems from resource version history:  
         next if ($key =~ /^\/res\/lib\/templates/);  
         my $chg;  
         if ($env{'form.timerange'} eq 'all') {  
             my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);  
             $chg = &Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate');  
         } else {  
             $chg = $changes{$key};  
             next if ($chg < $starttime);  
         }  
         push(@{$changedbytime{$chg}},$key);  
     }  
     if (keys(%changedbytime) == 0) {  
         &untiehash();  
         $r->print(&mt('No content changes in imported content in specified time frame').  
                   &endContentScreen());  
         return;  
     }  
     $r->print(      $r->print(
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$disabled.' />'.  
         &Apache::loncommon::start_data_table().          &Apache::loncommon::start_data_table().
         &Apache::loncommon::start_data_table_header_row().          &Apache::loncommon::start_data_table_header_row().
         '<th>'.&mt('Resources').'</th>'.          '<th>'.&mt('Resources').'</th>'.
Line 5017  ENDHEADERS Line 3878  ENDHEADERS
         '<th>'.&mt('History').'</th>'.          '<th>'.&mt('History').'</th>'.
         &Apache::loncommon::end_data_table_header_row()          &Apache::loncommon::end_data_table_header_row()
     );      );
     foreach my $chg (sort {$b <=> $a } keys(%changedbytime)) {      foreach my $key (sort(keys(%changes))) {
         foreach my $key (sort(@{$changedbytime{$chg}})) {          #excludes not versionable problems from resource version history:
             my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);          next unless ($changes{$key}>$starttime && $key !~ /^\/res\/lib\/templates/);
             my $currentversion=&Apache::lonnet::getversion($key);          my ($root,$extension)=($key=~/^(.*)\.(\w+)$/);
             if ($currentversion<0) {          my $currentversion=&Apache::lonnet::getversion($key);
                 $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';          if ($currentversion<0) {
             }              $currentversion='<span class="LC_error">'.&mt('Could not be determined.').'</span>';
             my $linkurl=&Apache::lonnet::clutter($key);          }
             $r->print(          my $linkurl=&Apache::lonnet::clutter($key);
                 &Apache::loncommon::start_data_table_row().          $r->print(
                 '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.              &Apache::loncommon::start_data_table_row().
                 '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.              '<td><b>'.&Apache::lonnet::gettitle($linkurl).'</b><br />'.
                 '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.              '<a href="'.$linkurl.'" target="cat">'.$linkurl.'</a></td>'.
                 &Apache::lonlocal::locallocaltime($chg).')</span></td>'.              '<td align="right">'.$currentversion.'<span class="LC_fontsize_medium"><br />('.
                 '<td align="right">'              &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')</span></td>'.
             );              '<td align="right">'
             # Used in course          );
             my $usedversion=$hash{'version_'.$linkurl};          # Used in course
             if (($usedversion) && ($usedversion ne 'mostrecent')) {          my $usedversion=$hash{'version_'.$linkurl};
           if (($usedversion) && ($usedversion ne 'mostrecent')) {
                 if ($usedversion != $currentversion) {                  if ($usedversion != $currentversion) {
                     $r->print('<span class="LC_warning">'.$usedversion.'</span>');                      $r->print('<span class="LC_warning">'.$usedversion.'</span>');
                 } else {                  } else {
Line 5044  ENDHEADERS Line 3906  ENDHEADERS
             } else {              } else {
                 $r->print($currentversion);                  $r->print($currentversion);
             }              }
             $r->print('</td><td title="'.$lt{'vu'}.'">');          $r->print('</td><td title="'.$lt{'vu'}.'">');
             # Set version          # Set version
             $r->print(&Apache::loncommon::select_form(          $r->print(&Apache::loncommon::select_form(
                       $setversions{$linkurl},              $setversions{$linkurl},
                       'set_version_'.$linkurl,              'set_version_'.$linkurl,
                       {'select_form_order' => ['',1..$currentversion,'mostrecent'],              {'select_form_order' => ['',1..$currentversion,'mostrecent'],
                        '' => '',               '' => '',
                        'mostrecent' => &mt('most recent'),               'mostrecent' => &mt('most recent'),
                        map {$_,$_} (1..$currentversion)},'',$readonly));               map {$_,$_} (1..$currentversion)}));
             my $lastold=1;          my $lastold=1;
             for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {          for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                 my $url=$root.'.'.$prevvers.'.'.$extension;              my $url=$root.'.'.$prevvers.'.'.$extension;
                 if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {              if (&Apache::lonnet::metadata($url,'lastrevisiondate')<$starttime) {
                     $lastold=$prevvers;                  $lastold=$prevvers;
                 }              }
             }          }
             $r->print('</td>');          $r->print('</td>');
             # List all available versions          # List all available versions
             $r->print('<td valign="top"><span class="LC_fontsize_medium">');          $r->print('<td valign="top"><span class="LC_fontsize_medium">');
             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {          for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
                 my $url=$root.'.'.$prevvers.'.'.$extension;              my $url=$root.'.'.$prevvers.'.'.$extension;
                 $r->print(              $r->print(
                     '<span class="LC_nobreak">'                  '<span class="LC_nobreak">'
                    .'<a href="'.&Apache::lonnet::clutter($url).'">'                 .'<a href="'.&Apache::lonnet::clutter($url).'">'
                    .&mt('Version [_1]',$prevvers).'</a>'                 .&mt('Version [_1]',$prevvers).'</a>'
                    .' ('.&Apache::lonlocal::locallocaltime(                 .' ('.&Apache::lonlocal::locallocaltime(
                          &Apache::lonnet::metadata($url,'lastrevisiondate'))                           &Apache::lonnet::metadata($url,'lastrevisiondate'))
                    .')');                 .')');
                 if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {              if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
                     $r->print(                  $r->print(
                         ' <a href="/adm/diff?filename='.                      ' <a href="/adm/diff?filename='.
                         &Apache::lonnet::clutter($root.'.'.$extension).                      &Apache::lonnet::clutter($root.'.'.$extension).
                         &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').                      &HTML::Entities::encode('&versionone='.$prevvers,'"<>&').
                         '" target="diffs">'.&mt('Diffs').'</a>');                      '" target="diffs">'.&mt('Diffs').'</a>');
                 }  
                 $r->print('</span><br />');  
             }              }
             $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());              $r->print('</span><br />');
         }          }
           $r->print('</span></td>'.&Apache::loncommon::end_data_table_row());
     }      }
     $r->print(      $r->print(
         &Apache::loncommon::end_data_table().          &Apache::loncommon::end_data_table().
         '<input type="submit" name="setversions" value="'.$lt{'save'}.'"'.$disabled.' />'.          '<input type="submit" name="setversions" value="'.$lt{'save'}.'" />'.
         '</form>'          '</form>'
     );      );
   
     &untiehash();      &untiehash();
     $r->print(&endContentScreen());      $r->print(&endContentScreen());
     return;  
 }  }
   
 sub mark_hash_old {  sub mark_hash_old {
Line 5147  $help{'Caching'}.'</p></form>'."\n\n"); Line 4007  $help{'Caching'}.'</p></form>'."\n\n");
   
   
 sub init_breadcrumbs {  sub init_breadcrumbs {
     my ($form,$text,$help)=@_;      my ($form,$text)=@_;
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1",
     text=>&Apache::loncommon::course_type().' Editor',      text=>&Apache::loncommon::course_type().' Editor',
     faq=>273,      faq=>273,
     bug=>'Instructor Interface',      bug=>'Instructor Interface',
                                             help => $help});                                              help => 'Docs_Adding_Course_Doc'});
     &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',      &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
     text=>$text,      text=>$text,
     faq=>273,      faq=>273,
Line 5189  sub startContentScreen { Line 4049  sub startContentScreen {
     if (($mode eq 'navmaps') || ($mode eq 'supplemental')) {      if (($mode eq 'navmaps') || ($mode eq 'supplemental')) {
         $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Overview').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Overview').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Search').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Search').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
           $output .= '<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Content Index').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
         $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';          $output .= '<li '.(($mode eq 'suppdocs')?' class="active"':'').'><a href="/adm/supplemental"><b>'.&mt('Supplemental Content').'</b></a></li>';
     } else {      } else {
         $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Main Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";          $output .= '<li '.(($mode eq 'docs')?' class="active"':'').' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.&mt('Main Content Editor').'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>'."\n";
Line 5232  sub handler { Line 4093  sub handler {
 #  #
 # --------------------------------------------- Initialize help topics for this  # --------------------------------------------- Initialize help topics for this
     foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',      foreach my $topic ('Adding_Course_Doc','Main_Course_Documents',
                        'Adding_External_Resource','Adding_External_Tool',                 'Adding_External_Resource','Navigate_Content',
                        'Navigate_Content','Adding_Folders','Docs_Overview',                 'Adding_Folders','Docs_Overview', 'Load_Map',
                        'Load_Map','Supplemental','Score_Upload_Form',                 'Supplemental','Score_Upload_Form','Adding_Pages',
                        'Adding_Pages','Importing_LON-CAPA_Resource',                 'Importing_LON-CAPA_Resource','Importing_IMS_Course',
                        'Importing_IMS_Course','Uploading_From_Harddrive',                         'Uploading_From_Harddrive',
                        'Course_Roster','Web_Page','Dropbox','Simple_Problem') {                 'Check_Resource_Versions','Verify_Content',
                          'Course_Roster','Web_Page','Dropbox') {
  $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 5245  sub handler { Line 4107  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(
Line 5252  sub handler { Line 4116  sub handler {
     $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');      $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');      $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
     
     my ($allowed,$canedit,$canview,$disabled);      my $allowed;
 # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.  # URI is /adm/supplemental when viewing supplemental docs in non-edit mode.
     unless ($r->uri eq '/adm/supplemental') {      unless ($r->uri eq '/adm/supplemental') {
         # does this user have privileges to modify content.            # does this user have privileges to modify content.  
         if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {          $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
             $allowed = 1;  
             $canedit = 1;  
             $canview = 1;  
         } elsif (&Apache::lonnet::allowed('cev',$env{'request.course.id'})) {  
             $allowed = 1;  
             $canview = 1;  
         }  
     }  
     unless ($canedit) {  
         $disabled = ' disabled="disabled"';  
     }  
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']);  
     if ($env{'form.inhibitmenu'}) {  
         unless ($env{'form.inhibitmenu'} eq 'yes') {  
             delete($env{'form.inhibitmenu'});  
         }  
     }      }
   
   if ($allowed && $env{'form.verify'}) {      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver',
       &init_breadcrumbs('verify','Verify Content','Docs_Verify_Content');                                              'inhibitmenu']);
       if (!$canedit) {    if ($allowed && $env{'form.chooseserver'}) {
           &verifycontent($r);        &choose_dump_server($r);
       } elsif (($env{'form.checkstale'} ne '') && ($env{'form.checkstale'} =~ /^\d$/)) {        return OK;
           &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1&verify=1&checkstale=$env{'form.checkstale'}",    } elsif ($allowed && $env{'form.verify'}) {
                                                   text=>'Results',        &init_breadcrumbs('verify','Verify Content');
                                                   faq=>273,        &verifycontent($r);
                                                   bug=>'Instructor Interface'});  
           &verifycontent($r,$env{'form.checkstale'});  
       } else {  
           &contentverifyform($r);  
       }  
   } elsif ($allowed && $env{'form.listsymbs'}) {    } elsif ($allowed && $env{'form.listsymbs'}) {
       &init_breadcrumbs('listsymbs','List Content IDs');        &init_breadcrumbs('listsymbs','List Content IDs');
       &list_symbs($r);        &list_symbs($r);
   } elsif ($allowed && $env{'form.shorturls'}) {  
       &init_breadcrumbs('shorturls','Set/Display Shortened URLs','Docs_Short_URLs');  
       &short_urls($r,$canedit);  
   } elsif ($allowed && $env{'form.docslog'}) {    } elsif ($allowed && $env{'form.docslog'}) {
       &init_breadcrumbs('docslog','Show Log');        &init_breadcrumbs('docslog','Show Log');
       my $folder = $env{'form.folder'};        my $folder = $env{'form.folder'};
       if ($folder eq '') {        if ($folder eq '') {
           $folder='default';            $folder='default';
       }        }
       &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit);        &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);
   } elsif ($allowed && $env{'form.versions'}) {    } elsif ($allowed && $env{'form.versions'}) {
       &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions');
       &checkversions($r,$canedit);        &checkversions($r);
   } elsif ($canedit && $env{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
Line 5321  sub handler { Line 4161  sub handler {
                                              'forcesupplement','forcestandard',                                               'forcesupplement','forcestandard',
                                              'tools','symb','command','supppath']);                                               'tools','symb','command','supppath']);
   
     foreach my $item ('forcesupplement','forcestandard','tools') {  
         next if ($env{'form.'.$item} eq '');  
         unless ($env{'form.'.$item} eq '1') {  
             delete($env{'form.'.$item});  
         }  
     }  
   
     if ($env{'form.command'}) {  
         unless ($env{'form.command'} =~ /^(direct|directnav|editdocs|editsupp|contents|home)$/) {  
             delete($env{'form.command'});  
         }  
     }  
   
     if ($env{'form.symb'}) {  
         my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'});  
         unless (($id =~ /^\d+$/) && (&Apache::lonnet::is_on_map($resurl))) {  
             delete($env{'form.symb'});  
         }  
     }  
   
 # standard=1: this is a "new-style" course with an uploaded map as top level  # standard=1: this is a "new-style" course with an uploaded map as top level
 # standard=2: this is a "old-style" course, and there is nothing we can do  # standard=2: this is a "old-style" course, and there is nothing we can do
   
Line 5351  sub handler { Line 4171  sub handler {
 # supplementalflag=0: show standard documents  # supplementalflag=0: show standard documents
 # toolsflag=1: show utilities  # toolsflag=1: show utilities
   
     my $unesc_folderpath = &unescape($env{'form.folderpath'});      $env{'form.folderpath'} = &unescape($env{'form.folderpath'});
     my $supplementalflag=($unesc_folderpath=~/^supplemental/);      my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/);
     if (($unesc_folderpath=~/^default/) || ($unesc_folderpath eq "")) {      if (($env{'form.folderpath'}=~/^default/) || ($env{'form.folderpath'} eq "")) {
        $supplementalflag=0;         $supplementalflag=0;
     }      }
     if ($env{'form.forcesupplement'}) { $supplementalflag=1; }      if ($env{'form.forcesupplement'}) { $supplementalflag=1; }
Line 5363  sub handler { Line 4183  sub handler {
     my $toolsflag=0;      my $toolsflag=0;
     if ($env{'form.tools'}) { $toolsflag=1; }      if ($env{'form.tools'}) { $toolsflag=1; }
   
     if ($env{'form.folderpath'} ne '') {  
         my @items = split(/\&/,$env{'form.folderpath'});  
         my $badpath;  
         for (my $i=0; $i<@items; $i++) {  
             my $odd = $i%2;  
             if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) {  
                 $badpath = 1;  
             } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) {  
                 $badpath = 1;  
             }  
             last if ($badpath);  
         }  
         if ($badpath) {  
             delete($env{'form.folderpath'});  
         }  
     }  
   
     if ($env{'form.supppath'} ne '') {  
         my @items = split(/\&/,$env{'form.supppath'});  
         my $badpath;  
         for (my $i=0; $i<@items; $i++) {  
             my $odd = $i%2;  
             if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {  
                 $badpath = 1;  
             }  
             last if ($badpath);  
         }  
         if ($badpath) {  
             delete($env{'form.supppath'});  
         }  
     }  
   
     my $script='';      my $script='';
     my $showdoc=0;      my $showdoc=0;
     my $addentries = {};      my $addentries = {};
     my $container;      my $container;
     my $containertag;      my $containertag;
     my $pathitem;      my $pathitem;
     my %ltitools;  
     my $hiddentop;  
     my $navmap;  
     my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) };  
   
 # Do we directly jump somewhere?  # Do we directly jump somewhere?
   
    if (($env{'form.command'} eq 'direct') || ($env{'form.command'} eq 'directnav')) {     if (($env{'form.command'} eq 'direct') || ($env{'form.command'} eq 'directnav')) {
        if ($env{'form.symb'} ne '') {         if ($env{'form.symb'} ne '') {
            $env{'form.folderpath'}=             $env{'form.folderpath'}=
                &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap);                 &Apache::loncommon::symb_to_docspath($env{'form.symb'});
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>             &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                $env{'form.command'}.'_'.$env{'form.symb'}});                 $env{'form.command'}.'_'.$env{'form.symb'}});
        } elsif ($env{'form.supppath'} ne '') {         } elsif ($env{'form.supppath'} ne '') {
Line 5419  sub handler { Line 4204  sub handler {
                $env{'form.command'}.'_'.$env{'form.supppath'}});                 $env{'form.command'}.'_'.$env{'form.supppath'}});
        }         }
    } elsif ($env{'form.command'} eq 'editdocs') {     } elsif ($env{'form.command'} eq 'editdocs') {
        $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap);         $env{'form.folderpath'} = 'default&'.
                                    &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_base();         $env{'form.folderpath'} = 'supplemental&'.
                                     &escape('Supplemental Content');
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'});         &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/supplemental'});
    } elsif ($env{'form.command'} eq 'contents') {     } elsif ($env{'form.command'} eq 'contents') {
        &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'});         &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} => '/adm/navmaps'});
Line 5441  sub handler { Line 4228  sub handler {
     if ((!$env{'form.folderpath'}) && $allowed) {      if ((!$env{'form.folderpath'}) && $allowed) {
         &Apache::loncommon::restore_course_settings($stored_folderpath,          &Apache::loncommon::restore_course_settings($stored_folderpath,
                                           {'folderpath' => 'scalar'});                                            {'folderpath' => 'scalar'});
           unless (&unescape($env{'form.folderpath'}) =~ m{^(default|supplemental)&}) {
         if (&unescape($env{'form.folderpath'}) =~ m{^(default|supplemental)&}) {  
             if ($supplementalflag) {  
                 undef($env{'form.folderpath'}) if ($1 eq 'default');  
             } else {  
                 undef($env{'form.folderpath'}) if ($1 eq 'supplemental');  
             }  
         } else {  
             undef($env{'form.folderpath'});              undef($env{'form.folderpath'});
         }          }
     }      }
Line 5465  sub handler { Line 4245  sub handler {
                                   .'&'.                                    .'&'.
                                   $env{'form.folderpath'};                                    $env{'form.folderpath'};
     }      }
 # If allowed and user's role is not advanced check folderpath is not hidden  
     if (($allowed) && (!$env{'request.role.adv'}) &&  
         ($env{'form.folderpath'} ne '') && (!$supplementalflag)) {  
         my $folderurl;  
         my @pathitems = split(/\&/,$env{'form.folderpath'});  
         my $folder = $pathitems[-2];  
         if ($folder eq '') {  
             undef($env{'form.folderpath'});  
         } else {  
             $folderurl = "uploaded/$coursedom/$coursenum/$folder";  
             if ((split(/\:/,$pathitems[-1]))[5]) {  
                 $folderurl .= '.page';  
             } else {  
                 $folderurl .= '.sequence';  
             }  
             unless (ref($navmap)) {  
                 $navmap = Apache::lonnavmaps::navmap->new();  
             }  
             if (ref($navmap)) {  
                 if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {  
                     my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);  
                     unless (@resources) {  
                         undef($env{'form.folderpath'});  
                     }  
                 }  
             }  
         }  
     }  
   
   
 # If after all of this, we still don't have any paths, make them  # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {      unless ($env{'form.folderpath'}) {
        if ($supplementalflag) {         if ($supplementalflag) {
           $env{'form.folderpath'}=&supplemental_base();            $env{'form.folderpath'}=&supplemental_base();
        } elsif ($allowed) {         } else {
           ($env{'form.folderpath'},$hiddentop) = &default_folderpath($coursenum,$coursedom,\$navmap);            $env{'form.folderpath'}='default&'.&escape(&mt('Main Content').
                                     ':::::');
        }         }
     }      }
   
 # Store this  # Store this
     unless ($toolsflag) {      unless ($toolsflag) {
         if (($allowed) && ($env{'form.folderpath'} ne '')) {          if ($allowed) {
             &Apache::loncommon::store_course_settings($stored_folderpath,              &Apache::loncommon::store_course_settings($stored_folderpath,
                                                       {'folderpath' => 'scalar'});                                                        {'folderpath' => 'scalar'});
         }          }
Line 5524  sub handler { Line 4275  sub handler {
         } else {          } else {
             if ($env{'form.folder'} eq '' ||              if ($env{'form.folder'} eq '' ||
                 $env{'form.folder'} eq 'supplemental') {                  $env{'form.folder'} eq 'supplemental') {
                 if ($env{'form.folder'} eq 'supplemental') {                  $folderpath='default&'.
                     $folderpath=&supplemental_base();                              &escape(&mt('Main Content').':::::');
                 } elsif (!$hiddentop) {  
                     $folderpath='default&'.  
                                  &escape(&mt('Main Content').':::::');  
                 }  
             }              }
         }          }
         $containertag = '<input type="hidden" name="folderpath" value="" />';          $containertag = '<input type="hidden" name="folderpath" value="" />';
Line 5540  sub handler { Line 4287  sub handler {
         if ($showdoc) { # got called in sequence from course          if ($showdoc) { # got called in sequence from course
     $allowed=0;       $allowed=0; 
         } else {          } else {
             if ($canedit) {              if ($allowed) {
                 &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);                  &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                 $script=&Apache::lonratedt::editscript('simple');                  $script=&Apache::lonratedt::editscript('simple');
             }              }
Line 5566  sub handler { Line 4313  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 5579  sub handler { Line 4324  sub handler {
                 }                  }
             }              }
             my $tabidstr = join("','",@tabids);              my $tabidstr = join("','",@tabids);
             %ltitools = &Apache::lonnet::get_domain_ltitools($coursedom);      $script .= &editing_js($udom,$uname,$supplementalflag).
             my $posslti = keys(%ltitools);  
             my $hostname = $r->hostname();  
             $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,  
                                    $canedit,$hostname,\$navmap).  
                        &history_tab_js().                         &history_tab_js().
                        &inject_data_js().                         &inject_data_js().
                        &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid).                         &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr).
                        &Apache::lonextresedit::extedit_javascript(\%ltitools);                         &Apache::lonextresedit::extedit_javascript();
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
                           };                            };
Line 5603  sub handler { Line 4344  sub handler {
               .'// <![CDATA['."\n"                .'// <![CDATA['."\n"
               .$script."\n"                .$script."\n"
               .'// ]]>'."\n"                .'// ]]>'."\n"
               .'</script>'."\n"                .'</script>'."\n";
               .'<script type="text/javascript" src="/res/adm/includes/file_upload.js"></script>'."\n";  
   
     # Breadcrumbs      # Breadcrumbs
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
Line 5612  sub handler { Line 4352  sub handler {
     if ($showdoc) {      if ($showdoc) {
         $r->print(&Apache::loncommon::start_page("$crstype documents",undef,          $r->print(&Apache::loncommon::start_page("$crstype documents",undef,
                                                 {'force_register' => $showdoc,}));                                                  {'force_register' => $showdoc,}));
     } elsif ($toolsflag) {  
         my ($breadtext,$breadtitle);  
         $breadtext = "$crstype Editor";  
         if ($canedit) {  
             $breadtitle = 'Editing '.$crstype.' Contents';  
         } else {  
             $breadtext .= ' (View-only mode)';  
             $breadtitle = 'Viewing '.$crstype.' Contents';  
         }  
         &Apache::lonhtmlcommon::add_breadcrumb({  
             href=>"/adm/coursedocs",text=>$breadtext});  
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script)  
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')  
                  .&Apache::lonhtmlcommon::breadcrumbs(  
                      $breadtitle)  
                  );  
     } elsif ($r->uri eq '/adm/supplemental') {      } elsif ($r->uri eq '/adm/supplemental') {
         my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);          my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype);
         $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,          $r->print(&Apache::loncommon::start_page("Supplemental $crstype Content",undef,
                                                 {'bread_crumbs' => $brcrum,}));                                                  {'bread_crumbs' => $brcrum,}));
     } else {      } else {
         my ($breadtext,$breadtitle,$helpitem);  
         $breadtext = "$crstype Editor";  
         if ($canedit) {  
             $breadtitle = 'Editing '.$crstype.' Contents';  
             $helpitem = 'Docs_Adding_Course_Doc';  
         } else {  
             $breadtext .= ' (View-only mode)';  
             $breadtitle = 'Viewing '.$crstype.' Contents';  
             $helpitem = 'Docs_Viewing_Course_Doc';  
         }  
         &Apache::lonhtmlcommon::add_breadcrumb({          &Apache::lonhtmlcommon::add_breadcrumb({
             href=>"/adm/coursedocs",text=>$breadtext});              href=>"/adm/coursedocs",text=>"$crstype Contents"});
         $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,          $r->print(&Apache::loncommon::start_page("$crstype Contents", $script,
                                                  {'add_entries'    => $addentries}                                                   {'add_entries'    => $addentries}
                                                 )                                                  )
                  .&Apache::loncommon::help_open_menu('','',273,'RAT')                   .&Apache::loncommon::help_open_menu('','',273,'RAT')
                  .&Apache::lonhtmlcommon::breadcrumbs(                   .&Apache::lonhtmlcommon::breadcrumbs(
                      $breadtitle,                       'Editing '.$crstype.' Contents',
                      $helpitem)                       'Docs_Adding_Course_Doc')
         );          );
     }      }
   
   my %allfiles = ();    my %allfiles = ();
   my %codebase = ();    my %codebase = ();
   my ($upload_result,$upload_output,$uploadphase);    my ($upload_result,$upload_output,$uploadphase);
   if ($canedit) {    if ($allowed) {
       if (($env{'form.uploaddoc.filename'}) &&        if (($env{'form.uploaddoc.filename'}) &&
   ($env{'form.cmd'}=~/^upload_(\w+)/)) {    ($env{'form.cmd'}=~/^upload_(\w+)/)) {
           my $context = $1;             my $context = $1; 
Line 5666  sub handler { Line 4380  sub handler {
   undef($hadchanges);    undef($hadchanges);
           $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,            $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom,
                                               \%allfiles,\%codebase,$context,$crstype);                                                \%allfiles,\%codebase,$context,$crstype);
           undef($navmap);  
   if ($hadchanges) {    if ($hadchanges) {
       &mark_hash_old();        &mark_hash_old();
   }    }
Line 5711  sub handler { Line 4424  sub handler {
   
   if ($allowed && $toolsflag) {    if ($allowed && $toolsflag) {
       $r->print(&startContentScreen('tools'));        $r->print(&startContentScreen('tools'));
       $r->print(&generate_admin_menu($crstype,$canedit));        $r->print(&generate_admin_menu($crstype));
       $r->print(&endContentScreen());        $r->print(&endContentScreen());
   } elsif ((!$showdoc) && (!$uploadphase)) {    } elsif ((!$showdoc) && (!$uploadphase)) {
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
Line 5723  sub handler { Line 4436  sub handler {
                 'impo' => 'Import',                  'impo' => 'Import',
  'lnks' => 'Import from Stored Links',   'lnks' => 'Import from Stored Links',
                 'impm' => 'Import from Assembled Map',                  'impm' => 'Import from Assembled Map',
                 'extr' => 'External Resource',  
                 'extt' => 'External Tool',   
                 'selm' => 'Select Map',                  'selm' => 'Select Map',
                 'load' => 'Load Map',                  'load' => 'Load Map',
                 'newf' => 'New Folder',                  'newf' => 'New Folder',
Line 5733  sub handler { Line 4444  sub handler {
                 'navc' => 'Table of Contents',                  'navc' => 'Table of Contents',
                 'sipa' => 'Simple Course Page',                  'sipa' => 'Simple Course Page',
                 'sipr' => 'Simple Problem',                  'sipr' => 'Simple Problem',
                 'webp' => 'Blank Web Page (editable)',                  'webp' => 'Blank Web Page (editable)', 
                 'drbx' => 'Drop Box',                  'drbx' => 'Drop Box',
                 'scuf' => 'External Scores (handgrade, upload, clicker)',                  'scuf' => 'External Scores (handgrade, upload, clicker)',
                 'bull' => 'Discussion Board',                  'bull' => 'Discussion Board',
Line 5749  sub handler { Line 4460  sub handler {
                 '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',  
                 'er' => 'Editing rights unavailable for your current role.',  
         );  
 # -----------------------------------------------------------------------------  # -----------------------------------------------------------------------------
     # Calculate free quota space for a user or course. A javascript function checks  
     # file size to determine if upload should be allowed.  
     my $quotatype = 'unofficial';  
     if ($crstype eq 'Community') {  
         $quotatype = 'community';  
     } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.coursecode'}) {  
         $quotatype = 'official';  
     } elsif ($env{'course.'.$coursedom.'_'.$coursenum.'.internal.textbook'}) {  
         $quotatype = 'textbook';  
     }  
     my $disk_quota = &Apache::loncommon::get_user_quota($coursenum,$coursedom,  
                      'course',$quotatype); # expressed in MB  
     my $current_disk_usage = 0;  
     foreach my $subdir ('docs','supplemental') {  
         $current_disk_usage += &Apache::lonnet::diskusage($coursedom,$coursenum,  
                                "userfiles/$subdir",1); # expressed in kB  
     }  
     my $free_space = 1024 * ((1024 * $disk_quota) - $current_disk_usage);  
     my $usage = $current_disk_usage/1024; # in MB  
     my $quota = $disk_quota;  
     my $percent;  
     if ($disk_quota == 0) {  
         $percent = 100.0;  
     } else {  
         $percent = 100*($usage/$disk_quota);  
     }  
     $usage = sprintf("%.2f",$usage);  
     $quota = sprintf("%.2f",$quota);  
     $percent = sprintf("%.0f",$percent);  
     my $quotainfo = '<p>'.&mt('Currently using [_1] of the [_2] available.',  
                               $percent.'%',$quota.' MB').'</p>';  
   
  my $fileupload=(<<FIUP);   my $fileupload=(<<FIUP);
         $quotainfo  
  $lt{'file'}:<br />   $lt{'file'}:<br />
  <input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled />   <input type="file" name="uploaddoc" size="40" />
         <input type="hidden" id="LC_free_space" value="$free_space" />  
 FIUP  FIUP
   
  my $checkbox=(<<CHBO);   my $checkbox=(<<CHBO);
Line 5800  FIUP Line 4472  FIUP
  <input type="checkbox" name="parserflag" />   <input type="checkbox" name="parserflag" />
  </label> -->   </label> -->
  <label>   <label>
  <input type="checkbox" name="parserflag" checked="checked" $disabled /> $lt{'parse'}   <input type="checkbox" name="parserflag" checked="checked" /> $lt{'parse'}
  </label>   </label>
 CHBO  CHBO
         my $imsfolder = $env{'form.folder'};          my $imsfolder = $env{'form.folder'};
Line 5817  CHBO Line 4489  CHBO
         <br />          <br />
         <p>          <p>
         $lt{'cms'}:&nbsp;           $lt{'cms'}:&nbsp; 
         <select name="source" $disabled>          <select name="source">
         <option value="-1" selected="selected">$lt{'se'}</option>          <option value="-1" selected="selected">$lt{'se'}</option>
         <option value="bb5">$lt{'bb5'}</option>          <option value="bb5">Blackboard 5</option>
         <option value="bb6">$lt{'bb6'}</option>          <option value="bb6">Blackboard 6</option>
         <option value="angel5">$lt{'angel5'}</option>          <option value="angel5">ANGEL 5.5</option>
         <option value="webctce4">$lt{'webctce4'}</option>          <option value="webctce4">WebCT 4 Campus Edition</option>
         </select>          </select>
         <input type="hidden" name="folder" value="$imsfolder" />          <input type="hidden" name="folder" value="$imsfolder" />
         </p>          </p>
         <input type="hidden" name="phase" value="one" />          <input type="hidden" name="phase" value="one" />
         <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" $disabled />          <input type="button" value="$lt{'imsl'}" onclick="makeims(this.form);" />
         </fieldset>          </fieldset>
         </form>          </form>
 IMSFORM  IMSFORM
Line 5842  IMSFORM Line 4514  IMSFORM
  $fileupload   $fileupload
  <br />   <br />
  $lt{'title'}:<br />   $lt{'title'}:<br />
  <input type="text" size="60" name="comment" $disabled />   <input type="text" size="60" name="comment" />
  $pathitem   $pathitem
  <input type="hidden" name="cmd" value="upload_default" />   <input type="hidden" name="cmd" value="upload_default" />
  <br />   <br />
Line 5850  IMSFORM Line 4522  IMSFORM
  $checkbox   $checkbox
  </span>   </span>
         <br clear="all" />          <br clear="all" />
         <input type="submit" value="$lt{'upld'}" $disabled />          <input type="submit" value="$lt{'upld'}" />
         </fieldset>          </fieldset>
         </form>          </form>
 FUFORM  FUFORM
   
         my $mapimportjs;  
         if ($canedit) {  
             $mapimportjs = "javascript:openbrowser('mapimportform','importmap','sequence,page','');";  
         } else {  
             $mapimportjs = "javascript:alert('".&js_escape($lt{'er'})."');";  
         }  
  my $importpubform=(<<SEDFFORM);   my $importpubform=(<<SEDFFORM);
         <a class="LC_menubuttons_link" href="javascript:toggleMap('map');">          <a class="LC_menubuttons_link" href="javascript:toggleMap('map');">
         $lt{'impm'}</a>$help{'Load_Map'}          $lt{'impm'}</a>$help{'Load_Map'}
Line 5871  FUFORM Line 4537  FUFORM
         $lt{'copm'}<br />          $lt{'copm'}<br />
         <span class="LC_nobreak">          <span class="LC_nobreak">
         <input type="text" name="importmap" size="40" value=""           <input type="text" name="importmap" size="40" value="" 
         onfocus="this.blur();$mapimportjs" $disabled />          onfocus="this.blur();openbrowser('mapimportform','importmap','sequence,page','');" />
         &nbsp;<a href="$mapimportjs">$lt{'selm'}</a></span><br />          &nbsp;<a href="javascript:openbrowser('mapimportform','importmap','sequence,page','');">$lt{'selm'}</a></span><br />
         <input type="submit" name="loadmap" value="$lt{'load'}" $disabled />          <input type="submit" name="loadmap" value="$lt{'load'}" />
         </fieldset>          </fieldset>
         </form>          </form>
   
 SEDFFORM  SEDFFORM
   
         my $fromstoredjs;  
         if ($canedit) {  
             $fromstoredjs = 'open_StoredLinks_Import()';  
         } else {  
             $fromstoredjs = "alert('".&js_escape($lt{'er'})."')";  
         }  
   
  my @importpubforma = (   my @importpubforma = (
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'"  onclick="javascript:groupsearch()" />' => $pathitem."<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'"  onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" },
  { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:'.$fromstoredjs.';" />' => '<a class="LC_menubuttons_link" href="javascript:'.$fromstoredjs.';">'.$lt{'lnks'}.'</a>' },   { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{lnks}.'" onclick="javascript:open_StoredLinks_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_StoredLinks_Import();'>$lt{'lnks'}</a>" },
         { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform }          { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform }
  );   );
  $importpubform = &create_form_ul(&create_list_elements(@importpubforma));   $importpubform = &create_form_ul(&create_list_elements(@importpubforma));
         my $extresourcesform =          my $extresourcesform =
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,              &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Resource'},                                                   $help{'Adding_External_Resource'});
                                                  undef,undef,undef,undef,undef,undef,$disabled);  
         my $exttoolform =  
             &Apache::lonextresedit::extedit_form(0,0,undef,undef,$pathitem,  
                                                  $help{'Adding_External_Tool'},undef,  
                                                  undef,'tool',$coursedom,$coursenum,  
                                                  \%ltitools,$disabled);  
     if ($allowed) {      if ($allowed) {
         my $folder = $env{'form.folder'};          my $folder = $env{'form.folder'};
         if ($folder eq '') {          if ($folder eq '') {
             $folder='default';              $folder='default';
         }          }
         if ($canedit) {   my $output = &update_paste_buffer($coursenum,$coursedom,$folder);
     my $output = &update_paste_buffer($coursenum,$coursedom,$folder);          if ($output) {
             if ($output) {              $r->print($output);
                 $r->print($output);  
             }  
         }          }
  $r->print(<<HIDDENFORM);   $r->print(<<HIDDENFORM);
  <form name="renameform" method="post" action="/adm/coursedocs">   <form name="renameform" method="post" action="/adm/coursedocs">
Line 5945  HIDDENFORM Line 4595  HIDDENFORM
 #  #
   
     my $savefolderpath;      my $savefolderpath;
     my $hostname = $r->hostname();  
   
     if ($allowed) {      if ($allowed) {
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        if ((($folder eq '') && (!$hiddentop)) || ($supplementalflag)) {         if ($folder eq '' || $supplementalflag) {
            $folder='default';             $folder='default';
    $savefolderpath = $env{'form.folderpath'};     $savefolderpath = $env{'form.folderpath'};
    $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'));     $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'));
Line 5973  HIDDENFORM Line 4622  HIDDENFORM
   
  my $newnavform=(<<NNFORM);   my $newnavform=(<<NNFORM);
  <form action="/adm/coursedocs" method="post" name="newnav">   <form action="/adm/coursedocs" method="post" name="newnav">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'navc'}=/adm/navmaps" />   value="$lt{'navc'}=/adm/navmaps" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newnav);">$lt{'navc'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newnav.submit()">$lt{'navc'}</a>
  $help{'Navigate_Content'}   $help{'Navigate_Content'}
  </form>   </form>
 NNFORM  NNFORM
  my $newsmppageform=(<<NSPFORM);   my $newsmppageform=(<<NSPFORM);
  <form action="/adm/coursedocs" method="post" name="newsmppg">   <form action="/adm/coursedocs" method="post" name="newsmppg">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>   <a class="LC_menubuttons_link" href="javascript:makesmppage();"> $lt{'sipa'}</a>
Line 5997  NSPFORM Line 4646  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 6024  NEXUFORM Line 4673  NEXUFORM
   
  my $newbulform=(<<NBFORM);   my $newbulform=(<<NBFORM);
  <form action="/adm/coursedocs" method="post" name="newbul">   <form action="/adm/coursedocs" method="post" name="newbul">
  <input type="hidden" name="active" value="dd" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>   <a class="LC_menubuttons_link" href="javascript:makebulboard();" >$lt{'bull'}</a>
Line 6034  NBFORM Line 4683  NBFORM
   
  my $newaboutmeform=(<<NAMFORM);   my $newaboutmeform=(<<NAMFORM);
  <form action="/adm/coursedocs" method="post" name="newaboutme">   <form action="/adm/coursedocs" method="post" name="newaboutme">
  <input type="hidden" name="active" value="dd" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newaboutme);">$lt{'mypi'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newaboutme.submit()">$lt{'mypi'}</a>
  $help{'My Personal Information Page'}   $help{'My Personal Information Page'}
  </form>   </form>
 NAMFORM  NAMFORM
   
  my $newaboutsomeoneform=(<<NASOFORM);   my $newaboutsomeoneform=(<<NASOFORM);
  <form action="/adm/coursedocs" method="post" name="newaboutsomeone">   <form action="/adm/coursedocs" method="post" name="newaboutsomeone">
  <input type="hidden" name="active" value="dd" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>   <a class="LC_menubuttons_link" href="javascript:makeabout();">$lt{'abou'}</a>
Line 6054  NASOFORM Line 4703  NASOFORM
   
  my $newrosterform=(<<NROSTFORM);   my $newrosterform=(<<NROSTFORM);
  <form action="/adm/coursedocs" method="post" name="newroster">   <form action="/adm/coursedocs" method="post" name="newroster">
  <input type="hidden" name="active" value="dd" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'rost'}=/adm/viewclasslist" />   value="$lt{'rost'}=/adm/viewclasslist" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newroster);">$lt{'rost'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newroster.submit()">$lt{'rost'}</a>
  $help{'Course_Roster'}   $help{'Course Roster'}
  </form>   </form>
 NROSTFORM  NROSTFORM
   
Line 6075  NROSTFORM Line 4724  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="ee" />          <input type="hidden" name="active" value="cc" />
         $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>
Line 6099  my $newfolderb; Line 4748  my $newfolderb;
  <form action="/adm/coursedocs" method="post" name="newpage">   <form action="/adm/coursedocs" method="post" name="newpage">
  <input type="hidden" name="folderpath" value="$path" />   <input type="hidden" name="folderpath" value="$path" />
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="cc" />
  <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>   <a class="LC_menubuttons_link" href="javascript:makenewpage(document.newpage,'$pageseq');">$lt{'newp'}</a>
  $help{'Adding_Pages'}   $help{'Adding_Pages'}
  </form>   </form>
Line 6110  NPFORM Line 4759  NPFORM
  <form action="/adm/coursedocs" method="post" name="newfolder">   <form action="/adm/coursedocs" method="post" name="newfolder">
  $pathitem   $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <input type="hidden" name="active" value="" />   <input type="hidden" name="active" value="aa" />
  <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}   <a href="javascript:makenewfolder(document.newfolder,'$folderseq');">$lt{'newf'}</a>$help{'Adding_Folders'}
  </form>   </form>
 NFFORM  NFFORM
   
  my $newsylform=(<<NSYLFORM);   my $newsylform=(<<NSYLFORM);
  <form action="/adm/coursedocs" method="post" name="newsyl">   <form action="/adm/coursedocs" method="post" name="newsyl">
  <input type="hidden" name="active" value="ee" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />   value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newsyl);">$lt{'syll'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newsyl.submit()">$lt{'syll'}</a>
  $help{'Syllabus'}   $help{'Syllabus'}
   
  </form>   </form>
Line 6129  NSYLFORM Line 4778  NSYLFORM
   
  my $newgroupfileform=(<<NGFFORM);   my $newgroupfileform=(<<NGFFORM);
  <form action="/adm/coursedocs" method="post" name="newgroupfiles">   <form action="/adm/coursedocs" method="post" name="newgroupfiles">
  <input type="hidden" name="active" value="dd" />   <input type="hidden" name="active" value="cc" />
  $pathitem   $pathitem
  <input type="hidden" name="importdetail"   <input type="hidden" name="importdetail"
  value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />   value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.newgroupfiles);">$lt{'grpo'}</a>   <a class="LC_menubuttons_link" href="javascript:document.newgroupfiles.submit()">$lt{'grpo'}</a>
  $help{'Group Portfolio'}   $help{'Group Portfolio'}
  </form>   </form>
 NGFFORM  NGFFORM
  @specialdocumentsforma=(   @specialdocumentsforma=(
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'"  onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.newsyl);" />'=>$newsylform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="javascript:makenew(document.newnav);" />'=>$newnavform},   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage();" />'=>$newwebpageform},
         );          );
Line 6150  NGFFORM Line 4799  NGFFORM
         my @importdoc = (          my @importdoc = (
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform}          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleUpload(\'ext\');" />'=>$extresourcesform}
         );          );
         if (keys(%ltitools)) {  
             push(@importdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleUpload(\'tool\');" />'=>$exttoolform},  
         );  
         }  
         unless ($container eq 'page') {          unless ($container eq 'page') {
             push(@importdoc,              push(@importdoc,
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform}                  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:toggleUpload(\'ims\');" />'=>$imspform}
             );              );
         }          }
         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 6177  NGFFORM Line 4821  NGFFORM
        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="javascript:makenew(document.newroster);" />'=>$newrosterform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="javascript:makenew(document.newgroupfiles);" />'=>$newgroupfileform},          {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform},
         );          );
         $communityform = &create_form_ul(&create_list_elements(@communityforma));          $communityform = &create_form_ul(&create_list_elements(@communityforma));
   
Line 6196  unless ($container eq 'page') { Line 4840  unless ($container eq 'page') {
  $hadchanges=0;   $hadchanges=0;
        unless (($supplementalflag || $toolsflag)) {         unless (($supplementalflag || $toolsflag)) {
           my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,            my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                               $supplementalflag,\%orderhash,$iconpath,$pathitem,                                $supplementalflag,\%orderhash,$iconpath,$pathitem);
                               \%ltitools,$canedit,$hostname,\$navmap,$hiddentop);  
           undef($navmap);  
           if ($error) {            if ($error) {
              $r->print('<p><span class="LC_error">'.$error.'</span></p>');               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
           }            }
           if ($hadchanges) {            if ($hadchanges) {
              unless (&is_hash_old()) {               &mark_hash_old();
                  &mark_hash_old();  
              }  
           }            }
   
           &changewarning($r,'');            &changewarning($r,'');
Line 6255  SUPDOCFORM Line 4895  SUPDOCFORM
   
  my $supnewfolderform=(<<SNFFORM);   my $supnewfolderform=(<<SNFFORM);
  <form action="/adm/coursedocs" method="post" name="supnewfolder">   <form action="/adm/coursedocs" method="post" name="supnewfolder">
  <input type="hidden" name="active" value="" />   <input type="hidden" name="active" value="ee" />
         $pathitem          $pathitem
  <input type="hidden" name="importdetail" value="" />   <input type="hidden" name="importdetail" value="" />
  <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a>    <a class="LC_menubuttons_link" href="javascript:makenewfolder(document.supnewfolder,'$folderseq');">$lt{'newf'}</a> 
Line 6265  SNFFORM Line 4905  SNFFORM
   
         my $supextform =          my $supextform =
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,              &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,
                                                  $help{'Adding_External_Resource'},                                                   $help{'Adding_External_Resource'});
                                                  undef,undef,$disabled);  
         my $supexttoolform =  
             &Apache::lonextresedit::extedit_form(1,0,undef,undef,$pathitem,  
                                                  $help{'Adding_External_Tool'},  
                                                  undef,undef,'tool',$coursedom,  
                                                  $coursenum,\%ltitools,$disabled);  
   
  my $supnewsylform=(<<SNSFORM);   my $supnewsylform=(<<SNSFORM);
  <form action="/adm/coursedocs" method="post" name="supnewsyl">   <form action="/adm/coursedocs" method="post" name="supnewsyl">
Line 6279  SNFFORM Line 4913  SNFFORM
         $pathitem          $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="Syllabus=/public/$coursedom/$coursenum/syllabus" />   value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.supnewsyl);">$lt{'syll'}</a>   <a class="LC_menubuttons_link" href="javascript:document.supnewsyl.submit()">$lt{'syll'}</a>
  $help{'Syllabus'}   $help{'Syllabus'}
  </form>   </form>
 SNSFORM  SNSFORM
Line 6290  SNSFORM Line 4924  SNSFORM
         $pathitem          $pathitem
  <input type="hidden" name="importdetail"    <input type="hidden" name="importdetail" 
  value="$plainname=/adm/$udom/$uname/aboutme" />   value="$plainname=/adm/$udom/$uname/aboutme" />
  <a class="LC_menubuttons_link" href="javascript:makenew(document.supnewaboutme);">$lt{'mypi'}</a>   <a class="LC_menubuttons_link" href="javascript:document.supnewaboutme.submit()">$lt{'mypi'}</a>
  $help{'My Personal Information Page'}   $help{'My Personal Information Page'}
  </form>   </form>
 SNAMFORM  SNAMFORM
Line 6311  SNAMFORM Line 4945  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
   
   
 my @specialdocs = (  my @specialdocs = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="javascript:makenew(document.supnewsyl);" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.supnewsyl.submit()" />'
             =>$supnewsylform},              =>$supnewsylform},
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makenew(document.supnewaboutme);" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="document.supnewaboutme.submit()" />'
             =>$supnewaboutmeform},              =>$supnewaboutmeform},
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage('."'supp'".');" />'=>$supwebpageform},                  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/webpage.png" alt="'.$lt{webp}.'" onclick="javascript:makewebpage('."'supp'".');" />'=>$supwebpageform},
   
  );   );
 my @supimportdoc = (  my @supimportdoc = (
  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'   {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleUpload(\'suppext\')" />'
             =>$supextform});              =>$supextform},
         if (keys(%ltitools)) {  
             push(@supimportdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleUpload(\'supptool\')" />'  
             =>$supexttoolform});  
         }  
         push(@supimportdoc,  
                 {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'suppdoc\');" />'                  {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'suppdoc\');" />'
             =>$supupdocform},              =>$supupdocform},
         );                     );
   
 $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));  $supupdocform =  &create_form_ul(&create_list_elements(@supimportdoc));
 my %suporderhash = (  my %suporderhash = (
Line 6345  my %suporderhash = ( Line 4973  my %suporderhash = (
                 );                  );
         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);
                                \%ltitools,$canedit,$hostname);  
            if ($error) {             if ($error) {
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');                $r->print('<p><span class="LC_error">'.$error.'</span></p>');
            } else {  
                if ($suppchanges) {  
                    my %servers = &Apache::lonnet::internet_dom_servers($coursedom);  
                    my @ids=&Apache::lonnet::current_machine_ids();  
                    foreach my $server (keys(%servers)) {  
                        next if (grep(/^\Q$server\E$/,@ids));  
                        my $hashid=$coursenum.':'.$coursedom;  
                        my $cachekey = &escape('suppcount').':'.&escape($hashid);  
                        &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);  
                    }  
                    &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);  
                    undef($suppchanges);  
                }  
            }             }
         }          }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
         my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,          my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype,
                             $supplementalflag,'',$iconpath,$pathitem,'',$hostname);                              $supplementalflag,'',$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>');
         }          }
Line 6400  my %suporderhash = ( Line 5014  my %suporderhash = (
 sub embedded_form_elems {  sub embedded_form_elems {
     my ($phase,$primaryurl,$newidx) = @_;      my ($phase,$primaryurl,$newidx) = @_;
     my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');      my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"');
     $newidx =~s /\D+//g;  
     return <<STATE;      return <<STATE;
     <input type="hidden" name="folderpath" value="$folderpath" />      <input type="hidden" name="folderpath" value="$folderpath" />
     <input type="hidden" name="cmd" value="upload_embedded" />      <input type="hidden" name="cmd" value="upload_embedded" />
Line 6421  sub embedded_destination { Line 5034  sub embedded_destination {
     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {      } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
         $destination .=  $2.'/';          $destination .=  $2.'/';
     }      }
     my $newidx = $env{'form.newidx'};      $destination .= $env{'form.newidx'};
     $newidx =~s /\D+//g;  
     if ($newidx) {  
         $destination .= $newidx;  
     }  
     my $dir_root = '/userfiles';      my $dir_root = '/userfiles';
     return ($destination,$dir_root);      return ($destination,$dir_root);
 }  }
Line 6445  sub decompression_info { Line 5054  sub decompression_info {
     my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};      my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
     my $container='sequence';      my $container='sequence';
     my ($pathitem,$hiddenelem);      my ($pathitem,$hiddenelem);
     my @hiddens = ('newidx','comment','position','folderpath','archiveurl');      my @hiddens = ('newidx','comment','position','folderpath');
     if ($env{'form.folderpath'} =~ /\:1$/) {      if ($env{'form.folderpath'} =~ /\:1$/) {
         $container='page';          $container='page';
     }      }
     unshift(@hiddens,$pathitem);      unshift(@hiddens,$pathitem);
     foreach my $item (@hiddens) {      foreach my $item (@hiddens) {
         if ($item eq 'newidx') {  
             next if ($env{'form.'.$item} =~ /\D/);  
         }  
         if ($env{'form.'.$item}) {          if ($env{'form.'.$item}) {
             $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.              $hiddenelem .= '<input type="hidden" name="'.$item.'" value="'.
                            &HTML::Entities::encode($env{'form.'.$item},'<>&"').'" />'."\n";                             $env{'form.'.$item}.'" />'."\n";
         }          }
     }      }
     return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,      return ($destination,$dir_root,$londocroot,$docudom,$docuname,$container,
Line 6513  sub remove_archive { Line 5119  sub remove_archive {
         } else {          } else {
             $delwarning = &mt('An error occurred retrieving the contents of the current folder.');              $delwarning = &mt('An error occurred retrieving the contents of the current folder.');
         }          }
         $delwarning .= ' '.&mt('As a result the archive file has not been removed.');          $delwarning .= &mt('As a result the archive file has not been removed.');
     } else {      } else {
         my $currcmd = $env{'form.cmd'};          my $currcmd = $env{'form.cmd'};
         my $position = $env{'form.position'};          my $position = $env{'form.position'};
         my $archiveidx = $position;          if ($position > 0) { 
         if ($position > 0) {              $env{'form.cmd'} = 'del_'.$position;
             if (($env{'form.autoextract_camtasia'}) && (scalar(@LONCAPA::map::order) == 2)) {              my ($title,$url,@rrest) = 
                 $archiveidx = $position-1;                  split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]);
             }              if (&handle_edit_cmd($docuname,$docudom)) {
             $env{'form.cmd'} = 'remove_'.$archiveidx;                  ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);
             my ($title,$url,@rrest) =                  if ($fatal) {
                 split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$archiveidx]]);                      if ($container eq 'page') {
             if ($url eq $env{'form.archiveurl'}) {                          $delwarning = &mt('An error occurred updating the contents of the current page.');
                 if (&handle_edit_cmd($docuname,$docudom)) {  
                     ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);  
                     if ($fatal) {  
                         if ($container eq 'page') {  
                             $delwarning = &mt('An error occurred updating the contents of the current page.');  
                         } else {  
                             $delwarning = &mt('An error occurred updating the contents of the current folder.');  
                         }  
                     } else {                      } else {
                         $delresult = &mt('Archive file removed.');                          $delwarning = &mt('An error occurred updating the contents of the current folder.');
                     }                      }
                   } else {
                       $delresult = &mt('Archive file removed.');
                 }                  }
             } else {  
                 $delwarning .=  &mt('Archive file had unexpected item number in folder.').  
                                 ' '.&mt('As a result the archive file has not been removed.');  
             }              }
         }          }
         $env{'form.cmd'} = $currcmd;          $env{'form.cmd'} = $currcmd;
Line 6559  sub remove_archive { Line 5156  sub remove_archive {
 }  }
   
 sub generate_admin_menu {  sub generate_admin_menu {
     my ($crstype,$canedit) = @_;      my ($crstype) = @_;
     my $lc_crstype = lc($crstype);      my $lc_crstype = lc($crstype);
     my ($home,$other,%outhash)=&authorhosts();      my ($home,$other,%outhash)=&authorhosts();
     my %lt= ( # do not translate here      my %lt=&Apache::lonlocal::texthash (
                                          'vc'   => 'Verify Content',                                           'vc'   => 'Verify Content',
                                          'cv'   => 'Check/Set Resource Versions',                                           'cv'   => 'Check/Set Resource Versions',
                                          'ls'   => 'List Resource Identifiers',                                           'ls'   => 'List Resource Identifiers',
                                          'ct'   => 'Display/Set Shortened URLs for Deep-linking',  
                                          'imse' => 'Export contents to IMS Archive',                                           'imse' => 'Export contents to IMS Archive',
                                          'dcd'  => "Copy $crstype Content to Authoring Space",                                           'dcd'  => "Dump $crstype Content to Authoring Space",
             );                                         );
     my ($candump,$dumpurl);      my ($candump,$dumpurl);
     if ($home + $other > 0) {      if ($home + $other > 0) {
         $candump = 'F';          $candump = 'F';
Line 6599  sub generate_admin_menu { Line 5195  sub generate_admin_menu {
                 {   linktext   => $lt{'vc'},                  {   linktext   => $lt{'vc'},
                     url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",                      url        => "javascript:injectData(document.courseverify,'dummy','verify','$lt{'vc'}')",
                     permission => 'F',                      permission => 'F',
                     help       => 'Docs_Verify_Content',                      help       => 'Verify_Content',
                     icon       => 'verify.png',                      icon       => 'verify.png',
                     linktitle  => 'Verify contents can be retrieved/rendered',                      linktitle  => 'Verify contents can be retrieved/rendered',
                 },                  },
                 {   linktext => $lt{'cv'},                  {   linktext => $lt{'cv'},
                     url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",                      url => "javascript:injectData(document.courseverify,'dummy','versions','$lt{'cv'}')",
                     permission => 'F',                      permission => 'F',
                     help       => 'Docs_Check_Resource_Versions',                      help       => 'Check_Resource_Versions',
                     icon       => 'resversion.png',                      icon       => 'resversion.png',
                     linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",                      linktitle  => "View version information for resources in your $lc_crstype, and fix/unfix use of specific versions",
                 },                  },
Line 6617  sub generate_admin_menu { Line 5213  sub generate_admin_menu {
                     icon       => 'symbs.png',                      icon       => 'symbs.png',
                     linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"                      linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"
                 },                  },
                 {   linktext   => $lt{'ct'},  
                     url        => "javascript:injectData(document.courseverify,'dummy','shorturls','$lt{'ct'}')",  
                     permission => 'F',  
                     help       => 'Docs_Short_URLs',  
                     icon       => 'shorturls.png',  
                     linktitle  => "Set shortened URLs for a resource or folder in your $lc_crstype for use in deep-linking"  
                 },  
                 ]                  ]
         });          },
     if ($canedit) {  
         push(@menu,  
         {   categorytitle=>'Export',          {   categorytitle=>'Export',
             items =>[              items =>[
                 {   linktext   => $lt{'imse'},                  {   linktext   => $lt{'imse'},
Line 6640  sub generate_admin_menu { Line 5227  sub generate_admin_menu {
                 {   linktext   => $lt{'dcd'},                  {   linktext   => $lt{'dcd'},
                     url        => $dumpurl,                      url        => $dumpurl,
                     permission => $candump,                      permission => $candump,
                     help       => 'Docs_Dump_Course_Docs',                      #help => '',
                     icon       => 'dump.png',                      icon       => 'dump.png',
                     linktitle  => $lt{'dcd'},                      linktitle  => $lt{'dcd'},
                 },                  },
                 ]                  ]
         });          });
     }  
     return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".      return '<form action="/adm/coursedocs" method="post" name="courseverify">'."\n".
            '<input type="hidden" id="dummy" />'."\n".             '<input type="hidden" id="dummy" />'."\n".
            &Apache::lonhtmlcommon::generate_menu(@menu)."\n".             &Apache::lonhtmlcommon::generate_menu(@menu)."\n".
Line 6655  sub generate_admin_menu { Line 5241  sub generate_admin_menu {
   
 sub generate_edit_table {  sub generate_edit_table {
     my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile,      my ($tid,$orderhash_ref,$to_show,$iconpath,$jumpto,$readfile,
         $need_save,$copyfolder,$canedit) = @_;          $need_save,$copyfolder) = @_;
     return unless(ref($orderhash_ref) eq 'HASH');      return unless(ref($orderhash_ref) eq 'HASH');
     my %orderhash = %{$orderhash_ref};      my %orderhash = %{$orderhash_ref};
     my ($form, $activetab, $active, $disabled);      my $form;
     if (($env{'form.active'} ne '') && ($env{'form.active'} ne '00')) {      my $activetab;
       my $active;
       if (($env{'form.active'} ne '') && ($env{'form.active'} ne 'aa')) {
         $activetab = $env{'form.active'};          $activetab = $env{'form.active'};
     }      }
     unless ($canedit) {  
         $disabled = ' disabled="disabled"';  
     }  
     my $backicon = $iconpath.'clickhere.gif';      my $backicon = $iconpath.'clickhere.gif';
     my $backtext = &mt('Exit Editor');      my $backtext = &mt('Exit Editor');
     $form = '<div class="LC_Box" style="margin:0;">'.      $form = '<div class="LC_Box" style="margin:0;">'.
Line 6697  sub generate_edit_table { Line 5282  sub generate_edit_table {
             $form .= '<li style="float:right" '.$active              $form .= '<li style="float:right" '.$active
                 .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";                  .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'."\n";
         } else {          } else {
     $form .= '<li style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";      $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'."\n";
   
  }   }
     }      }
Line 6728  sub generate_edit_table { Line 5313  sub generate_edit_table {
 <input type="hidden" name="multicopy" value="" />  <input type="hidden" name="multicopy" value="" />
 <input type="hidden" name="multichange" value="" />  <input type="hidden" name="multichange" value="" />
 <input type="hidden" name="copyfolder" value="$copyfolder" />  <input type="hidden" name="copyfolder" value="$copyfolder" />
 <input type="submit" name="savemultiples" value="$button" $disabled />  <input type="submit" name="savemultiples" value="$button" />
 </form>  </form>
 </div>  </div>
 END  END
Line 6754  END Line 5339  END
 }  }
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti,      my ($udom,$uname,$supplementalflag) = @_;
         $canedit,$hostname,$navmapref) = @_;      my %lt = &Apache::lonlocal::texthash(
     my %js_lt = &Apache::lonlocal::texthash(  
                                           p_mnf => 'Name of New Folder',                                            p_mnf => 'Name of New Folder',
                                           t_mnf => 'New Folder',                                            t_mnf => 'New Folder',
                                           p_mnp => 'Name of New Page',                                            p_mnp => 'Name of New Page',
Line 6766  sub editing_js { Line 5350  sub editing_js {
                                           p_msb => 'Title for the Problem',                                            p_msb => 'Title for the Problem',
                                           p_mdb => 'Title for the Drop Box',                                            p_mdb => 'Title for the Drop Box',
                                           p_mbb => 'Title for the Discussion Board',                                            p_mbb => 'Title for the Discussion Board',
                                           p_mwp => 'Title for Web Page',                                            p_mwp => 'Title for Web Page', 
                                           p_mab => "Enter user:domain for User's Personal Information Page",                                            p_mab => "Enter user:domain for User's Personal Information Page",
                                           p_mab2 => 'Personal Information Page of ',                                            p_mab2 => 'Personal Information Page of ',
                                           p_mab_alrt1 => 'Not a valid user:domain',                                            p_mab_alrt1 => 'Not a valid user:domain',
                                           p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',                                            p_mab_alrt2 => 'Please enter both user and domain in the format user:domain',
                                           p_chn => 'New Title',                                            p_chn => 'New Title',
                                           p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',                                            p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!',
                                           p_rmr2a => 'Remove',                                            p_rmr2a => 'Remove[_99]',
                                           p_rmr2b => '?',                                            p_rmr2b => '?[_99]',
                                           p_rmr3a => 'Remove those',                                            p_rmr3a => 'Remove those [_2]',
                                           p_rmr3b => 'items?',                                            p_rmr3b => 'items?[_2]',
                                           p_rmr4  => 'WARNING: Removing a resource uploaded to a course cannot be undone via "Undo Delete".',  
                                           p_rmr5  => 'Push "Cancel" and then use "Cut" instead if you might need to undo this change.',  
                                           p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',                                            p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!',
                                           p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',                                            p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.',
                                           p_ctr2a => 'Cut',                                            p_ctr2a => 'Cut[_98]',
                                           p_ctr2b => '?',                                            p_ctr2b => '?[_98]',
                                           p_ctr3a => 'Cut those',                                            p_ctr3a => 'Cut those[_2]',
                                           p_ctr3b => 'items?',                                            p_ctr3b => 'items?[_2]',
                                           rpck    => 'Enter number to pick (e.g., 3)',                                            rpck    => 'Enter number to pick (e.g., 3)',
                                           imsfile => 'You must choose an IMS package for import',                                            imsfile => 'You must choose an IMS package for import',
                                           imscms  => 'You must select which Course Management System was the source of the IMS package',                                            imscms  => 'You must select which Course Management System was the source of the IMS package',
Line 6795  sub editing_js { Line 5377  sub editing_js {
                                           noor    => 'No actions selected or changes to settings specified.',                                            noor    => 'No actions selected or changes to settings specified.',
                                           noch    => 'No changes to settings specified.',                                            noch    => 'No changes to settings specified.',
                                           noac    => 'No actions selected.',                                            noac    => 'No actions selected.',
                                           edri    => 'Editing rights unavailable for your current role.',  
                                         );                                          );
   
     &js_escape(\%js_lt);  
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"');      my $docs_folderpath = &HTML::Entities::encode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'},'<>&"');
     my $main_container_page;      my $main_container_page;
     if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {      if (&HTML::Entities::decode($env{'environment.internal.'.$env{'request.course.id'}.'.docs_folderpath.folderpath'}) =~ /\:1$/) {
         $main_container_page = 1;          $main_container_page = 1;
     }      }
     my $backtourl;      my $toplevelmain = 
     my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref));          &escape(&mt('Main Content').':::::');
     my $toplevelsupp = &supplemental_base();      my $toplevelsupp = &supplemental_base();
   
       my $backtourl;
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {      if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {
         my $caller = $1;          my $caller = $1;
         if ($caller =~ /^supplemental/) {          if ($caller =~ /^supplemental/) {
Line 6817  sub editing_js { Line 5398  sub editing_js {
             my ($map,$id,$res)=&Apache::lonnet::decode_symb($caller);              my ($map,$id,$res)=&Apache::lonnet::decode_symb($caller);
             $res = &Apache::lonnet::clutter($res);              $res = &Apache::lonnet::clutter($res);
             if (&Apache::lonnet::is_on_map($res)) {              if (&Apache::lonnet::is_on_map($res)) {
                 my ($url,$anchor);                  $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($res),'<>&"').'?symb='.
                 if ($res =~ /^([^#]+)#([^#]+)$/) {                               &HTML::Entities::encode($caller,'<>&"');
                     $url = $1;  
                     $anchor = $2;  
                     if (($caller =~ m{^([^#]+)\Q#$anchor\E$})) {  
                         $caller = $1.&escape('#').$anchor;  
                     }  
                 } else {  
                     $url = $res;  
                 }  
                 $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($url),'<>&"');  
                 if ($backtourl =~ m{^\Q/uploaded/$coursedom/$coursenum/\Edefault_\d+\.sequence$}) {  
                     $backtourl .= '?navmap=1';  
                 } else {  
                     $backtourl .= '?symb='.  
                                   &HTML::Entities::encode($caller,'<>&"');  
                 }  
                 if ($backtourl =~ m{^\Q/public/$coursedom/$coursenum/syllabus\E}) {  
                     if (($ENV{'SERVER_PORT'} == 443) &&  
                         ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                         unless (&Apache::lonnet::uses_sts()) {  
                             if ($hostname ne '') {  
                                 $backtourl = 'http://'.$hostname.$backtourl;  
                             }  
                             $backtourl .= (($backtourl =~ /\?/) ? '&amp;':'?').'usehttp=1';  
                         }  
                     }  
                 } elsif ($backtourl =~ m{^/adm/wrapper/ext/(?!https:)}) {  
                     if (($ENV{'SERVER_PORT'} == 443) && ($hostname ne '')) {  
                         unless (&Apache::lonnet::uses_sts()) {  
                             if ($hostname ne '') {  
                                 $backtourl = 'http://'.$hostname.$backtourl;  
                             }  
                             $backtourl .= (($backtourl =~ /\?/) ? '&amp;':'?').'usehttp=1';  
                         }  
                     }  
                 }  
                 if ($anchor ne '') {  
                     $backtourl .= '#'.&HTML::Entities::encode($anchor,'<>&"');  
                 }  
                 $backtourl = &Apache::loncommon::escape_single($backtourl);   
             } else {              } else {
                 $backtourl = '/adm/navmaps';                  $backtourl = '/adm/navmaps';
             }              }
Line 6871  sub editing_js { Line 5413  sub editing_js {
     }      }
   
     my $fieldsets = "'ext','doc'";      my $fieldsets = "'ext','doc'";
     if ($posslti) {  
         $fieldsets .= ",'tool'";  
     }  
     unless ($main_container_page) {      unless ($main_container_page) {
         $fieldsets .=",'ims'";          $fieldsets .=",'ims'";
     }      }
     if ($supplementalflag) {      if ($supplementalflag) {
         $fieldsets = "'suppext','suppdoc'";          $fieldsets = "'suppext','suppdoc'";
         if ($posslti) {  
             $fieldsets .= ",'supptool'";  
         }  
     }      }
   
     my $jsmakefunctions;      return <<ENDNEWSCRIPT;
     if ($canedit) {  
         $jsmakefunctions = <<ENDNEWSCRIPT;  
 function makenewfolder(targetform,folderseq) {  function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}');      var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
     if (foldername) {      if (foldername) {
        targetform.importdetail.value=escape(foldername)+"="+folderseq;         targetform.importdetail.value=escape(foldername)+"="+folderseq;
         targetform.submit();          targetform.submit();
Line 6896  function makenewfolder(targetform,folder Line 5430  function makenewfolder(targetform,folder
 }  }
   
 function makenewpage(targetform,folderseq) {  function makenewpage(targetform,folderseq) {
     var pagename=prompt('$js_lt{"p_mnp"}','$js_lt{"t_mnp"}');      var pagename=prompt('$lt{"p_mnp"}','$lt{"t_mnp"}');
     if (pagename) {      if (pagename) {
         targetform.importdetail.value=escape(pagename)+"="+folderseq;          targetform.importdetail.value=escape(pagename)+"="+folderseq;
         targetform.submit();          targetform.submit();
Line 6904  function makenewpage(targetform,folderse Line 5438  function makenewpage(targetform,folderse
 }  }
   
 function makeexamupload() {  function makeexamupload() {
    var title=prompt('$js_lt{"p_mxu"}');     var title=prompt('$lt{"p_mxu"}');
    if (title) {     if (title) {
     this.document.forms.newexamupload.importdetail.value=      this.document.forms.newexamupload.importdetail.value=
  escape(title)+'=/res/lib/templates/examupload.problem';   escape(title)+'=/res/lib/templates/examupload.problem';
Line 6913  function makeexamupload() { Line 5447  function makeexamupload() {
 }  }
   
 function makesmppage() {  function makesmppage() {
    var title=prompt('$js_lt{"p_msp"}');     var title=prompt('$lt{"p_msp"}');
    if (title) {     if (title) {
     this.document.forms.newsmppg.importdetail.value=      this.document.forms.newsmppg.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/new/smppg';   escape(title)+'=/adm/$udom/$uname/new/smppg';
Line 6922  function makesmppage() { Line 5456  function makesmppage() {
 }  }
   
 function makewebpage(type) {  function makewebpage(type) {
    var title=prompt('$js_lt{"p_mwp"}');     var title=prompt('$lt{"p_mwp"}');
    var formname;     var formname;
    if (type == 'supp') {     if (type == 'supp') {
        formname = this.document.forms.supwebpage;         formname = this.document.forms.supwebpage;
Line 6930  function makewebpage(type) { Line 5464  function makewebpage(type) {
        formname = this.document.forms.newwebpage;         formname = this.document.forms.newwebpage;
    }     }
    if (title) {     if (title) {
        var webpage = formname.importdetail.value;         var webpage = formname.importdetail.value; 
        formname.importdetail.value = escape(title)+'='+webpage;         formname.importdetail.value = escape(title)+'='+webpage;
        formname.submit();         formname.submit();
    }     }
 }  }
   
 function makesmpproblem() {  function makesmpproblem() {
    var title=prompt('$js_lt{"p_msb"}');     var title=prompt('$lt{"p_msb"}');
    if (title) {     if (title) {
     this.document.forms.newsmpproblem.importdetail.value=      this.document.forms.newsmpproblem.importdetail.value=
  escape(title)+'=/res/lib/templates/simpleproblem.problem';   escape(title)+'=/res/lib/templates/simpleproblem.problem';
Line 6946  function makesmpproblem() { Line 5480  function makesmpproblem() {
 }  }
   
 function makedropbox() {  function makedropbox() {
    var title=prompt('$js_lt{"p_mdb"}');     var title=prompt('$lt{"p_mdb"}');
    if (title) {     if (title) {
     this.document.forms.newdropbox.importdetail.value=      this.document.forms.newdropbox.importdetail.value=
         escape(title)+'=/res/lib/templates/DropBox.problem';          escape(title)+'=/res/lib/templates/DropBox.problem';
Line 6955  function makedropbox() { Line 5489  function makedropbox() {
 }  }
   
 function makebulboard() {  function makebulboard() {
    var title=prompt('$js_lt{"p_mbb"}');     var title=prompt('$lt{"p_mbb"}');
    if (title) {     if (title) {
     this.document.forms.newbul.importdetail.value=      this.document.forms.newbul.importdetail.value=
  escape(title)+'=/adm/$udom/$uname/new/bulletinboard';   escape(title)+'=/adm/$udom/$uname/new/bulletinboard';
Line 6964  function makebulboard() { Line 5498  function makebulboard() {
 }  }
   
 function makeabout() {  function makeabout() {
    var user=prompt("$js_lt{'p_mab'}");     var user=prompt("$lt{'p_mab'}");
    if (user) {     if (user) {
        var comp=new Array();         var comp=new Array();
        comp=user.split(':');         comp=user.split(':');
        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {         if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
    if ((comp[0]) && (comp[1])) {     if ((comp[0]) && (comp[1])) {
        this.document.forms.newaboutsomeone.importdetail.value=         this.document.forms.newaboutsomeone.importdetail.value=
    '$js_lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';     '$lt{"p_mab2"}'+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
                this.document.forms.newaboutsomeone.submit();         this.document.forms.newaboutsomeone.submit();
            } else {     } else {
                alert("$js_lt{'p_mab_alrt1'}");         alert("$lt{'p_mab_alrt1'}");
            }     }
        } else {  } else {
            alert("$js_lt{'p_mab_alrt2'}");     alert("$lt{'p_mab_alrt2'}");
        }  
     }  
 }  
   
 function makenew(targetform) {  
     targetform.submit();  
 }  
   
 function changename(folderpath,index,oldtitle) {  
     var title=prompt('$js_lt{"p_chn"}',oldtitle);  
     if (title) {  
         this.document.forms.renameform.markcopy.value='';  
         this.document.forms.renameform.title.value=title;  
         this.document.forms.renameform.cmd.value='rename_'+index;  
         this.document.forms.renameform.folderpath.value=folderpath;  
         this.document.forms.renameform.submit();  
     }  
 }  
   
 ENDNEWSCRIPT  
     } else {  
         $jsmakefunctions = <<ENDNEWSCRIPT;  
   
 function makenewfolder() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makenewpage() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makeexamupload() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makesmppage() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makewebpage(type) {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makesmpproblem() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makedropbox() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makebulboard() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makeabout() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function changename() {  
     alert("$js_lt{'edri'}");  
 }  
   
 function makenew() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function groupimport() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function groupsearch() {  
     alert("$js_lt{'edri'}");  
 }  }
   
 function groupopen(url,recover) {  
    var options="scrollbars=1,resizable=1,menubar=0";  
    idxflag=1;  
    idx=open("/adm/groupsort?inhibitmenu=yes&mode=simple&recover="+recover+"&readfile="+url,"idxout",options);  
    idx.focus();  
 }  
   
 ENDNEWSCRIPT  
   
     }  
     return <<ENDSCRIPT;  
   
 $jsmakefunctions  
   
 function toggleUpload(caller) {  function toggleUpload(caller) {
     var blocks = Array($fieldsets);      var blocks = Array($fieldsets);
     for (var i=0; i<blocks.length; i++) {      for (var i=0; i<blocks.length; i++) {
Line 7078  function toggleUpload(caller) { Line 5527  function toggleUpload(caller) {
             }              }
         }          }
         document.getElementById('upload'+blocks[i]+'form').style.display=disp;          document.getElementById('upload'+blocks[i]+'form').style.display=disp;
         if ((caller == 'tool') || (caller == 'supptool')) {  
             if (disp == 'block') {  
                 if (document.getElementById('LC_exttoolid')) {  
                     var toolselector = document.getElementById('LC_exttoolid');  
                     var suppflag = 0;  
                     if (caller == 'supptool') {  
                         suppflag = 1;  
                     }  
                     currForm = document.getElementById('new'+caller);  
                     updateExttool(toolselector,currForm,suppflag);  
                 }  
             }  
         }  
     }      }
     resize_scrollbox('contentscroll','1','1');      resize_scrollbox('contentscroll','1','1');
     return;      return;
Line 7113  function toggleMap(caller) { Line 5549  function toggleMap(caller) {
   
 function makeims(imsform) {  function makeims(imsform) {
     if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {      if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {
         alert("$js_lt{'imsfile'}");          alert("$lt{'imsfile'}");
         return;          return;
     }      }
     if (imsform.source.selectedIndex == 0) {      if (imsform.source.selectedIndex == 0) {
         alert("$js_lt{'imscms'}");          alert("$lt{'imscms'}");
         return;          return;
     }      }
     newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes");      newWindow = window.open('', 'IMSimport',"HEIGHT=700,WIDTH=750,scrollbars=yes");
     imsform.submit();      imsform.submit();
 }  }
   
   function changename(folderpath,index,oldtitle) {
   var title=prompt('$lt{"p_chn"}',oldtitle);
   if (title) {
   this.document.forms.renameform.markcopy.value='';
   this.document.forms.renameform.title.value=title;
   this.document.forms.renameform.cmd.value='rename_'+index;
   this.document.forms.renameform.folderpath.value=folderpath;
   this.document.forms.renameform.submit();
   }
   }
   
 function updatePick(targetform,index,caller) {  function updatePick(targetform,index,caller) {
     var pickitem;      var pickitem;
     var picknumitem;      var picknumitem;
Line 7138  function updatePick(targetform,index,cal Line 5585  function updatePick(targetform,index,cal
         picknumtext = document.getElementById('randompicknum_'+index);          picknumtext = document.getElementById('randompicknum_'+index);
     }      }
     if (pickitem.checked) {      if (pickitem.checked) {
         var picknum=prompt('$js_lt{"rpck"}',picknumitem.value);          var picknum=prompt('$lt{"rpck"}',picknumitem.value);
         if (picknum == '' || picknum == null) {          if (picknum == '' || picknum == null) {
             if (caller == 'check') {              if (caller == 'check') {
                 pickitem.checked=false;                  pickitem.checked=false;
Line 7288  function propagateState(form,param) { Line 5735  function propagateState(form,param) {
     return;      return;
 }  }
   
 function checkForSubmit(targetform,param,context,idx,folderpath,index,oldtitle,skip_confirm,container,folder,confirm_removal) {  function checkForSubmit(targetform,param,context,idx,folderpath,index,oldtitle,skip_confirm,container,folder) {
     var canedit = '$canedit';  
     if (canedit == '') {  
         alert("$js_lt{'edri'}");  
         return;  
     }  
     var dosettings;      var dosettings;
     var doaction;      var doaction;
     var control = document.togglemultsettings;      var control = document.togglemultsettings;
Line 7331  function checkForSubmit(targetform,param Line 5773  function checkForSubmit(targetform,param
             targetform.markcopy.value=idx+':'+param;              targetform.markcopy.value=idx+':'+param;
             targetform.copyfolder.value=folder+'.'+container;              targetform.copyfolder.value=folder+'.'+container;
             if (param == 'remove') {              if (param == 'remove') {
                 var doremove = 0;                  if (skip_confirm || confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr2a"} "'+oldtitle+'" $lt{"p_rmr2b"}')) {
                 if (skip_confirm) {  
                     if (confirm_removal) {  
                         if (confirm('$js_lt{"p_rmr4"}\\n$js_lt{"p_rmr5"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'"$js_lt{"p_rmr2b"}')) {  
                             doremove = 1;  
                         }  
                     } else {  
                         doremove = 1;  
                     }  
                 } else {  
                     if (confirm('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr2a"} "'+oldtitle+'" $js_lt{"p_rmr2b"}')) {  
                         doremove = 1;  
                     }  
                 }  
                 if (doremove) {  
                     targetform.markcopy.value='';                      targetform.markcopy.value='';
                     targetform.copyfolder.value='';                      targetform.copyfolder.value='';
                     targetform.submit();                      targetform.submit();
                 }                  }
             }              }
             if (param == 'cut') {              if (param == 'cut') {
                 if (skip_confirm || confirm('$js_lt{"p_ctr1a"}\\n$js_lt{"p_ctr1b"}\\n\\n$js_lt{"p_ctr2a"} "'+oldtitle+'" $js_lt{"p_ctr2b"}')) {                  if (skip_confirm || confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr2a"} "'+oldtitle+'" $lt{"p_ctr2b"}')) {
                     targetform.submit();                      targetform.submit();
                     return;                      return;
                 }                  }
Line 7417  for (i = 0; i < currentLis.length; i++) Line 5845  for (i = 0; i < currentLis.length; i++)
   
 function hideAll(current, nav, data) {  function hideAll(current, nav, data) {
 unselectInactive(nav);  unselectInactive(nav);
 if (current) {  if(current.className == 'right'){
     if (current.className == 'right'){  
  current.className = 'right active'   current.className = 'right active'
     } else {   }else{
  current.className = 'active';   current.className = 'active';
     }  
 }  }
 currentData = document.getElementById(data);  currentData = document.getElementById(data);
 currentDivs = currentData.getElementsByTagName('DIV');  currentDivs = currentData.getElementsByTagName('DIV');
Line 7453  function openTabs(pageId) { Line 5879  function openTabs(pageId) {
 }  }
   
 function showPage(current, pageId, nav, data) {  function showPage(current, pageId, nav, data) {
         currstate = current.className;  
  hideAll(current, nav, data);   hideAll(current, nav, data);
  openTabs(pageId);   openTabs(pageId);
  unselectInactive(nav);   unselectInactive(nav);
         if ((currstate == 'active') || (currstate == 'right active')) {   current.className = 'active';
             if (currstate == 'active') {  
                 current.className = '';  
             } else {  
                 current.className = 'right';  
             }  
             activeTab = '';  
             toggleUpload();  
             toggleMap();  
             resize_scrollbox('contentscroll','1','0');  
             return;  
         } else {  
             current.className = 'active';  
         }  
  currentData = document.getElementById(pageId);   currentData = document.getElementById(pageId);
  currentData.style.display = 'block';   currentData.style.display = 'block';
         activeTab = pageId;          activeTab = pageId;
Line 7531  function togglePick(caller,value) { Line 5943  function togglePick(caller,value) {
         }          }
         document.getElementById('multi'+caller).style.display=disp;          document.getElementById('multi'+caller).style.display=disp;
         if (value == 1) {          if (value == 1) {
             document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$js_lt{'more'}</a>';               document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$lt{'more'}</a>'; 
         } else {          } else {
             document.getElementById('more'+caller).innerHTML = '';              document.getElementById('more'+caller).innerHTML = '';
         }          }
Line 7557  function togglePick(caller,value) { Line 5969  function togglePick(caller,value) {
   
 function toggleCheckUncheck(caller,more) {  function toggleCheckUncheck(caller,more) {
     if (more == 1) {      if (more == 1) {
         document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',0);" style="text-decoration:none;">$js_lt{'less'}</a>';          document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',0);" style="text-decoration:none;">$lt{'less'}</a>';
         document.getElementById('allfields'+caller).style.display='block';          document.getElementById('allfields'+caller).style.display='block';
     } else {      } else {
         document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$js_lt{'more'}</a>';          document.getElementById('more'+caller).innerHTML = '&nbsp;&nbsp;<a href="javascript:toggleCheckUncheck(\\''+caller+'\\',1);" style="text-decoration:none;">$lt{'more'}</a>';
         document.getElementById('allfields'+caller).style.display='none';          document.getElementById('allfields'+caller).style.display='none';
     }      }
     resize_scrollbox('contentscroll','1','1');      resize_scrollbox('contentscroll','1','1');
Line 7602  function checkSubmits() { Line 6014  function checkSubmits() {
     var doactions = multiActions();      var doactions = multiActions();
     var cutwarnings = 0;      var cutwarnings = 0;
     var remwarnings = 0;      var remwarnings = 0;
     var removalinfo = 0;  
     if (doactions == 1) {      if (doactions == 1) {
         var remidxlist = document.cumulativeactions.allremoveidx.value;          var remidxlist = document.cumulativeactions.allremoveidx.value;
         if ((remidxlist != '') && (remidxlist != null)) {          if ((remidxlist != '') && (remidxlist != null)) {
Line 7617  function checkSubmits() { Line 6028  function checkSubmits() {
                                 remwarnings ++;                                  remwarnings ++;
                             }                              }
                         }                          }
                         if (document.getElementById('confirm_removal_'+remidxs[i])) {  
                             if (document.getElementById('confirm_removal_'+remidxs[i]).value == 1) {  
                                 removalinfo ++;  
                             }  
                         }  
                     }                      }
                 }                  }
             }              }
Line 7720  function checkSubmits() { Line 6126  function checkSubmits() {
     }      }
     if (doactions == 1) {      if (doactions == 1) {
         if (numchanges > 0) {          if (numchanges > 0) {
             if ((cutwarnings > 0) || (remwarnings > 0) || (removalinfo > 0)) {              if ((cutwarnings > 0) || (remwarnings > 0)) {
                 if (remwarnings > 0) {                  if (remwarnings > 0) {
                     if (!confirm('$js_lt{"p_rmr1"}\\n\\n$js_lt{"p_rmr3a"} '+remwarnings+' $js_lt{"p_rmr3b"}')) {                      if (!confirm('$lt{"p_rmr1"}\\n\\n$lt{"p_rmr3a"} '+remwarnings+' $lt{"p_rmr3b"}')) {
                         return false;  
                     }  
                 }  
                 if (removalinfo > 0) {  
                     if (!confirm('$js_lt{"p_rmr4"}\\n$js_lt{"p_rmr5"}\\n\\n$js_lt{"p_rmr3a"} '+removalinfo+' $js_lt{"p_rmr3b"}')) {  
                         return false;                          return false;
                     }                      }
                 }                  }
                 if (cutwarnings > 0) {                  if (cutwarnings > 0) {
                     if (!confirm('$js_lt{"p_ctr1a"}\\n$js_lt{"p_ctr1b"}\\n\\n$js_lt{"p_ctr3a"} '+cutwarnings+' $js_lt{"p_ctr3b"}')) {                      if (!confirm('$lt{"p_ctr1a"}\\n$lt{"p_ctr1b"}\\n\\n$lt{"p_ctr3a"} '+cutwarnings+' $lt{"p_ctr3b"}')) {
                         return false;                          return false;
                     }                      }
                 }                  }
Line 7748  function checkSubmits() { Line 6149  function checkSubmits() {
         }          }
     }      }
     if ((dosettings == 1) && (doactions == 1)) {      if ((dosettings == 1) && (doactions == 1)) {
         alert("$js_lt{'noor'}");          alert("$lt{'noor'}");
     } else {      } else {
         if (dosettings == 1) {          if (dosettings == 1) {
             alert("$js_lt{'noch'}");              alert("$lt{'noch'}");
         } else {          } else {
             alert("$js_lt{'noac'}");              alert("$lt{'noac'}");
         }          }
     }      }
     return false;      return false;
Line 7839  function setBoxes(value) { Line 6240  function setBoxes(value) {
     return;      return;
 }  }
   
 ENDSCRIPT  ENDNEWSCRIPT
 }  }
   
 sub history_tab_js {  sub history_tab_js {
Line 7868  ENDINJECT Line 6269  ENDINJECT
   
 sub dump_switchserver_js {  sub dump_switchserver_js {
     my @hosts = @_;      my @hosts = @_;
     my %js_lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         dump => 'Copying content to Authoring Space requires switching server.',          dump => 'Dumping to Authoring Space requires switching server.',
         swit => 'Switch server?',          swit => 'Switch server?',
     );          duco => 'Dump content to Authoring Space',
     my %html_js_lt = &Apache::lonlocal::texthash(  
         swit => 'Switch server?',  
         duco => 'Copying Content to Authoring Space',  
         yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',          yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
         chos => 'Choose server',          chos => 'Choose server',
     );      );
     &js_escape(\%js_lt);  
     &html_escape(\%html_js_lt);  
     &js_escape(\%html_js_lt);  
     my $role = $env{'request.role'};      my $role = $env{'request.role'};
     my $js = <<"ENDSWJS";      my $js = <<"ENDSWJS";
 <script type="text/javascript">  <script type="text/javascript">
Line 7921  ENDSWJS Line 6316  ENDSWJS
   
 function dump_needs_switchserver(url) {  function dump_needs_switchserver(url) {
     if (url!='' && url!= null) {      if (url!='' && url!= null) {
         if (confirm("$js_lt{'dump'}\\n$js_lt{'swit'}")) {          if (confirm("$lt{'dump'}\\n$lt{'swit'}")) {
             go(url);              go(url);
         }          }
     }      }
Line 7932  function choose_switchserver_window() { Line 6327  function choose_switchserver_window() {
     newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes')      newWindow = window.open('','ChooseServer','height=400,width=500,scrollbars=yes')
     newWindow.document.open();      newWindow.document.open();
     newWindow.document.writeln('$startpage');      newWindow.document.writeln('$startpage');
     newWindow.document.write('<h3>$html_js_lt{'duco'}<\\/h3>\\n'+      newWindow.document.write('<h3>$lt{'duco'}<\\/h3>\\n'+
        '<p>$html_js_lt{'yone'}<\\/p>\\n'+         '<p>$lt{'yone'}<\\/p>\\n'+
        '<div class="LC_left_float"><fieldset><legend>$html_js_lt{'chos'}<\\/legend>\\n'+         '<div class="LC_left_float"><fieldset><legend>$lt{'chos'}<\\/legend>\\n'+
        '<form name="setserver" method="post" action="" \\/>\\n'+         '<form name="setserver" method="post" action="" \\/>\\n'+
        '$hostpicker\\n'+         '$hostpicker\\n'+
        '<br \\/><br \\/>\\n'+         '<br \\/><br \\/>\\n'+
        '<input type="button" name="makeswitch" value="$html_js_lt{'swit'}" '+         '<input type="button" name="makeswitch" value="$lt{'swit'}" '+
        'onclick="write_switchserver();" \\/>\\n'+         'onclick="write_switchserver();" \\/>\\n'+
        '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n');         '<\\/form><\\/fieldset><\\/div><br clear="all" \\/>\\n');
     newWindow.document.writeln('$endpage');      newWindow.document.writeln('$endpage');
Line 8068  check on this Line 6463  check on this
   
 Verify Content  Verify Content
   
 =item devalidateversioncache()  =item devalidateversioncache() & checkversions()
   
 =item checkversions()  
   
 Check Versions  Check Versions
   

Removed from v.1.484.2.85.2.3  
changed lines
  Added in v.1.554


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

Internal Server Error

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

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

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