Diff for /loncom/interface/londocs.pm between versions 1.484.2.82 and 1.556

version 1.484.2.82, 2019/08/16 16:12:37 version 1.556, 2013/08/06 14:18:52
Line 41  use Apache::lonclonecourse; Line 41  use Apache::lonclonecourse;
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonnavdisplay();  use Apache::lonnavdisplay();
 use Apache::lonextresedit();  use Apache::lonextresedit();
 use Apache::lontemplate();  
 use Apache::lonsimplepage();  
 use HTML::Entities;  use HTML::Entities;
 use HTML::TokeParser;  use HTML::TokeParser;
 use GDBM_File;  use GDBM_File;
 use File::MMagic;  
 use Apache::lonlocal;  use Apache::lonlocal;
 use Cwd;  use Cwd;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
Line 59  my $hashtied; Line 56  my $hashtied;
 my %alreadyseen=();  my %alreadyseen=();
   
 my $hadchanges;  my $hadchanges;
 my $suppchanges;  
   
   
 my %help=();  my %help=();
Line 83  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 139  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 220  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, @files) = @_;      my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_;
     my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,      my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
Line 688  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 703  $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 728  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 755  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 827  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 850  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 1016  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 1061  sub update_paste_buffer { Line 698  sub update_paste_buffer {
         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.'_'.$mapidx} = 1;                   $pasteurls{$cid.'_'.$url};
              }               }
         }          }
     }      }
   
 # 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[4];  
   
     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//};
         next if (exists($pasteurls{$coursedom.'_'.$coursenum.'_'.$mapidx}));          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 1106  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 1129  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 1177  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);                  $canpaste,$nopaste,$othercrs,$areachange);
             my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];              my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1];
Line 1210  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 1224  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)$})) {  
                     if ($cid ne $env{'request.course.id'}) {  
                         my ($srcdom,$srcnum) = split(/_/,$cid);  
                         if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) {  
                             $othercrs = '<br />'.&mt('(from another course)');  
                         } else {  
                             $canpaste = 0;  
                             $nopaste = &mt('Paste from another course unavailable.');  
                         }  
                     }  
                 }  
                 if ($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').': '.
Line 1252  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 1294  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('Clear selected').'" />'.('&nbsp;'x2);  
         if ($clipboardcount > 1) {  
             $buttons .=  
                 '<span style="text-decoration:line-through">'.('&nbsp;'x20).'</span>'.('&nbsp;'x2).  
                 '<input type="button" name="checkallclip" value="'.&mt('Check all').'" style="height:20px;" onclick="checkClipboard();" />'.  
                 ('&nbsp;'x2).  
                 '<input type="button" name="uncheckallclip" value="'.&mt('Uncheck all').'" style="height:20px;" onclick="uncheckClipboard();" />'.  
                 ('&nbsp;'x2);  
         }          }
         $form_end = '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'.          $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 1408  sub supp_pasteable { Line 1004  sub supp_pasteable {
 }  }
   
 sub paste_popup_js {  sub paste_popup_js {
     my %html_js_lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           show => 'Show Options',                                            show => 'Show 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 1464  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 1524  sub do_paste_from_buffer { Line 1097  sub do_paste_from_buffer {
     }      }
   
     my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,      my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%duplicate,
         %prefixchg,%srcdom,%srcnum,%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 1551  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{^/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 1575  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 1643  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)) {  
                 $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,\%removefrommap,\%removeparam,              &contained_map_check($url,$folder,\%removefrommap,\%removeparam,
                                  \%addedmaps,\%hierarchy,\%titles,$allmaps);                                   \%addedmaps,\%hierarchy,\%titles,$allmaps);
             if ($url=~ m{^/uploaded/}) {              if ($url=~ m{^/uploaded/}) {
Line 1699  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 1708  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 1724  sub do_paste_from_buffer { Line 1282  sub do_paste_from_buffer {
         }          }
         if ($url=~ m{/(bulletinboard|smppg)$}) {          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 1749  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;
                     }                      }
                     $results{$suffix} = $result;                      $results{$suffix} = $result;
                     $msgerrs{$suffix} = $msg;                      $msgerrs{$suffix} = $msg;
Line 1757  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 1796  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 1814  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 1833  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 1842  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 2007  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)$}) {
             my $prefix = $1;              my $prefix = $1;
             if (($dbref->{'cdom'} =~ /^$match_domain$/) &&              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 2032  sub dbcopy { Line 1574  sub dbcopy {
                     if ($prefix eq 'smppg') {                      if ($prefix eq 'smppg') {
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);                          $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a simple page [_1].',$url);
                     } else {                      } else {
                         $errtext = &mt('Failed to acquire a unique timestamp-based suffix when copying a 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 2046  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 2068  sub dbcopy { Line 1610  sub dbcopy {
                     }                      }
                 }                  }
                 if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {                  if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) {
                     $lockerrorsref->{$prefix} =                      $lockerrorsref->{$prefix} = 
                         '<div class="LC_error">'.                          '<div class="LC_error">'.
                         &mt('There was a problem removing a lockfile.');                          &mt('There was a problem removing a lockfile.');
                     if ($prefix eq 'smppg') {                      if ($prefix eq 'smppg') {
                         $lockerrorsref->{$prefix} .=                          $lockerrorsref->{$prefix} .= 
                             ' '.&mt('This will prevent creation of additional simple pages in this course.');                              &mt('This will prevent creation of additional simple pages in this course.');
                     } else {                      } else {
                         $lockerrorsref->{$prefix} .= ' '.&mt('This will prevent creation of additional 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 2099  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 2255  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 2287  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 2304  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 2328  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 2357  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 2394  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 2414  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 2567  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 2612  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 2623  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 2665  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 2773  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 2800  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 2836  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 2924  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,$canedit,          $supplementalflag,$orderhash,$iconpath,$pathitem)=@_;
         $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 2948  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 2974  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 3041  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 3075  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 3240  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,$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 3293  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 3327  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 3359  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 3370  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 3388  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 3404  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 3453  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 3561  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 3623  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)=@_;
         $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 3634  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 3703  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 3725  END Line 3074  END
                 'pr' => 'Preview',                  'pr' => 'Preview',
                 'sv' => 'Save',                  'sv' => 'Save',
                 'ul' => 'URL',                  'ul' => 'URL',
                 'ti' => 'Title',                  'ti' => 'Title', 
                 'er' => 'Editing rights unavailable for your current role.',    
                 );                  );
  my %denied = &action_restrictions($coursenum,$coursedom,$url,   my %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$
Line 3744  END Line 3091  END
              || $isexternal) {               || $isexternal) {
     $skip_confirm = 1;      $skip_confirm = 1;
  }   }
         if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&  
             ($url!~/$LONCAPA::assess_page_seq_re/)) {  
             $confirm_removal = 1;  
         }  
   
  if ($denied{'copy'}) {   if ($denied{'copy'}) {
             $copylink=(<<ENDCOPY)              $copylink=(<<ENDCOPY)
Line 3759  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 3777  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 3790  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 3804  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 3848  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 3860  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 3871  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//};
     $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};      $url=~s{^http(|s)(&colon;|:)//}{/adm/wrapper/ext/};
Line 3889  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 '') {  
                     $url='/adm/wrapper'.$url;  
                 }  
                 if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {  
                     $nomodal = 1;  
                 }  
             } elsif ($url eq "/public/$coursedom/$coursenum/syllabus") {  
                 if (($ENV{'SERVER_PORT'} == 443) &&  
                     ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {  
                     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) {  
                     if ($url =~ /^([^#]+)#([^#]+)$/) {  
                         $url = $1;  
                         $anchor = $2;  
                         my $escan = &escape('#');  
                         $shownsymb =~ s/^([^\#]+)#([^\#]+)$/$1$escan$2/;  
                     }  
                 }  
                 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 4000  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 4054  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) {
         $url .= ($url =~ /\?/) ? '&amp;':'?';          $url .= ($url =~ /\?/) ? '&amp;':'?';
Line 4084  $form_end; Line 3297  $form_end;
         if ($isexternal && $orderidx) {          if ($isexternal && $orderidx) {
             $url .= '&amp;idx='.$orderidx;              $url .= '&amp;idx='.$orderidx;
         }          }
         if ($anchor ne '') {  
             $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');  
         }  
     }      }
     my ($tdalign,$tdwidth);      my ($tdalign,$tdwidth);
     if ($allowed) {      if ($allowed) {
Line 4094  $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,$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 4128  $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 4160  $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 4198  $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 4225  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 4285  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 4297  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 4307  sub new_timebased_suffix { Line 3483  sub new_timebased_suffix {
         } elsif ($type eq 'smppg') {          } elsif ($type eq 'smppg') {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');              $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new simple page.');
         } else {          } else {
             $errtext = &mt('Failed to acquire a unique timestamp-based suffix for the new 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.');
         } 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 4384  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 4399  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 4448  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 4462  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 4517  sub list_symbs { Line 3667  sub list_symbs {
     $r->print(&endContentScreen());      $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 4560  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 4576  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 4597  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 4710  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 4735  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 4775  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 4802  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 4905  $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 4947  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 4994  sub handler { Line 4097  sub handler {
                'Adding_Folders','Docs_Overview', 'Load_Map',                 'Adding_Folders','Docs_Overview', 'Load_Map',
                'Supplemental','Score_Upload_Form','Adding_Pages',                 'Supplemental','Score_Upload_Form','Adding_Pages',
                'Importing_LON-CAPA_Resource','Importing_IMS_Course',                 'Importing_LON-CAPA_Resource','Importing_IMS_Course',
                        'Uploading_From_Harddrive','Course_Roster','Web_Page',                         'Uploading_From_Harddrive',
                        'Dropbox','Simple_Problem') {                 'Check_Resource_Versions','Verify_Content',
                          '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 5003  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 5010  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);
Line 5055  sub handler { Line 4140  sub handler {
       if ($folder eq '') {        if ($folder eq '') {
           $folder='default';            $folder='default';
       }        }
       &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath,$canedit);        &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath);
   } elsif ($allowed && $env{'form.versions'}) {    } elsif ($allowed && $env{'form.versions'}) {
       &init_breadcrumbs('versions','Check/Set Resource Versions','Docs_Check_Resource_Versions');        &init_breadcrumbs('versions','Check/Set Resource Versions');
       &checkversions($r,$canedit);        &checkversions($r);
   } elsif ($canedit && $env{'form.dumpcourse'}) {    } elsif ($allowed && $env{'form.dumpcourse'}) {
       &init_breadcrumbs('dumpcourse','Copy '.&Apache::loncommon::course_type().' Content to Authoring Space');        &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space');
       &dumpcourse($r);        &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {    } elsif ($allowed && $env{'form.exportcourse'}) {
       &init_breadcrumbs('exportcourse','IMS Export');        &init_breadcrumbs('exportcourse','IMS Export');
Line 5076  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 5106  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 5118  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 $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 5173  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 5195  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 5219  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]))[4]) {  
                 $folderurl .= '.page';  
             } else {  
                 $folderurl .= '.sequence';  
             }  
             unless (ref($navmap)) {  
                 $navmap = Apache::lonnavmaps::navmap->new();  
             }  
             if (ref($navmap)) {  
                 if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {  
                     my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);  
                     unless (@resources) {  
                         undef($env{'form.folderpath'});  
                     }  
                 }  
             }  
         }  
     }  
   
   
 # If after all of this, we still don't have any paths, make them  # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {      unless ($env{'form.folderpath'}) {
        if ($supplementalflag) {         if ($supplementalflag) {
           $env{'form.folderpath'}=&supplemental_base();            $env{'form.folderpath'}=&supplemental_base();
        } elsif ($allowed) {         } else {
           ($env{'form.folderpath'},$hiddentop) = &default_folderpath($coursenum,$coursedom,\$navmap);            $env{'form.folderpath'}='default&'.&escape(&mt('Main 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 5278  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 5294  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 5320  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 5333  sub handler { Line 4324  sub handler {
                 }                  }
             }              }
             my $tabidstr = join("','",@tabids);              my $tabidstr = join("','",@tabids);
             my $hostname = $r->hostname();      $script .= &editing_js($udom,$uname,$supplementalflag).
     $script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,  
                                    $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();                         &Apache::lonextresedit::extedit_javascript();
             $addentries = {              $addentries = {
                             onload   => "javascript:resize_scrollbox('contentscroll','1','1');",                              onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
Line 5355  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 5364  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 5418  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 5463  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 5483  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 5499  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 5550  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 5567  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 5592  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 5600  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 5621  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,$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 5693  HIDDENFORM Line 4598  HIDDENFORM
   
     if ($allowed) {      if ($allowed) {
        my $folder=$env{'form.folder'};         my $folder=$env{'form.folder'};
        if ((($folder eq '') && (!$hiddentop)) || ($supplementalflag)) {         if ($folder eq '' || $supplementalflag) {
            $folder='default';             $folder='default';
    $savefolderpath = $env{'form.folderpath'};     $savefolderpath = $env{'form.folderpath'};
    $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'));     $env{'form.folderpath'}='default&'.&escape(&mt('Main Content'));
Line 5717  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 5741  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 5768  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 5778  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 5798  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 5819  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 5843  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 5854  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 5873  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 5900  NGFFORM Line 4805  NGFFORM
             );              );
         }          }
         push(@importdoc,          push(@importdoc,
             {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}              {'<img class="LC_noBorder_LC_middle" src="/res/adm/pages/pdfupload.png" alt="'.$lt{upl}.'" onclick="javascript:toggleUpload(\'doc\');" />'=>$fileuploadform}
         );          );
         $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));          $fileuploadform =  &create_form_ul(&create_list_elements(@importdoc));
   
Line 5916  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 5935  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);
                               $canedit,\$navmap,$hiddentop);  
           undef($navmap);  
           if ($error) {            if ($error) {
              $r->print('<p><span class="LC_error">'.$error.'</span></p>');               $r->print('<p><span class="LC_error">'.$error.'</span></p>');
           }            }
           if ($hadchanges) {            if ($hadchanges) {
              unless (&is_hash_old()) {               &mark_hash_old();
                  &mark_hash_old();  
              }  
           }            }
   
           &changewarning($r,'');            &changewarning($r,'');
Line 5994  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 6004  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 $supnewsylform=(<<SNSFORM);   my $supnewsylform=(<<SNSFORM);
  <form action="/adm/coursedocs" method="post" name="supnewsyl">   <form action="/adm/coursedocs" method="post" name="supnewsyl">
Line 6013  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 6024  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 6051  SWEBFORM Line 4951  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},
   
Line 6073  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);
                                $canedit);  
            if ($error) {             if ($error) {
               $r->print('<p><span class="LC_error">'.$error.'</span></p>');                $r->print('<p><span class="LC_error">'.$error.'</span></p>');
            } else {  
                if ($suppchanges) {  
                    my %servers = &Apache::lonnet::internet_dom_servers($coursedom);  
                    my @ids=&Apache::lonnet::current_machine_ids();  
                    foreach my $server (keys(%servers)) {  
                        next if (grep(/^\Q$server\E$/,@ids));  
                        my $hashid=$coursenum.':'.$coursedom;  
                        my $cachekey = &escape('suppcount').':'.&escape($hashid);  
                        &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);  
                    }  
                    &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);  
                    undef($suppchanges);  
                }  
            }             }
         }          }
     } elsif ($supplementalflag) {      } elsif ($supplementalflag) {
Line 6128  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 6149  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 6173  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 6241  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 6287  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',
                                          '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 6326  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 6345  sub generate_admin_menu { Line 5214  sub generate_admin_menu {
                     linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"                      linktitle  => "List the unique identifier used for each resource instance in your $lc_crstype"
                 },                  },
                 ]                  ]
         });          },
     if ($canedit) {  
         push(@menu,  
         {   categorytitle=>'Export',          {   categorytitle=>'Export',
             items =>[              items =>[
                 {   linktext   => $lt{'imse'},                  {   linktext   => $lt{'imse'},
Line 6360  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 6375  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 6417  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 6448  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 6474  END Line 5339  END
 }  }
   
 sub editing_js {  sub editing_js {
     my ($udom,$uname,$supplementalflag,$coursedom,$coursenum,      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 6486  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 6515  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 6537  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 =~ /^([^#]+)#([^#]+)$/) {  
                     $url = $1;  
                     $anchor = $2;  
                     if (($caller =~ m{^([^#]+)\Q#$anchor\E$})) {  
                         $caller = $1.&escape('#').$anchor;  
                     }  
                 } else {  
                     $url = $res;  
                 }  
                 $backtourl = &HTML::Entities::encode(&Apache::lonnet::clutter($url),'<>&"').'?symb='.  
                              &HTML::Entities::encode($caller,'<>&"');                               &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 6593  sub editing_js { Line 5420  sub editing_js {
         $fieldsets = "'suppext','suppdoc'";          $fieldsets = "'suppext','suppdoc'";
     }      }
   
     my $jsmakefunctions;      return <<ENDNEWSCRIPT;
     if ($canedit) {  
         $jsmakefunctions = <<ENDNEWSCRIPT;  
 function makenewfolder(targetform,folderseq) {  function makenewfolder(targetform,folderseq) {
     var foldername=prompt('$js_lt{"p_mnf"}','$js_lt{"t_mnf"}');      var foldername=prompt('$lt{"p_mnf"}','$lt{"t_mnf"}');
     if (foldername) {      if (foldername) {
        targetform.importdetail.value=escape(foldername)+"="+folderseq;         targetform.importdetail.value=escape(foldername)+"="+folderseq;
         targetform.submit();          targetform.submit();
Line 6605  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 6613  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 6622  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 6631  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 6639  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 6655  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 6664  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 6673  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 6809  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 6834  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 6984  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 7027  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 7113  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 7149  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 7227  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 7253  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 7298  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 7313  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 7416  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 7444  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 7535  function setBoxes(value) { Line 6240  function setBoxes(value) {
     return;      return;
 }  }
   
 ENDSCRIPT  ENDNEWSCRIPT
 }  }
   
 sub history_tab_js {  sub history_tab_js {
Line 7564  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?',  
     );  
     my %html_js_lt = &Apache::lonlocal::texthash(  
         swit => 'Switch server?',          swit => 'Switch server?',
         duco => 'Copying Content to Authoring Space',          duco => 'Dump content to Authoring Space',
         yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',          yone => 'You need to switch to a server housing an Authoring Space for which you are author or co-author.',
         chos => 'Choose server',          chos => 'Choose server',
     );      );
     &js_escape(\%js_lt);  
     &html_escape(\%html_js_lt);  
     &js_escape(\%html_js_lt);  
     my $role = $env{'request.role'};      my $role = $env{'request.role'};
     my $js = <<"ENDSWJS";      my $js = <<"ENDSWJS";
 <script type="text/javascript">  <script type="text/javascript">
Line 7617  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 7628  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 7764  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.82  
changed lines
  Added in v.1.556


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.